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단계: 데이터 생성

다음으로 두 개의 예측 변수 x1x2 와 단일 응답 변수 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 교차 검증

의견을 추가하다

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다