기록하기

[모두의 딥러닝] K겹 교차 검증 본문

AI 수업

[모두의 딥러닝] K겹 교차 검증

_parkdaxun 2023. 4. 24. 10:55

K겹교차 검증이 무엇일까요?

데이터셋을 여러 개로 나누어 하나씩 테스트셋으로 사용하고 나머지를 모두 합해서 학습셋으로 사용하는 방법입니다. 이렇게 하면 가지고 있는 데이터의 100%를 학습셋으로 사용할 수 있고, 또 동시에 테스트셋으로도 사용할 수 있습니다. 

 

 

K겹교차 검증은 어떻게 사용할 수 있나요?

데이터넷을 다섯 개로 나눈 후 그중 네 개를 학습셋으로, 나머지 하나를 테스트셋으로 만들어서 다섯 번의 학습을 순차적으로 실시하는 것이 5겹 교차 검증입니다. 이제 초음파 광물 예측 예제를 통해 5겹 검증을 실시해 보겠습니다. 데이터를 원하는 수만큼 나누어 각각 학습셋과 테스트셋으로 사용되게 하는 함수는 사이킷런 라이브러리의 KFold() 함수입니다. 실습 코드에서 KFold()를 활용하는 부분만 뽑아 보면 다음과 같습니다.

 

k = 5
kfold = KFold(n_splits=k, shoffle=True)
acc_score = []

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]

 

K겹교차 검증으로 코드 업그레이드하기

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from sklearn.metrics import accuracy_score
from sklearn.model_selection import GroupKFold

import pandas as pd
!git clone https://github.com/taehojo/data.git


df = pd.read_csv('./data/sonar3.csv', header=None)

X = df.iloc[:,0:60]
y = df.iloc[:,60]

k = 5

kfold = KFold(n_splits=k, shoffle=True)
acc_score = []

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, shuffle=True)

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

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.comile(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)

avg_acc_score = sum(acc_score) / k

print('정확도: ', acc_score)
print('정확도 평균: ', avg_acc_score)