scikit-learning model selectionモジュール#2

5415 ワード

K FoldとStartified 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')
階層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
クロス検証と最適なスーパーパラメータ調整
オーバースケールは機械学習アルゴリズムを構成する主なコンポーネントであり,この値を調整することでアルゴリズムの予測性能を改善できる.
この値を調整することでアルゴリズムの予測性能を改善することができる.
Sikit RunはGridSearchCVAPIを用いて,分類器やRegressionrのようなアルゴリズムのためのスーパーパラメータを逐次入力することによって最適なパラメータを容易に得ることができるスキームを提供した.
ex)
アルゴリズムの複数のスーパーパラメータを順番に変更しながら、最もパフォーマンスの高いパラメータの組み合わせを見つけたい場合は、パラメータセットを作成し、これらのパラメータを順番に適用して最適化できます.
grid_parameters = {'max_depth':[1, 2, 3], 
				'min_samples_split':[2, 3] }
2 x 3=6で、合計6つの場合、アルゴリズムの予測性能を検証するために、順次オーバースケールを変更します.
シーケンスmax depthmin samples split 1121213224233532633
最適なGridSearchCVパラメータを使用して最適な予測性能を実現
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))