Model Selection
- ํ์ต ๋ฐ์ดํฐ์ ํ ์คํธ ๋ฐ์ดํฐ
1. ํ์ต ๋ฐ์ดํฐ ์ธํธ
- ๋จธ์ ๋ฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ํ์ต์ ์ํด ์ฌ์ฉ.
- ๋ฐ์ดํฐ์ ์์ฑ๋ค๊ณผ ๊ฒฐ์ ๊ฐ(๋ ์ด๋ธ๊ฐ) ๋ชจ๋๋ฅผ ๊ฐ์ง๊ณ ์์.
- ํ์ต ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋จธ์ ๋ฌ๋ ์๊ณ ๋ฆฌ์ฆ์ด ๋ฐ์ดํฐ ์์ฑ๊ณผ ๊ฒฐ์ ๊ฐ์ ํจํด์ ์ธ์งํ๊ณ ํ์ต
2. ํ ์คํธ ๋ฐ์ดํฐ ์ธํธ
- ํ ์คํธ ๋ฐ์ดํฐ ์ธํธ์์ ํ์ต๋ ๋จธ์ ๋ฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ํ ์คํธ.
- ์์ฑ ๋ฐ์ดํฐ๋ง ๋จธ์ ๋ฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ ๊ณตํ๋ฉฐ, ๋จธ์ ๋ฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ ๊ณต๋ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฒฐ์ ๊ฐ์ ์์ธก.
- ํ ์คํธ ๋ฐ์ดํฐ๋ ํ์ต ๋ฐ์ดํฐ์ ๋ณ๋์ ๋ฐ์ดํฐ ์ธํธ๋ก ์ ๊ณต๋์ด์ผ ํจ.
3. ํ์ต ๋ฐ์ดํฐ์ ํ ์คํธ ๋ฐ์ดํฐ ๋ถ๋ฆฌ - train_test_split()
sklearn.model_selection์ train_test_split()ํจ์
X_train, X_test, y_train, y_test = train_test_split(iris_data.data, iris_data.target,
test_size=0.3, random_state=121)
- test_size : ์ ์ฒด ๋ฐ์ดํฐ์์ ํ ์คํธ ๋ฐ์ดํฐ ์ธํธ ํฌ๊ธฐ๋ฅผ ์ผ๋ง๋ก ์ํ๋งํ ๊ฒ์ธ๊ฐ๋ฅผ ๊ฒฐ์ . ๋ํดํธ๋ 0.25, 25%
- train_size : ์ ์ฒด ๋ฐ์ดํฐ์์ ํ์ต์ฉ ๋ฐ์ดํฐ ์ธํธ ํฌ๊ธฐ๋ฅผ ์ผ๋ง๋ก ์ํ๋งํ ๊ฒ์ธ๊ฐ๋ฅผ ๊ฒฐ์ . test_size ํ๋ผ๋ฏธํฐ๋ฅผ ํต์์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ train size๋ ์ ์ฌ์ฉํ์ง ์์.
- shuffle : ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฆฌํ๊ธฐ ์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ฏธ๋ฆฌ ์์์ง๋ฅผ ๊ฒฐ์ . ๋ํดํธ๋ True. ๋ฐ์ดํฐ๋ฅผ ๋ถ์ฐ์์ผ์ ์ข ๋ ํจ์จ์ ์ธ ํ์ต ๋ฐ ํ ์คํธ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ๋ง๋๋๋ฐ ์ฌ์ฉ๋จ.
- random_state : ํธ์ถํ ๋๋ง๋ค ๋์ผํ ํ์ต/ํ ์คํธ์ฉ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์์ฑํ๊ธฐ ์ํด ์ฃผ์ด์ง๋ ๋์๊ฐ. train_test_split()๋ ํธ์ถ ์ ๋ฌด์์๋ก ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฆฌํ๋ฏ๋ก random_state๋ฅผ ์ง์ ํ์ง ์์ผ๋ฉด ์ํํ ๋๋ง๋ค ๋ค๋ฅธ ํ์ต/ํ ์คํธ์ฉ ๋ฐ์ดํฐ๋ฅผ ์์ฑํจ.
4. ์ค์ต
# ํ์ต/ํ
์คํธ ๋ฐ์ดํฐ ๋ถ๋ฆฌ
from sklearn.model_selection import train_test_split
ํ์ต/ํ ์คํธ ๋ฐ์ดํฐ์ ์ดํด
- ํ์ต ๋ฐ์ดํฐ๋ก ์๋ชป๋ ์์ธก ์ผ์ด์ค
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
# iris ๋ฐ์ดํฐ ๋ก๋
iris = load_iris()
# ํ์ต ๋ฐ์ดํฐ ์ธํ
train_data = iris.data
train_label = iris.target
# ๋์์ ผํธ๋ฆฌ ๋ถ๋ฅ๊ธฐ ์ธ์คํด์ค ์์ฑ
dt_clf = DecisionTreeClassifier()
# ํ์ต ๋ฐ์ดํฐ๋ก ํ์ต
dt_clf.fit(train_data, train_label)
- ํ ์คํธ ๋ฐ์ดํฐ๋ก predictํด์ผ ์ ๋๋ก ๋ ์์ธก
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()
# train_test_split ํจ์ : ํ์ต, ํ
์คํธ ๋ฐ์ดํฐ ๋ถ๋ฆฌ
X_train, X_test, y_train, y_test = train_test_split(iris_data.data, iris_data.target,
test_size=0.3, random_state=121)
print(X_train.shape)
print(X_test.shape)
# ๋ชจ๋ธ ํ์ต
dt_clf.fit(X_train, y_train)
# ํ
์คํธ ๋ฐ์ดํฐ๋ก ์์ธก
pred = dt_clf.predict(X_test)
print('์์ธก ์ ํ๋: {0:.4f}'.format(accuracy_score(y_test,pred)))
- ๊ต์ฐจ ๊ฒ์ฆ๊ณผ GridSearchCV
1. ๊ต์ฐจ ๊ฒ์ฆ
- ํ์ต ๋ฐ์ดํฐ ์ธํธ : ํ์ต ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๋ถํ ํ์ฌ ํ์ต ๋ฐ์ดํฐ์ ํ์ต๋ ๋ชจ๋ธ์ ์ฑ๋ฅ์ ์ผ์ฐจ ํ๊ฐํ๋ ๊ฒ์ฆ ๋ฐ์ดํฐ๋ก ๋๋
- ํ ์คํธ ๋ฐ์ดํฐ ์ธํธ : ๋ชจ๋ ํ์ต/๊ฒ์ฆ ๊ณผ์ ์ด ์๋ฃ๋๋ ํ ์ต์ข ์ ์ผ๋ก ์ฑ๋ฅ์ ํ๊ฐํ๊ธฐ ์ํ ๋ฐ์ดํฐ ์ธํธ
k ํด๋ ๊ต์ฐจ ๊ฒ์ฆ
- ์ผ๋ฐ K ํด๋
- Stratified K ํด๋
- ๋ถ๊ท ํํ(imbalanced)๋ถํฌ๋๋ฅผ ๊ฐ์ง ๋ ์ด๋ธ(๊ฒฐ์ ํด๋์ค) ๋ฐ์ดํฐ ์งํฉ์ ์ํ 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()
label = iris.target
features = iris.data
print(features.shape)
features
# ๋ชจ๋ธ ์ ์
dt_clf = DecisionTreeClassifier(random_state=156)
dt_clf
# 5๊ฐ์ ํด๋ ์ธํธ๋ก ๋ถ๋ฆฌํ๋ KFold ๊ฐ์ฒด์ ํด๋ ์ธํธ๋ณ ์ ํ๋๋ฅผ ๋ด์ ๋ฆฌ์คํธ ๊ฐ์ฒด ์์ฑ.
kfold = KFold(n_splits=5) # n=5
cv_accuracy = [] # ์ต์ข
์ ์ผ๋ก๋ n๋ฒ์ ๊ต์ฐจ๊ฒ์ฆ์ ํ๊ท ์ ํ๋ ๊ณ์ฐ/ ํด๋ ์ธํธ ๋ณ๋ก ์ ํ๋ ๊ฐ์ ์ ์ฅํ ๋ฆฌ์คํธ ์์ฑ
print('๋ถ๊ฝ ๋ฐ์ดํฐ ์ธํธ ํฌ๊ธฐ:', features.shape[0])
# for๋ฌธ์ด ๋๋ ๋์ generator๊ฐ kfold๋ ๋ฐ์ดํฐ์ ํ์ต, ๊ฒ์ฆ row ์ธ๋ฑ์ค๋ฅผ array๋ก ๋ฐํ
kfold.split(features)
n_iter = 0
# KFold๊ฐ์ฒด์ split( ) ํธ์ถํ๋ฉด ํด๋ ๋ณ ํ์ต์ฉ, ๊ฒ์ฆ์ฉ ํ
์คํธ์ row ์ธ๋ฑ์ค๋ฅผ array๋ก ๋ฐํ
for train_index, test_index in kfold.split(features):
# kfold.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) # ์ ํ๋ : ์์์ 4์๋ฆฌ๊น์ง ๊ตฌํจ /np.round(์,์๋ฆฟ์)
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)
# ๊ฐ๋ณ iteration๋ณ ์ ํ๋๋ฅผ ํฉํ์ฌ ํ๊ท ์ ํ๋ ๊ณ์ฐ
print('\n## ํ๊ท ๊ฒ์ฆ ์ ํ๋:', np.mean(cv_accuracy))
- Stratified K ํด๋
KFOLD ๊ต์ฐจ๊ฒ์ฆ์ ๋ฌธ์ ์ : ๋ถ๊ท ํํ ๋ฐ์ดํฐ์๋ ์ ์ฉ์ด ์๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ ๋ฐฉ๋ฒ์ด StratifiedKFold : ๋ถ๊ท ํํ ๋ถํฌ๋๋ฅผ ๊ฐ์ง ๋ ์ด๋ธ ๋ฐ์ดํฐ ์งํฉ์ ๊ท ํํ๊ฒ ์์ด์ฃผ๊ณ ๊ต์ฐจ๊ฒ์ฆ์ ์งํํ๋ค.
import pandas as pd
# iris ๋ฐ์ดํฐ ๋ก๋
iris = load_iris()
iris_df = pd.DataFrame(data=iris.data, columns=iris.feature_names)
# iris ํ๊ฒ๊ฐ ํ์ธ
iris_df['label'] = iris.target
iris_df['label'].value_counts()
kfold = KFold(n_splits=3)
# kfold.split(X)๋ ํด๋ ์ธํธ๋ฅผ 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(), '\n') # ๊ฒ์ฆ ๋ ์ด๋ธ ๋ถํฌ
kfold๋ฅผ ํ๋๋ ๋ถ๊ท ํํ๊ฒ ํ์ต ๋ ์ด๋ธ, ๊ฒ์ฆ ๋ ์ด๋ธ์ด ๋ค์ด๊ฐ ์์ผ๋ฏ๋ก ๊ฒ์ฆ์ด ์ ๋๋ก ๋์ง ์๋๋ค
์ด๋ฅผ ํด๊ฒฐํ ๋ฐฉ๋ฒ์ด StratifiedKFold : ๋ถ๊ท ํํ ๋ถํฌ๋๋ฅผ ๊ฐ์ง ๋ ์ด๋ธ ๋ฐ์ดํฐ ์งํฉ์ ๊ท ํํ๊ฒ ์์ด์ฃผ๊ณ ๊ต์ฐจ๊ฒ์ฆ์ ์งํ.
from sklearn.model_selection import StratifiedKFold
# StratifiedKFold ํด๋์ค์ ์ธ์คํด์ค ์ ์ธ : skf
skf = StratifiedKFold(n_splits=3)
n_iter=0
# StratifiedKFold ์ฌ์ฉ์ KFold์ ์ฐจ์ด์ : ๋ ์ด๋ธ ๊ฐ์ ๋ฃ์ด์ค์ ๋ ์ด๋ธ์ ๋ง๊ฒ ๊ท ์ผํ๊ฒ ๋ถํฌ๋ฅผ ๋ง์ถฐ์ค๋ค.
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(), '\n')
StratifiedKFold ํ๋๋ ๊ท ์ผํ๊ฒ ํ์ต ๋ ์ด๋ธ, ๊ฒ์ฆ ๋ ์ด๋ธ์ด ๋ค์ด๊ฐ ์์ผ๋ฏ๋ก ๊ฒ์ฆ์ด ์ ๋๋ก ๋๋ค.
์ต์ข ์ ์ผ๋ก StratifiedKFold๋ฅผ ํ์ฉํ ๊ต์ฐจ ๊ฒ์ฆ ์ ํ๋ ํ์ธ
from sklearn.model_selection import StratifiedKFold
dt_clf = DecisionTreeClassifier(random_state=156)
skfold = StratifiedKFold(n_splits=3)
n_iter=0
cv_accuracy=[]
# StratifiedKFold์ split( ) ํธ์ถ์ ๋ฐ๋์ ๋ ์ด๋ธ ๋ฐ์ดํฐ ์
๋ ์ถ๊ฐ ์
๋ ฅ ํ์(๋ ์ด๋ธ ๋ถํฌ๋์ ๋ฐ๋ผ ํ์ต/๊ฒ์ฆ ๋ฐ์ดํฐ๋ฅผ ๋ถํ ํ๊ธฐ ๋๋ฌธ์)
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))
์๊น๋ณด๋ค ์ข์ ๊ฒ์ฆ ์ ํ๋๊ฐ ๋์ด
๊ต์ฐจ ๊ฒ์ฆ์ ๋ณด๋ค ๊ฐํธํ๊ฒ - cross_val_score()
KFold ํด๋์ค๋ฅผ ์ด์ฉํ ๊ต์ฐจ ๊ฒ์ฆ ๋ฐฉ๋ฒ
- ํด๋ ์ธํธ ์ค์
- For๋ฃจํ์์ ๋ฐ๋ณต์ ์ผ๋ก ํ์ต/๊ฒ์ฆ ๋ฐ์ดํฐ ์ถ์ถ ๋ฐ ํ์ต๊ณผ ์์ธก ์ํ
- ํด๋ ์ธํธ๋ณ๋ก ์์ธก ์ฑ๋ฅ์ ํ๊ท ํ์ฌ ์ต์ข ์ฑ๋ฅ ํ๊ฐ
-> cross_val_score() ํจ์๋ก ํด๋ ์ธํธ ์ถ์ถ, ํ์ต/์์ธก, ํ๊ฐ๋ฅผ ํ๋ฒ์ ์ํ
from sklearn.tree import DecisionTreeClassifier
# cross_val_score
from sklearn.model_selection import cross_val_score , cross_validate
from sklearn.datasets import load_iris
import numpy as np
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))
2. GridSearchCV
GridSearchCV - ๊ต์ฐจ ๊ฒ์ฆ๊ณผ ์ต์ ํ์ดํผ ํ๋ผ๋ฏธํฐ ํ๋์ ํ ๋ฒ์
- ํ์ดํผ ํ๋ผ๋ฏธํฐ : ๋ชจ๋ธ์ ์ฑ๋ฅ์ ์ต๋๋ก ๋์ด์ฌ๋ฆฌ๋ ํ์ต ์กฐ๊ฑด
- ํ์ดํผ ํ๋ผ๋ฏธํฐ ํ๋์ ์ค์์ฑ : ํ์ต ์กฐ๊ฑด์ ์ ์ค์ ํด์ผ ์ต๋์ ์ฑ๋ฅ์ ๋ด๋ ๋จธ์ ๋ฌ๋์ ์ป์ ์ ์์
์ฌ์ดํท๋ฐ์ GridSearchCV๋ฅผ ์ด์ฉํด Classifier๋ Regressor์ ๊ฐ์ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉ๋๋ ํ์ดํผ ํ๋ผ๋ฏธํฐ๋ฅผ ์์ฐจ์ ์ผ๋ก ์ ๋ ฅํ๋ฉด์ ํธ๋ฆฌํ๊ฒ ์ต์ ์ ํ๋ผ๋ฏธํฐ๋ฅผ ๋์ถํ ์ ์๋ ๋ฐฉ์์ ์ ๊ณต.
EX.
grid_parameters = {'max_depth': [1, 2, 3], min_samples_split': [2, 3]}
CV ์ธํธ๊ฐ 3์ด๋ผ๋ฉด ํ๋ผ๋ฏธํฐ ์์ฐจ ์ ์ฉ ํ์ : 6 X CV์ธํธ ์ : 3 = ํ์ต/๊ฒ์ฆ ์ด ์ํ ํ์ : 18
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import GridSearchCV, train_test_split
from sklearn.metrics import accuracy_score
# iris ๋ฐ์ดํฐ๋ฅผ ๋ก๋
iris = 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()
### hyper-parameter ๋ค์ ๋์
๋๋ฆฌ ํํ๋ก ์ค์
parameters = {'max_depth':[1, 2, 3], 'min_samples_split':[2,3]}
import pandas as pd
# param_grid์ ํ์ดํผ ํ๋ผ๋ฏธํฐ๋ค์ 3๊ฐ์ train, test set fold ๋ก ๋๋์ด์ ํ
์คํธ ์ํ ์ค์ .
grid_dtree = GridSearchCV(dtree, param_grid=parameters, cv=3, refit=True, return_train_score=True)
### refit=True ๊ฐ default : ๊ฐ์ฅ ์ข์ ํ๋ผ๋ฏธํฐ ์ค์ ์ผ๋ก ์ฌ ํ์ต ์ํด.
# ๋ถ๊ฝ Train ๋ฐ์ดํฐ๋ก param_grid์ ํ์ดํผ ํ๋ผ๋ฏธํฐ๋ค์ ์์ฐจ์ ์ผ๋ก ํ์ต/ํ๊ฐ .
grid_dtree.fit(X_train, y_train)
# GridSearchCV ๊ฒฐ๊ณผ ์ ์ฒด ํ์ธ
grid_dtree.cv_results_
# GridSearchCV ๊ฒฐ๊ณผ๋ cv_results_ ๋ผ๋ ๋์
๋๋ฆฌ๋ก ์ ์ฅ๋จ
# ์ด๋ฅผ 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']]
-> ๊ฐ์ฅ ์ข์ hyper-parameter๋ {'max_depth': 3, 'min_samples_split': 3}
print('GridSearchCV ์ต์ ํ๋ผ๋ฏธํฐ:', grid_dtree.best_params_)
print('GridSearchCV ์ต๊ณ ์ ํ๋: {0:.4f}'.format(grid_dtree.best_score_))
# refit=True๋ก ์ค์ ๋ GridSearchCV ๊ฐ์ฒด๊ฐ fit()์ ์ํ ์ ํ์ต์ด ์๋ฃ๋ Estimator๋ฅผ ๋ดํฌํ๊ณ ์์ผ๋ฏ๋ก predict()๋ฅผ ํตํด ์์ธก๋ ๊ฐ๋ฅ.
pred = grid_dtree.predict(X_test)
print('ํ
์คํธ ๋ฐ์ดํฐ ์ธํธ ์ ํ๋: {0:.4f}'.format(accuracy_score(y_test, pred)))
# ํ
์คํธ ๋ฐ์ดํฐ ์์ธก ์ ํ๋ ํ์ธ
accuracy_score(y_test, pred)
estimator ์ข ๋ฅ
- ๋ถ๋ฅ : DecisionTreeClassifier, RandomForestClassifier, ...
- ํ๊ท : LinearRegression, ...
# GridSearchCV์ refit์ผ๋ก ์ด๋ฏธ ํ์ต์ด ๋ estimator ๋ฐํ
# ์์์ dtree = DecisionTreeClassifier() ๋ก estimator๋ฅผ ์ ์ธํ๊ณ , ์ด๋ฅผ GridSearchCV์ ๋ฃ์์ผ๋ฏ๋ก,
estimator = grid_dtree.best_estimator_
estimator
# GridSearchCV์ best_estimator_๋ ์ด๋ฏธ ์ต์ ํ์ดํผ ํ๋ผ๋ฏธํฐ๋ก ํ์ต์ด ๋จ
pred = estimator.predict(X_test)
print('ํ
์คํธ ๋ฐ์ดํฐ ์ธํธ ์ ํ๋: {0:.4f}'.format(accuracy_score(y_test, pred)))
GridSearchCV๋ฅผ ์ฌ์ฉํ๋๋ ๊ต์ฐจ๊ฒ์ฆ์ ํตํด ์ต์ ์ ๋ชจ๋ธ ์ฑ๋ฅ์ ๋ด๋ ํ์ดํผ ํ๋ผ๋ฏธํฐ ํ๋์ ํ๊ณ ์ ํ๋๊ฐ ๋์ ๋ชจ๋ธ์ ์ป์ด๋.
๋๊ธ