[PYTHON - 머신러닝_캐글_교차검증]★K-폴드 교차검증★충화 K-폴드 교차검증★folds.split(data)★
1. 교차검증
==> 일반적으로 훈련 데이터로 모델을 훈련하고, 테스트 데이터로 예측해 모델 성능을 측정한다.
==> 모델을 훈련만 하고, 성능을 검증해 보지 않으면 2가지 문제 발생
㉠ 모델이 과대적합될 가능성이 있다.
㉡ 제출 전까지 모델 성능을 확인하기 어렵다.
==> 교차 검증은 훈련 데이터를 여러 그룹으로 나누어 일부는 훈련 시 사용하고, 일부는 검증 시 사용해서 모델 성능을 측정하는 기법이다.
2. K 폴드 교차검증
https://knowallworld.tistory.com/376
데이터를 특정 개수(K개) 로 쪼개어서 그중 하나씩을 선택하여 시험셋으로 사용하되, 이 과정을 K번만큼 반복
이터레이션 1
훈련 셋 | 훈련 셋 | 훈련 셋 | 훈련 셋 | 시험 셋 |
이터레이션 2
훈련 셋 | 훈련 셋 | 훈련 셋 | 시험 셋 | 훈련 셋 |
이터레이션 3
훈련 셋 | 훈련 셋 | 시험 셋 | 훈련 셋 | 훈련 셋 |
이터레이션 4
훈련 셋 | 시험 셋 | 훈련 셋 | 훈련 셋 | 훈련 셋 |
이터레이션 5
시험 셋 | 훈련 셋 | 훈련 셋 | 훈련 셋 | 훈련 셋 |
==> 이터레이션(반복)은 모델링을 수행하는 단위 이다.
==> 이터레이션의 평가값(오차)의 평균값을 내어 RMSE를 도출한다.
import numpy as np
from sklearn.model_selection import KFold
data = np.array([0,1,2,3,4,5,6,7,8,9])
folds = KFold(n_splits= 5 ,shuffle= False)
for train_idx , valid_idx in folds.split(data):
print(f'훈련 데이터 : {data[train_idx]} , 검증 데이터 : {data[valid_idx]}')
folds = KFold(n_splits= 5 , shuffle= True)
for train_idx , valid_idx in folds.split(data):
print(f'훈련 데이터 : {data[train_idx]} , 검증 데이터 : {data[valid_idx]}')
3. 충화 K 폴드 교차검증(Stratified K-Fold Cross Validation)
==> 타깃값이 골고루 분포되게 폴드를 나누는 K-폴드 교차 검증 방법이다.
==> 타깃값이 불균형하게 분포되어 있는 경우 충화 K 폴드를 사용하는 것이 좋다.
EX) 일반 메일과 스펨 메일을 분류하는 문제 : 받은 메일이 1000개 , 스팸은 단 10개
==> 스팸이 10개 밖에 안되어 K 폴드 교차검증을 해도 특정 폴드에는 스팸메일이 없을 수 있다.
==> 특정 타깃값이 다른 타깃값보다 굉장히 적은 경우에 충화 K-폴드 교차검증을 사용한다.
==> 스팸 데이터를 모든 폴드에 균등하게(2개씩 , 5개 폴드) 나눈다.
y = np.array(['스팸']*5 + ['일반']*45)
# print(y)
folds = KFold(n_splits=5 , shuffle= True) # 5개의 폴드로 섞어서 출력
for idx , (train_idx , valid_idx) in enumerate(folds.split(y)):
print(f'Fold {idx+1} 검증 데이터 타깃값 : ')
print(y[valid_idx] , '\n')
==> Fold2에 스팸 메일이 없어서 스팸메일에 대한 훈련이 아예 안될 것이다.
from sklearn.model_selection import StratifiedKFold
X = np.array(range(50))
y = np.array(['스팸']*5 + ['일반'] *45)
folds = StratifiedKFold(n_splits=5) # 충화 K 폴드 교차검증
for idx , (train_idx , valid_idx) in enumerate(folds.split(X,y)): # split()에는 임의로 K개로 분할하기 때문에 피처와 타깃값 모두를 전달해야한다.
print(f'Fold {idx +1} 검증 데이터 타깃값 : ')
print(y[valid_idx] , '\n')
출처 : 머신러닝·딥러닝 문제해결 전략
(Golden Rabbit , 저자 : 신백균)
※혼자 공부용
'머신러닝 > 캐글_머신러닝_이론' 카테고리의 다른 글
[PYTHON - 머신러닝_캐글_모델]★결정 트리★엔트로피★앙상블 학습★보팅★배깅★부스팅★랜덤포레스트 (0) | 2023.02.01 |
---|---|
[PYTHON - 머신러닝_캐글_모델]★선형 회귀 모델★ (0) | 2023.01.31 |
[PYTHON - 머신러닝_캐글_피처 스케일링]★min-max 정규화★표준화(Standardization) (0) | 2023.01.31 |
[PYTHON - 머신러닝_캐글_데이터 인코딩]★LabelEncoder★One-Hot-Encoder (0) | 2023.01.31 |
[PYTHON - 머신러닝_캐글_분류와 회귀]★회귀 평가지표★분류 평가지표★ROC, AUC★RMSE (0) | 2023.01.31 |