Python의 leave-one-out 교차 검증(예제 포함)


데이터 세트에 대한 모델의 성능을 평가하려면 모델의 예측이 관찰된 데이터와 얼마나 잘 일치하는지 측정해야 합니다.

이를 수행하기 위해 일반적으로 사용되는 방법은 다음 접근 방식을 사용하는 Leave-One-Out Cross-Validation(LOOCV) 이라고 합니다.

1. 훈련 세트의 일부로 하나의 관측치를 제외한 모든 관찰을 사용하여 데이터 세트를 훈련 세트와 테스트 세트로 분할합니다.

2. 훈련 세트의 데이터만 사용하여 모델을 만듭니다.

3. 모델을 이용하여 모델에서 제외된 관측값의 반응값을 예측하고 평균제곱오차(MSE)를 계산합니다.

4. 이 과정을 n 번 반복합니다. 모든 테스트 MSE의 평균으로 테스트 MSE를 계산합니다.

이 튜토리얼에서는 Python에서 특정 모델에 대해 LOOCV를 실행하는 방법에 대한 단계별 예를 제공합니다.

1단계: 필요한 라이브러리 로드

먼저 이 예제에 필요한 함수와 라이브러리를 로드합니다.

 from sklearn. model_selection import train_test_split
from sklearn. model_selection import LeaveOneOut
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단계: Leave-One-Out 교차 검증 수행

다음으로 다중 선형 회귀 모델을 데이터 세트에 맞추고 LOOCV를 수행하여 모델 성능을 평가합니다.

 #define predictor and response variables
X = df[[' x1 ', ' x2 ']]
y = df[' y ']

#define cross-validation method to use
cv = LeaveOneOut()

#build multiple linear regression model
model = LinearRegression()

#use LOOCV 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.1461548083469726

그 결과 평균절대오차(MAE)가 3.146 임을 알 수 있다. 즉, 모델 예측과 실제 관찰된 데이터 간의 평균 절대 오차는 3.146입니다.

일반적으로 MAE가 낮을수록 모델이 실제 관측치를 더 잘 예측할 수 있습니다.

모델 성능을 평가하기 위해 일반적으로 사용되는 또 다른 측정항목은 RMSE(평균 제곱근 오차)입니다. 다음 코드는 LOOCV를 사용하여 이 측정항목을 계산하는 방법을 보여줍니다.

 #define predictor and response variables
X = df[[' x1 ', ' x2 ']]
y = df[' y ']

#define cross-validation method to use
cv = LeaveOneOut()

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

3.619456476385567

결과에서 RMSE(제곱평균제곱근 오차)가 3.619 임을 알 수 있습니다. RMSE가 낮을수록 모델이 실제 관측치를 더 잘 예측할 수 있습니다.

실제로 우리는 일반적으로 여러 가지 모델을 적합하고 각 모델의 RMSE 또는 MAE를 비교하여 테스트 오류율이 가장 낮은 모델이 가장 적합한 모델인지 결정합니다.

추가 리소스

Leave-One-Out 교차 검증(LOOCV)에 대한 빠른 소개
Python의 선형 회귀에 대한 완전한 가이드

의견을 추가하다

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