728x90
반응형

1. 교차검증

==> 일반적으로 훈련 데이터로 모델을 훈련하고, 테스트 데이터로 예측해 모델 성능을 측정한다.

 

==> 모델을 훈련만 하고, 성능을 검증해 보지 않으면 2가지 문제 발생

 

㉠ 모델이 과대적합될 가능성이 있다. 

㉡ 제출 전까지 모델 성능을 확인하기 어렵다.

 

==> 교차 검증은 훈련 데이터를 여러 그룹으로 나누어 일부는 훈련 시 사용하고, 일부는 검증 시 사용해서 모델 성능을 측정하는 기법이다.

 

2. K 폴드 교차검증

https://knowallworld.tistory.com/376

 

[PYTHON - 머신러닝_랜덤 포레스트]★str.split(expand= True)★K-폴드 교차검증★하이퍼파라미터 튜닝

1. 랜덤 포레스트 ==> 결정 트리의 단점인 오버피팅 문제를 완화시켜주는 발전된 형태의 트리 모델이다. https://knowallworld.tistory.com/375 [PYTHON - 머신러닝_결정트리]★예측력, 설명력★빈칸 제거_skipin

knowallworld.tistory.com

데이터를 특정 개수(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]}')

교차검증2

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')

K-폴드 교차검증

==> 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')

충화 K-폴드 교차검증

출처 : 머신러닝·딥러닝 문제해결 전략

(Golden Rabbit , 저자 : 신백균)

※혼자 공부용

728x90
반응형

+ Recent posts