pythonML

[pythonML] cross_val_score(교차검증)/ GridSearchCV(교차검증, 최적 하이퍼 파라미터 튜닝)

독립성이 강한 ISFP 2022. 3. 2. 19:53
728x90
반응형

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

 

  • estimator : classifier(분류)/regressor(회귀)
  • X: 피처 데이터 셋
  • y: 레이블 데이터 셋
  • scoring: 예측 성능 평가 지표 ex)정확도
  • cv: 교차 검증 폴드 수
  • cross_val_score() 수행 후 반환값: scoring 파라미터로 지정된 성능 지표 측정값을 배열 형태로 반환함
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import cross_val_score, cross_validate
from sklearn.datasets import load_iris

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

data=iris_data.data
label=iris_data.target

#성능 지표는 정확도(accuracy), 교차 검증 세트는 3개
scores= cross_val_score(dt_clf, data,label, scoring='accuracy',cv=3)
print('교차 검증별 정확도:', np.round(scores,4)) #정확도 값을 배열 형태로 반환
print('평균 검증 정확도:',np.round(np.mean(scores),4)) #정확도들의 평균
교차 검증별 정확도: [0.98 0.94 0.98]
평균 검증 정확도: 0.9667

- cross_val_score가 내부적으로 StratifiedKFold을 이용 (분류여서)

- 내부에서 Estimator를 학습(fit), 예측(predict), 평가(evaluation) 시켜줌

 

2. GridSearchCV - 교차 검증과 최적 하이퍼 파라미터 튜닝을 한 번에

  • estimator: classifier, regressor, pipeline
  • param_grid: key와 리스트 값을 가지는 딕셔너리. estimator의 튜닝을 위해 여러 {파라미터명, 파라미터 값} 을 지정
  • scoring: 예측 성능을 측정할 평가 방법을 지정. 보통은 사이킷런의 성능 평가 지표를 지정하는 문자열(ex.정확도의 경우 'accuracy') 로 지정하나 별도의 성능 평가 지표 함수도 지정가능.
  • cv: 교차 검증을 위해 분할되는 학습/테스트 세트의 개수.
  • refit: 디폴트값은 True. True일 경우 가장 최적의 하이퍼 파라미터를 찾은 뒤 입력된 estimator객체를 해당 하이퍼 파라미터로 재학습시킴.
  1. GridSearchCV 객체의 fit 메서드를 수행
  2. 학습 데이터를 cv에 기술된 폴딩 세트(= 3)로 분할해 param_grid에 기술된 파이퍼 파라미터를 순차적으로 변경
  3. 학습/평가를 수행, 그 결과를 cv_results 속성에 기록함
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import GridSearchCV
import pandas as pd

# 데이터를 로딩하고 학습데이터와 테스트 데이터 분리
iris_data = 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)
dtree = DecisionTreeClassifier()

### parameter 들을 dictionary 형태로 설정
parameters = {'max_depth':[1,2,3], 'min_samples_split':[2,3]}

# param_grid의 하이퍼 파라미터들을 3개의 train, test set fold 로 나누어서 테스트 수행 설정.  
### refit=True 가 default 임. True이면 가장 좋은 파라미터 설정으로 재학습 시킴.  
grid_dtree = GridSearchCV(dtree, param_grid=parameters, cv=3, refit=True)

# 붓꽃 Train 데이터로 param_grid의 하이퍼 파라미터들을 순차적으로 학습/평가 .
grid_dtree.fit(X_train, y_train)

# GridSearchCV 결과 추출하여 DataFrame으로 변환
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']]

  • params :수행할 때마다 적용된 개별 하이퍼 파라미터 값
  • rank_test_score: 하이퍼 파라미터별로 성능이 좋은 score순위를 나타냄. 1이 가장 뛰어난 순위이며 이때의 파라미터가 최적의 하이퍼 파라미터이다.
  • mean_test_score: 개별 하이퍼 파라미터별로 CV의 폴딩 테스트 세트에 대해 총 수행한 평가 평균값 (split0_test_score, split1_test_score, split2_test_score 의 평균)

 

 

- best_params_  / best_score_ 속성을 이용해 최적 하이퍼 파라미터의 값과 그때의 평가결과 (정확도)를 직관적으로 알 수 있음

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

 

 

  • GridSearchCV 객체의 생성 파라미터로 refit=True 가 디폴트임.refit=True이면 GridSearchCV가 최적 성능을 나타내는 하이퍼 파라미터로 Estimator를 학습해 best_estimator_로 저장해줌.
  • =>그래서 이미 학습된 best_estimator_를 이용해서 앞에서 train_test_split으로 분리한 테스트 데이터 세트에 대해 예측, 평가함
#GridSearchCV의 refit으로 이미 학습된 estimator 반환
estimator =grid_dtree.best_estimator_

#GridSearchCV의 best_estimator_은 이미 최적 학습이 됐으므로 별도 학습이 필요 없음
pred = estimator.predict(X_test) #train_test_split으로 분리한 테스트 데이터 세트에 대해 예측, 평가
print('테스트 데이터 세트 정확도:{0:.4f}'.format(accuracy_score(y_test,pred)))

 

테스트 데이터 세트 정확도:0.9667

 

일반적으로 이처럼 학습 데이터를 GridSearchCV를 이용해 최적 하이퍼 파라미터 튜닝을 수행한 후 별도의 테스트 셋에서 이를 평하는 것이 일반적인 머신러닝 모델 적용방법임. 

728x90
반응형