교차 검증이란?
과적합 방지를 위해 데이터를 분리하는 방법
k-fold 교차 검증
학습용 데이터를 계속 변경하며 모델을 훈련시키는 방법
k-fold 교차 검증 순서
- K를 설정하여 데이터 셋을 K개로 나눔
- K개 중 한 개를 검증용, 나머지를 학습용으로 사용
- 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()
출처: 앨리스 교육
반응형