인공지능 학습에서 데이터 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 탐색횟수만큼 랜덤하게 학습을 진행한다
검증용이 테스트용보다 정확도가 높은 경우가 자주 발생하여 과적합이 자주 발생하는 방법이다