<머신러닝 • 딥러닝 문제해결 전략> 5장의 내용을 실습했습니다.
모델을 훈련만 하고, 성능을 검증해 보지 않으면 두가지 문제가 발생할 수 있습니다.
첫째, 모델이 과대적합될 가능성이 있다. 둘째, 제출 전까지 모델성능을 확인하기 어렵다.
이러한 문제를 막기 위해서 교차검증을 해야합니다.
교차검증이란 훈련데이터를 여러 그룹으로 나누어 일부는 훈련 시, 일부는 검증 시 사용하여 모델 성능을 측정하는 기법입니다.
K 폴드 교차 검증
일반적인 교차 검증 기법으로,
전체 훈련 데이터를 K개의 그룹으로 나누고 1개를 검증 데이터로, K-1개를 훈련데이터로 지정 후 평가합니다.
이 과정을 K번 구하고 평균을 구해 최종 평가 점수를 도출합니다.
K폴드 교차 검증 시 데이터가 어떻게 나뉘는지 실습했습니다.
import numpy as np
from sklearn.model_selection import KFold # KFold: 데이터를 K 폴드로 나누는 함수
data = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
folds = KFold(n_splits=5, shuffle=False) # n_splits 파라미터에 전달하는 값이 k값
for train_idx, valid_idx in folds.split(data):
print(f'훈련데이터: {data[train_idx]}, 검증데이터: {data[valid_idx]}')
folds = KFold(n_splits=5, shuffle=True) # shuffle = True : 폴드로 나누기전 데이터 섞어줌
for train_idx, valid_idx in folds.split(data):
print(f'훈련 데이터: {data[train_idx]}, 검증 데이터: {data[valid_idx]}')
층화 K 폴드 교차 검증
타깃값이 골고루 분포되게 폴드를 나누는 방법이다.
그래서 타깃값이 불균형하게 분포되어 있는 경우 '층화 K 폴드 교차 검증'을 사용한다.
예를 들어 일반 메일과 스팸 메일을 분류하는 경우에
스팸 메일의 개수가 적을 경우 특정 폴드에는 스팸이 아예 없을 수도 있다.
이럴 경우 스팸데이터 없이 모델을 훈련하면 스팸 예측을 제대로 수행하지 못하게 된다.
이처럼 특정 타깃값아 다른 타깃값보다 적은 경우에 '층화 K 폴드 교차 검증'을 사용한다.
K폴드는 특정 타깃값을 모든 폴드에 골고루 균일하게 분배해서 교차 검증을 수행합니다.
(회귀문제의 경우 타깃값이 연속된 값이기에 균등한 비율로 분배하는 것이 불가능하다.
그렇기에 층화 K 폴드 교차 검증은 분류 문제에만 사용된다.)
y = np.array(['스팸']*5 + ['일반']*45)
folds = KFold(n_splits=5, shuffle=True)
for idx, (train_idx, valid_idx) in enumerate(folds.split(y)):
print(f'Fold {idx+1} 검증 데이터 타깃값:')
print(y[valid_idx], '\n')
3번째 폴드에는 스팸이 하나도 없다. 이럴 경우 3번째 폴드에선 스팸 메일에 대한 훈련이 아예 되어있지 않다.
모든 폴드에 골고루 스팸데이터가 분포되길 원할 경우 층화 K 폴드를 사용하면 된다.
from sklearn.model_selection import StratifiedKFold
X = np.array(range(50))
y = np.array(['스팸']*5 + ['일반']*45) # 층화 K 폴드 교차 검증
folds = StratifiedKFold(n_splits=5)
for idx, (train_idx, valid_idx) in enumerate(folds.split(X, y)):
print(f'Fold {idx+1} 검증 데이터 값:')
print(y[valid_idx], '\n')
모든 폴드에 스팸이 균일하게 1개씩 분배되었음을 알 수 있다.
'Data > MLDL' 카테고리의 다른 글
범주형 경진대회 이진분류 (0) | 2022.10.31 |
---|---|
자전거 대여 수요 예측(2) (0) | 2022.09.26 |
자전거 수요 예측 경진대회 (0) | 2022.09.26 |
하이퍼파라미터 최적화 (0) | 2022.09.19 |
주요 머신러닝 모델 (0) | 2022.09.19 |