[모두의 딥러닝] 17. k겹 교차 검증(k-fold cross validation) - 초음파 광물 예측 데이터

k겹 교차 검증(k-fold cross validation)

- 데이터셋을 여러 개로 나누어 하나씩 테스트셋으로 사용하고 나머지를 모두 합해서 학습셋으로 사용

- 가지고 있는 데이터의 100%를 학습셋으로 사용할 수 있고, 동시에 테스트셋으로도 사용 가능

- 데이터셋을 k개로 나눈 후 그 중 k-1개를 학습셋으로, 1개를 테스트셋으로 만들어 k번의 학습을 순차적으로 실시

5겹 교차 검증

 

 

 

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겹 교차 검증이므로 5번 반복 실행

 

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의 코드 참고