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')
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_depth | min_samples_split |
---|---|---|
1 | 1 | 2 |
2 | 1 | 3 |
3 | 2 | 2 |
4 | 2 | 3 |
5 | 3 | 2 |
6 | 3 | 3 |
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))