AI(人工知能)用語集

やさしいランダムサーチ入門!Scikit-Learnで使ってみよう

ランダムサーチ(RandomSearch)

機械学習モデルにはハイパーパラメータと呼ばれる人手で調整すべきパラメータがありますよね。このハイパーパラメータを各データに合わせて調整することで、より精度の高い機械学習モデルを構築することが可能になります。本記事ではハイパーパラメータを自動で探索する手法のひとつであるランダムサーチについて解説しましょう。

ハイパーパラメータとは

機械学習モデルは与えられたデータから特定のパターンを認識するように自動で学習を行います。しかしモデル内部の全てのパラメータが自動で決まるわけではなく、中には人間が設定する必要があるデータも存在し、それらをハイパーパラメータと呼びます。

ハイパーパラメータにはリッジ回帰などの正則化項の重みを調整するようなものから、ニューラルネットワークにおける各層のニューロンの数や、そもそもの層の数、畳み込み層や全結合層といった何の層を用いるかまで多岐に渡ります。

これらの値を0, 1, 2, 3, …のように順に試して精度を比較してもいいのですが、単純に試行を繰り返すだけでは途方もない時間がかかりますよね。そのため効率的にハイパーパラメータを探索する手法が提案されており、著名な手法に本記事で紹介するランダムサーチ、他にはグリッドサーチやベイズ最適化といった種類があります。

ハイパーパラメータの自動探索手法

先ほどの記述の通り、ハイパーパラメータを自動で探索する代表的な手法には以下の3つがあります。

  • ランダムサーチ
  • グリッドサーチ
  • ベイズ最適化

本章ではこれら各手法の簡単な概要を説明しましょう。

ランダムサーチ

まずはランダムサーチをみていきましょう。

ランダムサーチは考えうる全ての探索空間からハイパーパラメータが従うであろう指定された分布に基づいてパラメータを無作為に抽出してモデルの性能を評価することで、適切なハイパーパラメータを探し出します。全くのランダムではなく適切な分布からパラメータを抽出して実験を繰り返すことで、効率よく最適なパラメータを探索することができます。

グリッドサーチ

次にグリッドサーチを紹介しましょう。

グリッドサーチはその名の通り探索空間を格子状に区切り、格子点上の値の組み合わせから適切なハイパーパラメータを探索する手法です。ランダムサーチと類似していますが、格子点を人手で与えることができ、良く言えば人間の勘所を取り入れながら探索を行うことができる手法で、悪く言えば格子点を直接指定する必要がある分面倒であると考えられます。

ベイズ最適化

続いてベイズ最適化について紹介しましょう。

ベイズ最適化は以前の探索結果を考慮し、探索の結果がよかったものの周辺をより入念に探索していく手法です。ランダムサーチやグリッドサーチと比較して一般に探索効率が良く、プリファードネットワークスが公開しているハイパーパラメータ探索用のライブラリではベイズ最適化による手法が利用されています。

Scikit-Learnのランダムサーチを利用する

機械学習の様々な手法を提供しているライブラリScikit-Learn(サイキットラーン)を利用して実際にランダムサーチを試してみましょう。

ロジスティック回帰モデルでアヤメデータの分類を行います。探索するハイパーパラメータはロジスティック回帰の正則化手法をL1にするかL2にするか、そして正則化項の重みの逆数で値が小さいほど正則化の効果が強くなります。Scikit-LearnではそれぞれのデフォルトのパラメータはL2と1.0が設定されています。

from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import uniform

if __name__ == '__main__':
    iris = load_iris()
    logistic = LogisticRegression(
        solver='saga', tol=1e-2, max_iter=200,
        random_state=0
    )

    distributions = dict(C=uniform(loc=0, scale=4), penalty=['l2', 'l1'])

    clf = RandomizedSearchCV(logistic, distributions, random_state=0)
    search = clf.fit(iris.data, iris.target)
    print(search.best_params_)

以下のような実行結果が得られました。

{'C': 2.195254015709299, 'penalty': 'l1'}

今回の交差検証でのハイパーパラメータ探索の結果、L1正則化、正則化の強さの逆数は約2.2が最適であるという結果が出ました。どちらもデフォルトのパラメータとは異なっているためこの結果を利用してモデルを学習させることで、さらに精度を向上させる余地があることを示していますね!

まとめ

ランダムサーチについて重要な点をまとめましょう。

  • ハイパーパラメータ探索の代表的な手法のひとつ。
  • 指定された分布に従ってランダムにパラメータを抽出してモデルの性能を評価することで、効率的にハイパーパラメータを探索することが可能。
  • グリッドサーチと比較して分布を指定するだけで済むので簡単に利用できる。
以上、ご覧いただきありがとうございました。