前回の記事は「モデル評価」を話しました。
今回の記事はGridSearchでのパラメータチューニングを解説します。
Pythonの機械学習ライブラリscikit-learnにはモデルのパラメタをチューニングする方法としてGridSearchCVが用意されています。
digitsのデータセットをGridSearchCVを使ってパラメタチューニングをしてみます。
グリッドサーチとは、モデルの精度を向上させるために用いられる手法です。全てのパラメータの組み合わせを試してみる方法のことです。パラメータの組み合わせを全て試し、最も評価精度の良いものを探索する方法です。パラメータを変更することで予測精度は飛躍的に変わります。
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import classification_report
from sklearn.svm import SVC
import numpy as np
import matplotlib.pyplot as plt
0-9の数字の画像コードデータをロード
# sklernのライブラリからDigits dataset
digits = datasets.load_digits()
# X, y 作成
n_samples = len(digits.images)
X = digits.images.reshape((n_samples, -1))
y = digits.target
X, y
data_train = digits.images
label_train = digits.target
mean_images = np.zeros((10,8,8))
fig = plt.figure(figsize=(10,5))
for i in range(10):
mean_images[i] = data_train[label_train==i].mean(axis=0)
ax = fig.add_subplot(2, 5, i+1)
ax.axis('off')
ax.set_title('{0} (n={1})'.format(i, len(data_train[label_train==i])))
ax.imshow(mean_images[i],cmap=plt.cm.gray_r, interpolation='nearest')
plt.show()
半分の学習データとテストデータに分けます。
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.5, random_state=0)
交差検定によってパラメータを設定します。
GridSearchCVで kernel、gamma、Cのパラメータを調整し、
最も評価のprecisionとrecallのモデルを探索します。
最も評価のprecisionとrecallのパラメータは C = 10, gamma = 0.001, kernel = rbfです。
# 交差検定によってパラメータを設定
tuned_parameters = [{'kernel': ['rbf'],
'gamma': [1e-3, 1e-4],
'C': [1, 10, 100, 1000]},
{'kernel': ['linear'], 'C': [1, 10, 100, 1000]}]
scores = ['precision', 'recall']
for score in scores:
print("# ハイパーパラメータの調整: %s" % score)
print()
clf = GridSearchCV(SVC(), tuned_parameters, cv=5,
scoring='%s_macro' % score)
clf.fit(X_train, y_train)
print("最良のパラメータセット:")
print()
print(clf.best_params_)
print()
print("グリッドスコア: %s" % score)
print()
means = clf.cv_results_['mean_test_score']
stds = clf.cv_results_['std_test_score']
for mean, std, params in zip(means, stds, clf.cv_results_['params']):
print("%0.3f (+/-%0.03f) for %r"
% (mean, std * 2, params))
print()
print("詳細レポート:")
print()
print("学習データでモデルを作成")
print("テストデータの評価スコアを作成")
print()
y_true, y_pred = y_test, clf.predict(X_test)
print(classification_report(y_true, y_pred))
print()