scikit-learn model_selection 모듈 #2

Khyst·2021년 1월 24일
0

K FoldStartified K Fold의 구현

from sklearn.datasets import load_iris
from sklearn.model_selection import StratifiedKFold, KFold
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score

import numpy as np
import pandas as pd

str_line = "-"
for i in range(23):
  str_line += '-'

iris = load_iris()

dataOfIris = iris.data
targetOfIris = iris.target
nameOfTargetIris = iris.feature_names

iris_df = pd.DataFrame(data=dataOfIris, columns=nameOfTargetIris)
print(iris_df)
iris_df['label'] = iris.target
iris_df['label'].value_counts()

print('K Fold Process')
print(str_line)
kfold = KFold(n_splits=3)
n_iter = 0

for train_index, test_index in kfold.split(iris_df):
  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())
  print('\n')
    
print('\n\n\n\n\n\n')
    
print('Stratified K Fold Process')
print(str_line)

skf = StratifiedKFold(n_splits=3)
n_iter = 0


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())
  print('\n')

Stratified K Fold 정확도 구현

dt_clf = DecisionTreeClassifier(random_state=156)

skfold  = StratifiedKFold(n_splits=3)
n_iter = 0
cv_accuracy  = []

#StartifiedKFold의 split()호출시 반드시 레이블 데이터 세트도 추가 입력 필요

features = iris.data
label = iris.target

print(label)

for train_index, test_index in skfold.split(features, label):
  #split()으로 반환된 인덱스를 이용해 학습용, 검증용 테스트 데이터 추출
  x_train, x_test = features[train_index], features[test_index]
  y_train, y_test = label[train_index], label[test_index]

  dt_clf.fit(x_train, y_train)
  pred = dt_clf.predict(x_test)

  n_iter += 1

  accuracy = np.round(accuracy_score(y_test, pred), 4)
  train_size = x_train.shape[0]
  test_size = x_test.shape[0]

  print('\n#{0} 교차 적응 정확도 :{1}, 학습 데이터 크기: {2}, 검증 데이터 크기: {3}'.format(n_iter, accuracy, train_size, test_size))
  print('#{0} 검증 세트 인덱스: {1}'.format(n_iter, test_index))
  cv_accuracy.append(accuracy)

  print('\n## 교차 검증별 정확도 : ', np.round(cv_accuracy, 4))
  print('## 평균 검증 정확도: ', np.mean(cv_accuracy))

위의 과정을 한번에 수행하도록 하는 API 'cross_val_score, cross_validation'

dt_clf = DecisionTreeClassifier(random_state=156)

skfold  = StratifiedKFold(n_splits=3)
n_iter = 0
cv_accuracy  = []

#StartifiedKFold의 split()호출시 반드시 레이블 데이터 세트도 추가 입력 필요

features = iris.data
label = iris.target

print(label)

for train_index, test_index in skfold.split(features, label):
  #split()으로 반환된 인덱스를 이용해 학습용, 검증용 테스트 데이터 추출
  x_train, x_test = features[train_index], features[test_index]
  y_train, y_test = label[train_index], label[test_index]

  dt_clf.fit(x_train, y_train)
  pred = dt_clf.predict(x_test)

  n_iter += 1

  accuracy = np.round(accuracy_score(y_test, pred), 4)
  train_size = x_train.shape[0]
  test_size = x_test.shape[0]

  print('\n#{0} 교차 적응 정확도 :{1}, 학습 데이터 크기: {2}, 검증 데이터 크기: {3}'.format(n_iter, accuracy, train_size, test_size))
  print('#{0} 검증 세트 인덱스: {1}'.format(n_iter, test_index))
  cv_accuracy.append(accuracy)

  print('\n## 교차 검증별 정확도 : ', np.round(cv_accuracy, 4))
  print('## 평균 검증 정확도: ', np.mean(cv_accuracy))

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

하이퍼 마라미터는 머신러닝 알고리즘을 구성하는 주요 구성 요소이며, 이 값을 조정해 알고리즘의 예측 성능을 개선할 수 있다.
이 값을 조정해서 알고리즘의 예측 성능을 개선할 수 있다.
사이킷 런은 GridSearchCV API를 이용해 Classifier나 Regressor와 같은 알고리즘에 사용되는 하이퍼 파라미터를 순차적으로 입력하면서 편리하게 최적의 파라미터를 도출할 수 있는 방안을 제공한다.

ex)
알고리즘의 여러 하이퍼 파라미터를 순차적으로 변경하면서 최고 성능을 가지는 파라미터 조합을 찾고자 한다면, 다음과 같이 파라미터 집합을 만들고 이를 순차적으로 적용하면서 최적화 할 수 있다.

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

2 x 3 = 6, 총 6가지 경우에 대한 하이퍼 마라미터를 순차적으로 변경하면서 알고리즘의 예측 성능을 확인해본다.

순번max_depthmin_samples_split
112
213
322
423
532
633

GridSearchCV를 이용한 최적의 parameter로 최적의 predict 성능 구현

from sklearn.model_selection import GridSearchCV, train_test_split

x_train, x_test, y_train, y_test = train_test_split(dataOfIris, targetOfIris, test_size=0.2, random_state=121)

dtree = DecisionTreeClassifier()

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

grid_dtree = GridSearchCV(dtree, param_grid = 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 Optimal Parameter:', grid_dtree.best_params_)
print('GridSearchCV Best Accuracy:', grid_dtree.best_score_)

estimator = grid_dtree.best_estimator_

prd = estimator.predict(x_test)
print('테스트 데이터 세트 정확도: ', accuracy_score(y_test, pred))
profile
DEVELOPE_FRESHMAN

0개의 댓글