인공지능 학습에서 데이터 label의 균형 분포와 shuffle은 과적합과 데이터 불균형 문제의 효과적인 예방법이다

 

 

 

1. K 폴드 교차 검증

 

K 폴드 교차 검증으로 전체 데이터를 나누는 방법으로 사용된다

import numpy as np
from sklearn.model_selection import KFold
arr = np.arange(20)

folds = KFold(n_splits=5, shuffle=True)
for train_idx, vaild_idx in folds.split(arr):
  print( f'훈련용 { arr[train_idx] }, 검증용 { arr[vaild_idx] }' )

n_splits 는 데이터 세트 개수, shuffle은 데이터를 섞을지의 여부로 0 ~ 19의 데이터를 훈련용과 검증용을 구분하여

val를 K폴드 교차 검증 방법으로 나누는 코드이다

훈련용 [ 0  2  3  4  5  6  7 10 11 12 13 14 16 17 18 19], 검증용 [ 1  8  9 15]
훈련용 [ 1  2  4  5  7  8  9 10 11 12 14 15 16 17 18 19], 검증용 [ 0  3  6 13]
훈련용 [ 0  1  3  4  5  6  7  8  9 10 13 14 15 16 17 18], 검증용 [ 2 11 12 19]
훈련용 [ 0  1  2  3  6  7  8  9 11 12 13 15 16 17 18 19], 검증용 [ 4  5 10 14]
훈련용 [ 0  1  2  3  4  5  6  8  9 10 11 12 13 14 15 19], 검증용 [ 7 16 17 18]

 

 

 

 

2. 층화 K 폴드 교차 검증

 

데이터 label이 불균형하게 분포되어있을때 균형있는 분포를 위해 사용된다

from sklearn.model_selection import StratifiedKFold
y = np.array(['A']*5 + ['B']*45)
X = np.arange( len(y) )
folds = StratifiedKFold(n_splits=5)
for idx, (train_idx, vaild_idx) in enumerate( folds.split(X, y) ):
  print( f'검증용 {idx + 1} 번째 데이터')
  print( f'검증용 { y[vaild_idx] }' )

45:5 비율의 데이터를 K폴드로 나누면 A데이터가 없는 데이터세트가 생길 수 있기에 층화 K폴드를 사용하면 된다

 

검증용 1 번째 데이터
검증용 ['A' 'B' 'B' 'B' 'B' 'B' 'B' 'B' 'B' 'B']
검증용 2 번째 데이터
검증용 ['A' 'B' 'B' 'B' 'B' 'B' 'B' 'B' 'B' 'B']
검증용 3 번째 데이터
검증용 ['A' 'B' 'B' 'B' 'B' 'B' 'B' 'B' 'B' 'B']
검증용 4 번째 데이터
검증용 ['A' 'B' 'B' 'B' 'B' 'B' 'B' 'B' 'B' 'B']
검증용 5 번째 데이터
검증용 ['A' 'B' 'B' 'B' 'B' 'B' 'B' 'B' 'B' 'B']

 

 

 

 

3. GridSearchCV

교차검증과 하이퍼파라미터 튜닝

from sklearn.model_selection import GridSearchCV, RandomizedSearchCV, train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=45)
X_train.shape, X_test.shape, y_train.shape, y_test.shape

gridModel = GridSearchCV(
    model,
    {
        'max_depth':[1,2,3],
        'min_samples_split':[2,3]
    },
    cv = 5,
    refit = True,
    return_train_score=True

교차검증과 함께 하이퍼파라미터 튜닝도 같이 진행하게 된다 위 예시 코드로는 max_depth에 1,2,3, min_samples_split 2,3  의 값중 가장 정확도가 높은 파라미터를 얻을 수 있게된다.

 

해당 방법은 대규모 학습에서는 미니멀하게 학습을 진행하여 실험적으로 진행한다

 

 

 

 

4. RandomizedSearchCV

random_cv = RandomizedSearchCV(
    DecisionTreeClassifier(), 
    {
        'max_depth':randint(low=3, high=11),
        'max_features':randint(low=2, high=4),
    },
    n_iter=24,
    random_state=1,
    scoring='accuracy',
    verbose=1
)

 

n_iter 탐색횟수만큼 랜덤하게 학습을 진행한다

검증용이 테스트용보다 정확도가 높은 경우가 자주 발생하여 과적합이 자주 발생하는 방법이다

+ Recent posts