Skip to main content

교차 검증

교차 검증 cross validation

  • '훈련 데이터셋'을 이용해 추정 후, 별개의 '테스트 데이터셋'을 이용하여 모형의 예측 성능을 검증하는 방법
  • 수정R제곱, AIC, BIC 등은 이론적 보정이므로 과적합을 정확히 반영 못함
  • 데이터가 충분히 많다면, 데이터를 여러 개의 셋으로 나누어 교차 검증
  • 한 데이터셋의 분석 결과를 다른 데이터셋에 적용하여 예측 오차를 확인 (예측 오차가 적은 모형이 좋은 모형)
  • 이론적 가정에 의존하지 않으므로 데이터가 충분히 많을 때는 교차 검증을 권장

교차 검증의 종류

  • 데이터를 훈련 데이터와 테스트 데이터로 분할
  • 모형을 훈련 데이터에 적합시켜, 테스트 데이터를 예측
  • LpO CV (Leave-p-out): p개를 제외한 모든 사례로 추정에 사용
    • p개는 가능한 모든 방법으로 조합
    • 조합이 지나치게 많아 비현실적
  • LOOCV (Leave-one-out): p = 1인 경우. 데이터가 N개이면 N번 검증
  • k-fold: 데이터를 크게 k개의 셋으로 나눔. 한 셋 씩 테스트셋으로 사용. k번 교차검증
  • holdout: 데이터를 훈련 셋과 테스트 셋으로 한 번만 나누어 1회 교차 검증

교차 검증의 결과

훈련 오차테스트 오차상태조치
높음높음과소적합 (Underfitting)모형 복잡하게 수정
낮음낮음적절바람직
낮음높음과적합 (Overfitting)모형 단순하게 수정

Python 교차 검증

  • 임포트
from sklearn.model_selection import train_test_split
  • 분할
train_df, test_df = train_test_split(
df, # 원자료
test_size=0.2, # 테스트 데이터의 비율(0.2 = 20%)
random_state=42) # 난수 생성의 seed를을 고정(동일한 분할을 위해)

Python 교차 검증

  • 훈련 데이터로 분석
m = ols('price ~ year', train_df).fit()
  • 테스트 데이터로 예측
y_pred = m.predict(test_df)
  • 잔차 분산
from sklearn.metrics import mean_squared_error
mean_squared_error(test_df.price, y_pred)

교차 검증을 이용한 단계적 회귀분석

  • 전진 선택
m = varsel.forward_selection_with_cv(
'price ~ year + mileage + model + my_car_damage + other_car_damage',
train_df, test_df)
m.summary()
  • 후진 선택
m = varsel.backward_selection_with_cv(
'price ~ year + mileage + model + my_car_damage + other_car_damage',
train_df, test_df)
m.summary()

퀴즈