Pythonとsklearnを使って最適なモデルパラメータを発見!:グリッドサーチの実装ガイド

機械学習のモデルを作成する際、最も重要なステップの一つがハイパーパラメータの調整です。ハイパーパラメータは、モデルの学習に影響を与える設定値で、これを適切に設定することでモデルの性能を大きく向上させることができます。しかし、ハイパーパラメータの最適な値を見つけるのは容易なことではありません。そこで役立つのが「グリッドサーチ」です。

グリッドサーチとは

グリッドサーチとは、指定したハイパーパラメータの範囲を全て試し、最も評価指標が高くなるパラメータの組み合わせを見つける方法です。Pythonの機械学習ライブラリであるsklearnでは、このグリッドサーチを簡単に行うことができます。今回は、その方法を具体的に見ていきます。

GridSearchCVを用いた具体的なグリッドサーチの手順

グリッドサーチの設定

まずは、sklearn.model_selectionからGridSearchCVをインポートします。GridSearchCVは、グリッドサーチを行うためのクラスです。このクラスを利用することで、指定したハイパーパラメータの全ての組み合わせについて、クロスバリデーションを用いてモデルの性能を評価することができます。

以下に、具体的なコードを示します。

# 必要なライブラリのインポート
from sklearn.tree import DecisionTreeClassifier as DT
from sklearn.model_selection import GridSearchCV

# 決定木モデルの準備
# random_state=0を指定して、結果の再現性を保証
tree = DT(random_state=0)

# 探索するパラメータの設定
# ここでは、決定木の最大深度を2から10までの範囲で探索
parameters = {"max_depth":[2,3,4,5,6,7,8,9,10]}

# グリッドサーチの設定
# モデルは決定木、探索するパラメータは上で設定したparameters
# cv=5で5分割のクロスバリデーションを行い、評価指標はAUC(Area Under the Curve)
# return_train_score=Trueで、学習データに対するスコアも計算
gcv = GridSearchCV(tree, parameters, cv=5, scoring='roc_auc', return_train_score=True)

このコードでは、決定木の最大深度を2から10までの範囲で探索しています。また、クロスバリデーションは5分割で行い、評価指標はAUC(Area Under the Curve)を使用しています。return_train_score=Trueを指定することで、学習データに対するスコアも計算されます。

グリッドサーチの実行

次に、グリッドサーチを実行します。これはfit関数を使用して行います。

# グリッドサーチの実行
gcv.fit(train_X, train_y)

グリッドサーチの結果の確認

グリッドサーチの結果を確認するには、cv_results_ を使います。学習用データのスコア、検証用データのスコアを取得し、グラフで可視化することができます。

# グリッドサーチの結果から、学習データとテストデータのスコアを取得
train_score = gcv.cv_results_["mean_train_score"]
test_score = gcv.cv_results_["mean_test_score"]

# matplotlib.pyplotを省略名pltとしてインポート 
import matplotlib.pyplot as plt

# 学習データのスコアをプロット
plt.plot([2,3,4,5,6,7,8,9,10], train_score, label="train_score")

# テストデータのスコアをプロット
plt.plot([2,3,4,5,6,7,8,9,10], test_score, label="test_score")

# グラフにタイトルを追加
plt.title('train_score vs test_score')

# グラフのx軸に名前を追加
plt.xlabel('max_depth')

# グラフのy軸に名前を追加
plt.ylabel('AUC')

# 凡例の表示
plt.legend()

# グラフの表示
plt.show()

学習用データはmax_depthが大きくなるほどスコアが改善していますが、テスト用データでは途中から悪化しています。これはまさに学習用データにだけ適合した過学習が起こっており、その様子がよくわかりますね。

最適なパラメーターの確認

最後に、最適なパラメーターはbest_params_で取得でき、最適なパラメーターを使ったモデルはbest_estimator_で取得できます。

# グリッドサーチの結果から、最適なパラメータを表示
print("Best parameters: ", gcv.best_params_)

# 最適なパラメータで学習したモデルを取得
optimal_model = gcv.best_estimator_

# 最適なモデルを用いて、評価用データの予測を行う
predicted_values = optimal_model.predict_proba(test_X)[:,1]

# 予測結果を用いてAUCを計算
auc_score = roc_auc_score(test_y, predicted_values)

# 計算したAUCを表示
print("AUC Score: ", auc_score)

先ほどのグラフの通りmax_depthが6の時がベストで、その際のAUCスコアも表示されました。

なお、ここでは可視化も含めてわかりやすさのためにパラメータをmax_depth1つにして探索を行いましたが、もちろん複数のパラメータについて同時に最適値を探索可能です。

他モデルや複数パラメーターでのグリッドサーチの実行

また、決定木以外のモデルについてもscikit-learnの幅広いモデルにて使用可能です。例えば、以下のコードではLightGBMにて複数のパラメータのグリッドサーチを行います。

# LightGBMのインポート
import lightgbm as lgb

# グリッドサーチのインポート
from sklearn.model_selection import GridSearchCV

# LightGBMモデルの準備
lgbm = lgb.LGBMClassifier(random_state=0)

# パラメータの準備
parameters = {
    'max_depth': [6, 8, 10, 12, 15, 20, 30],
    'min_data_in_leaf': [20, 25, 30, 35, 40, 45, 50, 55, 60],
    'num_leaves': [20, 30, 40, 50, 60]
}

# グリッドサーチの設定
gcv = GridSearchCV(lgbm, parameters, cv=5, scoring='roc_auc', return_train_score=True)

# グリッドサーチの実行
gcv.fit(train_X, train_y)

ただし、グリッドサーチではすべての組み合わせを試すため、パラメータを増やすと探索時間が長くなることに注意が必要です。


以上、Pythonとsklearnを用いたグリッドサーチの実行方法でした。

この記事を通じてより高性能な機械学習モデルの構築のお役に立てれば幸いです。

最新情報をチェックしよう!