k겹 교차 검증(k-fold cross validation)
- 데이터셋을 여러 개로 나누어 하나씩 테스트셋으로 사용하고 나머지를 모두 합해서 학습셋으로 사용
- 가지고 있는 데이터의 100%를 학습셋으로 사용할 수 있고, 동시에 테스트셋으로도 사용 가능
- 데이터셋을 k개로 나눈 후 그 중 k-1개를 학습셋으로, 1개를 테스트셋으로 만들어 k번의 학습을 순차적으로 실시
5겹 교차 검증 예제 - 초음파 광물 예측 데이터
- 초음파 광물 예측 데이터 분석은 https://codingmoding.tistory.com/93 여기서 확인!
1. 환경 및 데이터 준비
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from sklearn.model_selection import KFold
from sklearn.metrics import accuracy_score
import pandas as pd
# 데이터 입력
df = pd.read_csv('./data/sonar3.csv', header=None)
# 음파 관련 속성을 X로, 광물의 종류를 y로 저장
X = df.iloc[:,0:60]
y = df.iloc[:,60]
2. 5겹 교차 검증 준비
- KFold()
: 데이터를 원하는 수만큼 나누어 각각 학습셋과 테스트셋으로 사용
: sklearn에 존재
- n_splits : 몇 개의 파일로 나눌 것인지 결정하는 옵션
- shuffle : 샘플이 치우치지 않도록 섞어주는 옵션
# 몇 겹으로 나눌 것인지를 결정
k=5
# KFold 함수를 불러옴. 분할하기 전에 샘플이 치우치지 않도록 섞어 줌
kfold = KFold(n_splits=k, shuffle=True)
#정확도가 채워질 빈 리스트를 준비합니다.
acc_score = []
3. 모델 구조 설정
def model_fn():
model = Sequential()
model.add(Dense(24, input_dim=60, activation='relu'))
model.add(Dense(10, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
return model
4. 5겹 교차 검증 실행
# for문에 의해서 k번 반복 spilt()에 의해 k개의 학습셋, 테스트셋으로 분리됨
for train_index , test_index in kfold.split(X):
X_train , X_test = X.iloc[train_index,:], X.iloc[test_index,:]
y_train , y_test = y.iloc[train_index], y.iloc[test_index]
model = model_fn()
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
history = model.fit(X_train, y_train, epochs=200, batch_size=10, verbose=0)
accuracy = model.evaluate(X_test, y_test)[1] #정확도를 구함
acc_score.append(accuracy) #정확도 리스트에 저장
5. 모델 성능 평가
# k번 실시된 정확도의 평균 구함
avg_acc_score = sum(acc_score)/k
# 결과 출력
print('정확도:', acc_score)
print('정확도 평균:', avg_acc_score)
정확도: [0.78571427, 0.78571427, 0.85714287, 0.8292683, 0.8292683]
정확도 평균: 0.8174215912818908
- 5번의 정확도를 평균으로 나타낸 것이 최종 결과
'모두의 딥러닝 개정 3판'의 내용과 https://github.com/taehojo/deeplearning의 코드 참고
'AI > 모두의 딥러닝' 카테고리의 다른 글
[모두의 딥러닝] 19. 결측치 처리, 속성별 관련도 추출 - 부동산 가격 예측 데이터 (0) | 2023.05.29 |
---|---|
[모두의 딥러닝] 18. 에포크(epochs), 과적합 그래프, 학습 자동 중단 - 와인 품질 예측 데이터 (0) | 2023.05.29 |
[모두의 딥러닝] 16. 과적합(overfitting), 테스트셋 구분, 모델 저장과 재사용 - 초음파 광물 예측 데이터 (0) | 2023.05.26 |
[모두의 딥러닝] 15. 원 - 핫 인코딩, 소프트맥스(softmax) - 아이리스(iris) 품종 데이터(다중 분류) (0) | 2023.05.25 |
[모두의 딥러닝] 14. 피마 인디언 당뇨병 예측 데이터 분석(pandas, seaborn 라이브러리 사용) (0) | 2023.05.24 |