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