본문 바로가기
Machine Learning

사이킷런으로 시작하는 머신러닝 - Model Selection 모듈(2)-

by rubyda 2020. 4. 9.
728x90

2-2 Stratified K 폴드


- Stratified K 폴드는 원본 데이터의 레이블 분포를 먼저 고려한 뒤 이 분포와 동일하게 학습과 검증 데이터 세트를 분해하여 줍니다.

  • Stratified K 폴드는 불균형한 분포를 가진 레이블들을 위한 방식입니다.

      불균형한 분포: 특정 레이블 값이 특이하게 많거나 매우 적어서 값의 분포가 한쪽으로 치우치는 것을 말한다.

 

 

  • 먼저 붓꽃 데이터의 레이블 값들의 분포도를 확인해 보도록 하겠습니다.

In

import pandas as pd

iris=load_iris()
iris_df=pd.DataFrame(data=iris_data,columns=iris.feature_names)
iris_df['label']=iris.target
iris_df['label'].value_counts()

Out

2    50
1    50
0    50

iris 원본 데이터는 50:50:50의 비율로 구성되어 있는 것을 확인하였습니다.

 

 

  • 다음은 StratifiedKFold를 상ㅇ해서 학습/검증 레이블 데이터의 분포도를 확인해 보겠습니다.

In

from sklearn.model_selection import StratifiedKFold

skf=StratifiedKFold(n_splits=3) #폴드 세트는 3개로 설정

for train_index, test_index in skf.split(iris_df, iris_df['label']):
    n_iter += 1
    label_train= iris_df['label'].iloc[train_index]
    label_test= iris_df['label'].iloc[test_index]
    print('## 교차 검증 : {0}'.format(n_iter))
    print('학습 레이블 데이터 분포:\n', label_train.value_counts())
    print('검증 레이블 데이터 분포:\n', label_test.value_counts())

Out

## 교차 검증 : 6
학습 레이블 데이터 분포:
 2    33
1    33
0    33
Name: label, dtype: int64
검증 레이블 데이터 분포:
 2    17
1    17
0    17
Name: label, dtype: int64
## 교차 검증 : 7
학습 레이블 데이터 분포:
 2    33
1    33
0    33
Name: label, dtype: int64
검증 레이블 데이터 분포:
 2    17
1    17
0    17
Name: label, dtype: int64
## 교차 검증 : 8
학습 레이블 데이터 분포:
 2    34
1    34
0    34
Name: label, dtype: int64
검증 레이블 데이터 분포:
 2    16
1    16
0    16

결과를 보면 학습 레이블과 검증 레이블 데이터 값의 분포도가 동일하게 나온것을 알 수 있습니다.

 

2-2 cross_val_score()


- 교차 검증을 좀 더 편리하게 수행할 수 있도록 도와주는 함수입니다.

cross_val_score(estimator, X, y=None, scoring=None, cv=None, n_jobs=1, verbose=0, fit_params=None,

pre_dispatch='2*n_jobs')

estimatot, X, y, scoring, cv가 중요한 파라미터입니다.

 

  • estimator: 분류 알고리즘 클래스 또는 회귀 알고리즘 클래스를 의미합니다.
  • X: 피처 데이터 세트
  • y: 레이블 데이트 세트
  • scoring: dPcmr tjdsmd vudrk wlvy
  • cv: 교차 검증 폴드 수
  • 다음 예제를 통해서 cross_val_score() 사용법을 알아보도록 하겠습니다.

In

from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import cross_val_score, cross_validate

iris_data=load_iris()
dt_clf=DecisionTreeClassifier(random_state=156)

data=iris_data.data
label=iris_data.target
scores=cross_val_score(dt_clf,data,label,scoring='accuracy',cv=3)
print('교차 검증별 정확도:',np.round(scores,4))
print('평균 검증 정확도',np.round(np.mean(scores),4))

Out

교차 검증별 정확도: [0.9804 0.9216 0.9792]
평균 검증 정확도 0.9604

 

2-2 GridSearchCV


- 하이퍼 파라미터를 순차적으로 입력하면서 편리하게 최적의 파라미터를 도출할 수 있는 방안을 제공해주는 함수입니다.

 

    하이퍼 파리미터: 머신러닝 알고리즘을 구성하는 주요 구성요소로, 이 값을 어떻게 조정하는지에 따라 예측 성능이 낮아지고 높아질 수 있습니다.

 

  • GridSearchCV 는 교차 검증을 기반으로 하이퍼 파라미터의 최적 값을 찾아 줍니다.
  • 수행시간이 상대적으로 오래 걸립니다.

수행 과정을 예시로 표현하면 다음과 같습니다.

번호 max_depth min_smples_split
1 1 2
2 1 3
3 2 2
4 2 3

 

위 예시의 경우 4회에 걸쳐 하이퍼 파리미터를 변경하면서 교차 검증 데이터을 수행하게 됩니다. 

 

  • 다음은 예제를 통해서 GridSearchCV 사용법을 알아보도록 하겠습니다.

In

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import GridSearchCV

iris = load_iris()
x_train, x_test, y_train, y_test = train_test_split(iris_data.data, iris_data.target, test_size=0.2, random_state=121)

먼저 train_test_split()를 사용해서 학습 데이터와 테스트 데이터를 분리하여 줍니다.

dtree = DecisionTreeClassifier()
parameters={'max_depth':[1,2,3],'min_samples_split':[2,3]}

결정 트리 알고리즘을 사용해서 구현을 해보겠습니다. 파라미터는 DecisionTreeClassifier()에서 중요한 max_depth()와 min_samples_split를 사용하도록 하겠습니다.

import pandas as pd

grid_dtree = GridSearchCV(dtree,param_grid=parameters,cv=3,refit=True)
grid_dtree.fit(x_train,y_train)

학습 데이터 세트를 GridSearchCV 객체의 학습 데이터 세트 메서드에 인자로 입력하여 줍니다.

 

Out

GridSearchCV(cv=3, error_score='raise-deprecating',
       estimator=DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=None,
            max_features=None, max_leaf_nodes=None,
            min_impurity_decrease=0.0, min_impurity_split=None,
            min_samples_leaf=1, min_samples_split=2,
            min_weight_fraction_leaf=0.0, presort=False, random_state=None,
            splitter='best'),
       fit_params=None, iid='warn', n_jobs=None,
       param_grid={'max_depth': [1, 2, 3], 'min_samples_split': [2, 3]},
       pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',
       scoring=None, verbose=0)

결과가 다음과 같이 출력이 되었는데 보기 쉽게 데이트 프레임으로 변환하여 결과를 해석해 보도록 하겠습니다.

 

In

scores_df=pd.DataFrame(grid_dtree.cv_results_)
scores_df[['params','mean_test_score','rank_test_score',
           'split0_test_score','split1_test_score','split2_test_score']]

Out

출력 결과를 봤을때 rank_test_score값이 1위인 4,5 가 예측 성능이 가장 높은 것을 확인할 수 있습니다.

 

In

print('최적 파라미터:',grid_dtree.best_params_)
print('최고 정확도:{0:.4f}'.format(grid_dtree.best_score_))

Out

최적 파라미터: {'max_depth': 3, 'min_samples_split': 2}
최고 정확도:0.9750

다음과 같이 최적 파라미터와 정확도를 출력 할 수 도 있습니다.

 

 

 

 

 

Reference


파이썬 머신러닝 완벽가이드