はじめに
機械学習において、ハイパーパラメータはデータから学習されるものではなく、学習の前に設定されるパラメータです。適切なハイパーパラメータを選択することは、機械学習モデルにおいて高精度を達成するために重要です。ハイパーパラメータ最適化の 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 モデルのハイパーパラメータ最適化において、ランダムサーチとグリッドサーチを比較しました。両方の手法が同じハイパーパラメータ空間を探索することがわかりましたが、ランダムサーチの方がはるかに高速でした。各手法によって見つけられた最適なハイパーパラメータは性能面で似ていましたが、ランダムサーチはノイズのためやや性能が劣る場合があります。実際には、このように多くのハイパーパラメータを同時に探索することはせず、最も重要なものだけを探索します。