학습/테스트 데이터 세트 분리 -  train_test_split()

from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

dt_clf = DecisionTreeClassifier()
iris_data = load_iris()

X_trian, X_test, y_train, y_test = train_test_split(iris_data.data, iris_data.target, test_size = 0.3, random_state=121)
dt_clf.fit(X_train, y_train)
pred = dt_clf.predict(X_test)
print('예측 정확도: {0:4f}'.format(accuracy_score(y_test, pred)))

테스트 데이터에만 최적의 성능을 발휘할 수 있도록 편향되게 모델을 유도하는 경향이 생기게 됨

 

 

교차검증

별도의 여러 세트로 구성된 학습 데이터 세트와 검증 데이터 세트에서 학습과 평가를 수행하는 것

즉, ML에 사용되는 데이터 세트를 세분화해서 학습, 검증, 테스트 데이터 세트로 나누는 것

  • K 폴드 교차검증

K개의 데이터 폴드 세트를 만들어서 K번만큼 각 폴드 세트에 학습과 검증 평가를 반복적으로 수행하는 방법

from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
from sklearn.model_selection import KFold
import numpy as np

iris = load_iris()
features = iris.data
label = iris.target
dt_clf = DecisionTreeClassifier(random_state = 156)

#5개의 폴드 세트로 분리하는 KFold 객체와 폴드 세트별 정확도를 담을 리스트 객체 생성
kfold = KFold(n_splits=5)
cv_accuracy = []
print('붓꽃 데이터 세트 크기:', features.shape[0])
  • Stratified K폴드

불균형한(imbalanced)분포도를 가진 레이블 데이터 집합을 위한 K폴드 방식

원본 데이터의 레이블 분포를 먼저 고려한 뒤 이 분포와 동일하게 학습과 검증 데이터 세트를 분배

from sklearn.model_selection import StratifiedKFold
skf = StratifiedKFold(n_splits=3)

분류에서의 교차검증은 K폴드가 아니라 Stratified K폴드로 분할되어야 함

  • 교차검증을 보다 간편하게 - cross_val_score()

estimator : classifier(Stratified K폴드) 혹은 regressor(KFold)

X : 피처 데이터 세트

y : 레이블 데이터 세트

scoring : 예측 성능 평가 지표

cv : 교차 검증 폴드 수

cross_val_score() 수행 후 반환 값은 scoring 파라미터로 지정된 성능 지표 측정값을 배열 형태로 반환

import numpy as np
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))
  • cross_validate()

여러 개의 평가 지표를 반환, 학습 데이터에 대한 성능 평가 지표와 수행 시간도 같이 제공

 

  • GridSearchCV : 교차검증과 최적 하이퍼파라미터 튜닝 한 번에

데이터 세트를 cross_validation을 위한 학습/테스트 세트로 자동으로 분할한 뒤에 하이퍼 파라미터 그리드에 기술된 모든 파라미터를 순차적으로 적용해 최적의 파라미터를 찾음

최적의 파라미터를 편리하게 찾게 해주지만 동시에 순차적으로 파라미터를 테스트하므로 수행시간이 상대적으로 오래 걸린다

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

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

parameters = {'max_depth':[1,2,3], 'min_samples_split':[2,3]}

param_grid의 경우 key+리스트 값을 가지는 딕셔너리로 입력

 

import pandas as pd
grid_dtree = GridSearchCV(dtree, param_gripd = parameters, cv=3, refit = True)
grid_dtree.fit(X_train, y_train)
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']]
print('GridSearchCV 최적 파라미터:', grid_dtree.best_params_)
print('GridSearchCV 최고 정확도 {0:.4f}'.format(grid_dtree.best_score_))
#GridSearchCV의 refit으로 이미 학습된 estimator 반환
estimator = grid_dtree.best_estimator_

#GridSearchCV의 best_estimator_는 이미 최적 학습 됐으므로 별도 학습 필요 없음
pred = estimator.predict(X_test)
print('테스트 데이터 세트 정확도 : {0:.4f}'.format(accuracy_score(y_test, pred)))

 

 

 

'ML' 카테고리의 다른 글

평가  (0) 2022.11.07
타이타닉 생존자 예측  (0) 2022.11.07
표준화와 정규화  (0) 2022.11.07
데이터 인코딩  (0) 2022.11.07
붓꽃 품종 예측하기  (0) 2022.11.07

+ Recent posts