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
'AI > 기계학습' 카테고리의 다른 글
머신러닝과 딥러닝의 차이 (0) | 2024.05.20 |
---|---|
회귀 총정리 (0) | 2024.05.13 |
회귀 알고리즘 평가 지표 RSS, MSE, MAE, R^2 (0) | 2024.05.12 |
릿지(Ridge), 라쏘(Lasso), 엘라스틱넷(ElasticNet) 회귀 (0) | 2024.05.11 |
if __name__ == '__main__': 의 의미는? (0) | 2024.05.11 |