K-fold 교차검증

data를 train, test로 나눈 뒤,

train을 또다시 k개로 나누어 k-1개의 train set과 1개의 validation set으로 나누어 train에서 학습하고

validation으로 검증,

그리고 이 validation data를 다른 train set으로 바꾸어 다시 학습, 검증... 하여 만들어진 모델로 test data를 테스트.

 

import numpy as np

from sklearn.model_selection import train_test_split

from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression

from sklearn.model_selection import KFold

 

필요한 모듈 import

 

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

 

sklearn에서 불러온 load_boston 데이터를, return_X_y인자값을 True로 주어 X, y로 분리한다.

test_size와 random_state를 설정하여 train_test_split메소드를 이용해 train, test값으로 분리. 

분리될 때 X가 먼저 train/test로 분리되고 y가 train/test로 분리되는 순서.

 

def kfold_regression(train_X, train_y):

    model = LinearRegression()
    
    n_iter = 0
    
    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)
        
        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

 

모델을 설정하고,

반복문 내에서 반복 횟수 표현 위한 변수 설정.

각 fold마다의 검증 점수 저장하려는 리스트인 model_scores 리스트 생성.

kfold를 sklearn의 KFold모듈(k가 5인)로 선언

<반복문>

train_X를 kfold를 이용해 나눈 후, 그 안에서 반복문을 돌리는데

train_X의 train_idx번째와 val_idx번째를 각각 X_train, X_val 변수에 저장. y도 동일

아까 설정한 모델을 train데이터에 맞게 학습시키고,

validation data에 대해 모델 검증 점수를 score변수에 저장하고, 이를 model_scores에 append 한다.

 

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))
    

    
if __name__ == "__main__":
    main()

 

 

참고 : LG Aimers