ハイパーパラメータ最適化:ランダムサーチとグリッドサーチ

Beginner

This tutorial is from open-source community. Access the source code

はじめに

機械学習において、ハイパーパラメータはデータから学習されるものではなく、学習の前に設定されるパラメータです。適切なハイパーパラメータを選択することは、機械学習モデルにおいて高精度を達成するために重要です。ハイパーパラメータ最適化の 2 つの一般的な方法は、ランダムサーチとグリッドサーチです。この実験では、確率的勾配降下法(SGD)を用いた線形サポートベクターマシン(SVM)のハイパーパラメータを最適化するためのこれら 2 つの方法を比較します。

VM のヒント

VM の起動が完了した後、画面の左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebook を使って練習しましょう。

時々、Jupyter Notebook が読み込み終わるまで数秒待つ必要があります。Jupyter Notebook の制限により、操作の検証は自動化できません。

学習中に問題に遭遇した場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。

必要なライブラリをインポートしてデータを読み込む

必要なライブラリをインポートし、scikit-learn からの手書き数字データセットを読み込むことから始めます。

import numpy as np
from time import time
import scipy.stats as stats
from sklearn.model_selection import GridSearchCV, RandomizedSearchCV
from sklearn.datasets import load_digits
from sklearn.linear_model import SGDClassifier

## load digits dataset
X, y = load_digits(return_X_y=True, n_class=3)

SVM モデルを作成する

確率的勾配降下法(SGD)を用いて線形 SVM モデルを作成します。

## create SVM model with SGD training
clf = SGDClassifier(loss="hinge", penalty="elasticnet", fit_intercept=True)

ハイパーパラメータ最適化のためのランダムサーチ

ランダムサーチを使ってハイパーパラメータ空間を探索し、SVM モデルに最適なハイパーパラメータを見つけます。

## specify parameters and distributions to sample from
param_dist = {
    "average": [True, False],
    "l1_ratio": stats.uniform(0, 1),
    "alpha": stats.loguniform(1e-2, 1e0),
}

## run randomized search
n_iter_search = 15
random_search = RandomizedSearchCV(
    clf, param_distributions=param_dist, n_iter=n_iter_search
)

start = time()
random_search.fit(X, y)
print(
    "RandomizedSearchCV took %.2f seconds for %d candidates parameter settings."
    % ((time() - start), n_iter_search)
)

## print results
report(random_search.cv_results_)

ハイパーパラメータ最適化のためのグリッドサーチ

グリッドサーチを使ってハイパーパラメータ空間を探索し、SVM モデルに最適なハイパーパラメータを見つけます。

## specify parameters to search over
param_grid = {
    "average": [True, False],
    "l1_ratio": np.linspace(0, 1, num=10),
    "alpha": np.power(10, np.arange(-2, 1, dtype=float)),
}

## run grid search
grid_search = GridSearchCV(clf, param_grid=param_grid)

start = time()
grid_search.fit(X, y)

print(
    "GridSearchCV took %.2f seconds for %d candidate parameter settings."
    % (time() - start, len(grid_search.cv_results_["params"]))
)

## print results
report(grid_search.cv_results_)

まとめ

この実験では、確率的勾配降下法(SGD)を用いた線形 SVM モデルのハイパーパラメータ最適化において、ランダムサーチとグリッドサーチを比較しました。両方の手法が同じハイパーパラメータ空間を探索することがわかりましたが、ランダムサーチの方がはるかに高速でした。各手法によって見つけられた最適なハイパーパラメータは性能面で似ていましたが、ランダムサーチはノイズのためやや性能が劣る場合があります。実際には、このように多くのハイパーパラメータを同時に探索することはせず、最も重要なものだけを探索します。