logo

교차 검증

교차 검증

교차 검증 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()