AI/MachineLearning

과적합 방지 기법 - 교차 검증

향식이 2021. 6. 4. 09:53

교차 검증이란?

과적합 방지를 위해 데이터를 분리하는 방법

k-fold 교차 검증 

학습용 데이터를 계속 변경하며 모델을 훈련시키는 방법

k-fold 교차 검증 순서 

  1. K를 설정하여 데이터 셋을 K개로 나눔
  2. K개 중 한 개를 검증용, 나머지를 학습용으로 사용
  3. K개 모델의 평균 성능 확인

K-fold 교차 검증을 위한 사이킷런 함수/라이브러리 

  • KFold(n_splits)
    • n_splits : 분리할 데이터(fold) 개수
  • [KFold].split(X)
    • 실제로 데이터를 분리하기 위한 인덱스를 반환합니다.
    • X : 분리하고자 하는 데이터 
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression

# sklearn의 KFold 모듈
from sklearn.model_selection import KFold

def load_data():
    
    X, y = load_boston(return_X_y = True)
    
    train_X, test_X, train_y, test_y = train_test_split(X, y, test_size=0.2, random_state=100)
    
    return train_X, test_X, train_y, test_y
    
def kfold_regression(train_X, train_y):
    
    model = LinearRegression()
    
    # 반복문 내에서 횟수를 표시하기 위한 변수 설정하기
    n_iter = 0
    
    # 각 fold 마다 모델 검증 점수를 저장하기 위한 빈 리스트 생성하기
    model_scores = []
    
    kfold = KFold(n_splits=5)
    
    for train_idx, val_idx in kfold.split(train_X):
        
        X_train, X_val =  train_X[train_idx], train_X[val_idx]
        y_train, y_val =  train_y[train_idx], train_y[val_idx]
        
        model.fit(X_train, y_train)
        
        # 각 Iter 별 모델 평가 점수 측정
        score = model.score(X_val, y_val)
        
        # 학습용 데이터의 크기를 저장합니다.
        train_size = X_train.shape[0]
        val_size = X_val.shape[0]
    
        print("Iter : {0} Cross-Validation Accuracy : {1}, Train Data 크기 : {2}, Validation Data 크기 : {3}"
              .format(n_iter, score, train_size, val_size))
    
        n_iter += 1
        
        # 전체 모델 점수를 저장하는 리스트에 추가하기
        model_scores.append(score)
        
    return kfold, model, model_scores
        
        
def main():
    
    # 학습용 데이터와 테스트 데이터 불러오기
    train_X, test_X, train_y, test_y = load_data()
    
    # KFold 교차 검증을 통한 학습 결과와 회귀 모델을 반환하는 함수 호출하기
    kfold, model, model_scores = kfold_regression(train_X, train_y)
    
    # 전체 성능 점수의 평균 점수 출력
    print("\n> 평균 검증 모델 점수 : ", np.mean(model_scores))
    
    # 테스트 데이터에 대한 모델 성능 점수 출력
    print("> 테스트 데이터 모델 점수 : ", model.score(test_X,test_y))

    
if __name__ == "__main__":
    main()

출처: 앨리스 교육

반응형