Python의 k-fold 교차 검증(단계별)
데이터 세트에 대한 모델의 성능을 평가하려면 모델의 예측이 관찰된 데이터와 얼마나 잘 일치하는지 측정해야 합니다.
이를 수행하기 위해 일반적으로 사용되는 방법은 다음 접근 방식을 사용하는 k-겹 교차 검증 으로 알려져 있습니다.
1. 데이터 세트를 대략 동일한 크기의 k개 그룹, 즉 “접기”로 무작위로 나눕니다.
2. 접힌 부분 중 하나를 구속 세트로 선택합니다. 템플릿을 나머지 k-1 접기로 조정합니다. 인장된 플라이의 관찰에 대한 MSE 테스트를 계산합니다.
3. 매번 다른 세트를 제외 세트로 사용하여 이 프로세스를 k 번 반복합니다.
4. k개의 테스트 MSE의 평균으로 전체 테스트 MSE를 계산합니다.
이 튜토리얼에서는 Python에서 특정 모델에 대해 k-겹 교차 검증을 수행하는 방법에 대한 단계별 예를 제공합니다.
1단계: 필요한 라이브러리 로드
먼저 이 예제에 필요한 함수와 라이브러리를 로드합니다.
from sklearn. model_selection import train_test_split
from sklearn. model_selection import KFold
from sklearn. model_selection import cross_val_score
from sklearn. linear_model import LinearRegression
from numpy import means
from numpy import absolute
from numpy import sqrt
import pandas as pd
2단계: 데이터 생성
다음으로 두 개의 예측 변수 x1 및 x2 와 단일 응답 변수 y를 포함하는 pandas DataFrame을 만듭니다.
df = pd.DataFrame({' y ': [6, 8, 12, 14, 14, 15, 17, 22, 24, 23],
' x1 ': [2, 5, 4, 3, 4, 6, 7, 5, 8, 9],
' x2 ': [14, 12, 12, 13, 7, 8, 7, 4, 6, 5]})
3단계: K-폴드 교차 검증 수행
다음으로 다중 선형 회귀 모델을 데이터 세트에 맞추고 LOOCV를 수행하여 모델 성능을 평가합니다.
#define predictor and response variables
X = df[[' x1 ', ' x2 ']]
y = df[' y ']
#define cross-validation method to use
cv = KFold ( n_splits = 10 , random_state = 1 , shuffle = True )
#build multiple linear regression model
model = LinearRegression()
#use k-fold CV to evaluate model
scores = cross_val_score(model, X, y, scoring=' neg_mean_absolute_error ',
cv=cv, n_jobs=-1)
#view mean absolute error
mean(absolute(scores))
3.6141267491803646
그 결과, 평균절대오차(MAE)가 3.614 임을 알 수 있습니다. 즉, 모델 예측과 실제 관찰된 데이터 간의 평균 절대 오차는 3.614입니다.
일반적으로 MAE가 낮을수록 모델이 실제 관측치를 더 잘 예측할 수 있습니다.
모델 성능을 평가하기 위해 일반적으로 사용되는 또 다른 측정항목은 RMSE(평균 제곱근 오차)입니다. 다음 코드는 LOOCV를 사용하여 이 측정항목을 계산하는 방법을 보여줍니다.
#define predictor and response variables
X = df[[' x1 ', ' x2 ']]
y = df[' y ']
#define cross-validation method to use
cv = KFold ( n_splits = 5 , random_state = 1 , shuffle = True )
#build multiple linear regression model
model = LinearRegression()
#use LOOCV to evaluate model
scores = cross_val_score(model, X, y, scoring=' neg_mean_squared_error ',
cv=cv, n_jobs=-1)
#view RMSE
sqrt(mean(absolute(scores)))
4.284373111711816
결과에서 RMSE(제곱평균제곱근 오차)가 4.284 임을 알 수 있습니다.
RMSE가 낮을수록 모델이 실제 관측치를 더 잘 예측할 수 있습니다.
실제로 우리는 일반적으로 여러 가지 모델을 적합하고 각 모델의 RMSE 또는 MAE를 비교하여 테스트 오류율이 가장 낮은 모델을 결정하므로 사용하기에 가장 좋은 모델입니다.
또한 이 예에서는 k=5 폴드를 사용하기로 선택했지만 원하는 만큼의 폴드 수를 선택할 수 있습니다.
실제로 우리는 일반적으로 5~10겹 사이를 선택합니다. 이는 신뢰할 수 있는 테스트 오류율을 생성하는 최적의 플라이 수임이 입증되었기 때문입니다.
여기에서 sklearn의 KFold() 함수에 대한 전체 문서를 찾을 수 있습니다.
추가 리소스
K-폴드 교차 검증 소개
Python의 선형 회귀에 대한 완전한 가이드
Python의 Leave-One-Out 교차 검증