본문 바로가기
Machine Learning/scikit-learn

[교차 검증] K-폴드 교차 검증

by ISLA! 2023. 8. 17.

교차 검증

 

  • 교차검증은 여러 세트로 구성된 학습 데이터 세트와 검증 데이터 세트에서 학습과 평가를 수행하는 것이다.
  • 각 세트에서 수행한 평가 결과에 따라 하이퍼 파라미터 튜닝 등의 모델 최적화를 더욱 손쉽게 할 수 있다.
  • 대부분의 ML 모델의 성능 평가는 (1)교차 검증 기반의 1차 평가 후, (2)테스트 데이터 세트에 적용해 평가하는 프로세스이다.
  • 교차 검증을 통해 과적합 문제도 개선할 수 있다.

 

K-폴드 교차 검증

 

 

  • 가장 보편적으로 사용되는 교차 검증 기법
  • K개의 데이터 폴드 세트를 만들어서, K번만큼 각 폴드 세트에 학습과 검증 평가를 반복적으로 수행하는 방법
  • 위 예시 이미지에서는 5번의 교차 검증 결과를 평균한 결과로 예측을 수행하게 된다.

 

📑 예제

1. 5개의 폴드 세트로 iris 데이터 분리

  • kfold 객체 생성
  • 폴드 세트별 정확도를 담을 리스트 객체 생성
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
from sklearn.model_selection import KFold
import numpy as np

iris = load_iris()
features = iris.data
label = iris.target
dt_clf = DecisionTreeClassifier(random_state = 11)

# 5개의 폴드 세트로 분리
kfold = KFold(n_splits=5)
cv_accuracy = []

print('붓꽃 데이터 세트 크기: ', features.shape[0])

 

2. k폴드 객체의 split()을 호출하여 학습용/검증용 데이터의 row index를 array로 반환

  • 생성된 kfold 객체의 split() 을 호출해 전체 데이터를 5개 폴드 데이터 세트로 분리
  • split()을 호출하면 학습용/검증용 데이터로 분할할 수 있는 인덱스를 반환
  • 실제로 학습용/검증용 데이터 추출은 반환된 인덱스를 기반으로 개발 코드에서 직접 수행해야 함!
for train_index, test_index in kfold.split(features):
	X_train, X_test = features[train_index], features[test_index]
    y_train, y_test = label[train_index], label[test_index]
    
    
    # 학습 및 예측
    dt_clf.fit(X_train, y_train)
    pred = dt_clf.predict(X_train)
    n_iter += 1
    
    # 반복시마다 정확도 측정
    accuracy = np.round(accuracy_score(y_test, pred), 4)
    train_size = X_train.shape[0]
    test_size = X_test.shape[0]
    
    print('\n#{0} 교차 검증 정확도 :{1}, 학습 데이터 크기: {2}, 검증 데이터 크기: {3}'
          .format(n_iter, accuracy, train_size, test_size))
    print('#{0} 검증 세트 인덱스:{1}'.format(n_iter,test_index))
    
    cv_accuracy.append(accuracy)
    
   print("\n##평균 검증 정확도", np.mean(cv_accuracy))

 

📑 결과

결과

728x90