ホームページ >テクノロジー周辺機器 >AI >ハイパーパラメータ最適化の比較: グリッド検索、ランダム検索、ベイジアン最適化
この記事では、機械学習の結果を改善するために使用される最も一般的なハイパーパラメーターの最適化方法を詳しく紹介します。
翻訳者| 解決策は、トレーニング データをさらに追加することです。追加データは (特定の状況を除いて) 役立つことがよくありますが、高品質のデータを生成するには非常にコストがかかる場合があります。ハイパーパラメーターの最適化では、既存のデータを使用して最高のモデルのパフォーマンスを得ることで、時間とリソースを節約します。
名前が示すように、ハイパーパラメータの最適化は、最適化関数を満たす (つまり、研究対象のデータセットが与えられたモデルのパフォーマンスを最大化する) ための機械学習モデルのハイパーパラメータの最適な組み合わせを決定するプロセスです。 。言い換えれば、各モデルには、モデルに最適なハイパーパラメータの組み合わせが得られるまで変更できるオプションの複数の調整「ボタン」が用意されています。ハイパーパラメータの最適化中に変更できるパラメータの例としては、学習率、ニューラル ネットワークのアーキテクチャ (隠れ層の数など)、正則化などが挙げられます。
読者の参考のために記事の冒頭に大まかな比較表を示し、その後、記事の残りの部分全体で比較表の各項目をさらに調査、説明、実装していきます。
表 1: ハイパーパラメータ最適化手法の比較 1. グリッド検索アルゴリズムグリッド検索は、スーパーパラメータである可能性があります。パラメータ最適化の最も単純かつ直感的な方法。これには、定義された検索空間内でハイパーパラメータの最適な組み合わせを徹底的に検索することが含まれます。この文脈における「検索スペース」とは、ハイパーパラメータ全体と、最適化中に考慮されるそのようなハイパーパラメータの値です。例を挙げてグリッド検索をより深く理解しましょう。
パラメータが 3 つだけある機械学習モデルがあるとします。各パラメータは、表に示されている値を取ることができます:
parameter_1 = [1 , 2, 3]
パラメータ_2 = [a, b, c]パラメータ_3 = [x, y, z]
これらのパラメータのどの組み合わせが最適化関数を最適化するかわかりませんモデルの最適化 (つまり、機械学習モデルに最適な出力を提供する)。グリッド検索では、これらのパラメーターのあらゆる組み合わせを試し、各パラメーターのモデルのパフォーマンスを測定し、最高のパフォーマンスが得られる組み合わせを選択するだけです。この例では、パラメータ 1 は 3 つの値 (つまり、1、2、または 3) を取ることができ、パラメータ 2 は 3 つの値 (つまり、a、b、c) を取ることができ、パラメータ 3 は 3 つの値を取ることができます(つまり、x、y、z)。つまり、組み合わせは全部で3*3*3=27通りあります。この例のグリッド検索では、最高のパフォーマンスの組み合わせを見つけるために、機械学習モデルのパフォーマンスを 27 ラウンド評価します。
ご覧のとおり、この方法は非常に簡単です (試行錯誤のタスクに似ています) が、いくつかの制限もあります。この方法のメリットとデメリットをまとめてみましょう。
その利点は次のとおりです:
'min_samples_split': [2, 5, 10],
'min_samples_leaf': [1, 5, 10]} 上記の検索空間は、合計 4*5*3*3=180 個のハイパーパラメーターの組み合わせで構成されます。次のようにグリッド検索を使用して、目的関数を最適化する組み合わせを見つけます。# ライブラリのインポート
from sklearn.model_selection import GridSearchCV
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection importcross_val_score
インポート時間
# Iris データ セットの読み込み
iris =load_iris() #XX, y = iris.data, iris.target
#ハイパーパラメータ検索スペースの定義
search_space = {'n_estimators': [10, 100, 500, 1000],
'max_ Depth': [2, 10, 25, 50, 100],
'min_samples_split': [2, 5, 10 ] ,
'min_samples_leaf': [1, 5, 10]}
#ランダム フォレスト分類器の定義
clf = RandomForestClassifier(random_state=1234)
# オプティマイザー オブジェクトの生成
optimizer = GridSearchCV(clf, search_space, cv=5, sinners='accuracy')
#合計時間を計算するための開始時間を保存します
start_time = time.time()
#フィッティング時のオプティマイザーdata
optimizer.fit(X, y)
# 合計消費時間を計算するために使用できるように終了時刻を保存します。
end_time = time.time ()
# Print最適なハイパーパラメータ セットと対応するスコア
print(f"selected hyperparameters:")
print(optimizer.best_params_)
print("")
print(f"best_score: { optimizer.best_score_}")
print(f"elapsed_time: {round(end_time-start_time, 1)}")
上記のコードの出力は次のとおりです:
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import randint
# RandomizedSearchCV オブジェクトの作成
optimizer = RandomizedSearchCV( clf, param_distributinotallow=search_space,
n_iter=50, cv=5, sinners='accuracy',
random_state=1234)
# 合計実行時間を計算するために開始時間を保存します
start_time = time.time()
# オプティマイザをデータに適合させる ##optimizer.fit(X, y)
# 終了時刻を保存します合計実行時間を計算します
end_time = time.time()
# 最適なハイパーパラメータ セットと対応するスコアを出力します
print(f"selected hyperparameters:")
print (optimizer .best_params_)
print("")
print(f"best_score: {optimizer.best_score_}")
print(f"elapsed_time: {round(end_time-start_time, 1) }" )
上記のコードの出力結果は次のとおりです。
ランダム検索結果
グリッド検索の結果、これらの結果は非常に興味深いものです。 best_score は変わりませんが、elapsed_time は 352.0 秒から 75.5 秒に減少しました。なんて印象的なのでしょう!言い換えれば、ランダム検索アルゴリズムは、グリッド検索に必要な時間の約 21% で、グリッド検索と同様に実行される一連のハイパーパラメータを見つけることができました。ただし、ここでの効率ははるかに高くなります。
次に、ベイズ最適化と呼ばれる次の方法に進みましょう。これは、最適化プロセス中のすべての試行から学習します。
ベイジアン最適化は、確率モデルを使用して以前の試行から「学習」し、探索空間内のハイパーパラメータに探索を指示するハイパーパラメータ最適化手法です。機械学習モデルの目的関数。
ベイズ最適化手法は 4 つのステップに分けることができ、以下で説明します。プロセスをよりよく理解するためにこれらの手順を読むことをお勧めしますが、この方法を使用するために必要な前提知識はありません。
Baye についてさらに詳しく知りたい場合は、Si の詳細情報をご覧ください。最適化については、次の投稿をご覧ください:
「機械学習におけるベイジアン最適化アルゴリズム」、アドレスは:
https://medium.com/@fmnobar/concept -overview-of-bayesian-機械学習におけるパラメータ調整の最適化-a3b1b4b9339f。
さて、ベイジアン最適化がどのように機能するかを理解したところで、その利点と欠点を見てみましょう。
利点:
# ライブラリをインポートします
from skopt import BayesSearchCV # ベイズ最適化を実行しますoptimizer = BayesSearchCV(estimator=RandomForestClassifier(),
search_spaces =search_space , n_iter=10,
cv=5,
得点='accuracy',
random_state=1234)
# 合計を計算するための開始時間を保存します実行時間
start_time = time.time()
optimizer.fit(X, y)
# 合計実行時間を計算するために終了時間を保存します
end_time = time.time()
# 最適なハイパーパラメータ セットと対応するスコアを出力します。
print(f"selected hyperparameters:")
print(optimizer.best_params_)
print ("")
print(f"best_score: {optimizer.best_score_}")
print(f"elapsed_time: {round(end_time-start_time, 1)}")
#上記のコードの出力結果は次のとおりです。
ベイズ最適化の結果
もう 1 つの興味深い結果が見つかりました。 best_score はグリッド検索とランダム検索で得られた結果と一致していますが、結果にかかる時間はわずか 23.1 秒でした。これに対し、ランダム検索では 75.5 秒、グリッド検索では 352.0 秒かかりました。つまり、ベイジアン最適化を使用すると、グリッド検索よりも約 93% 時間が短縮されます。これは生産性の大幅な向上であり、より大規模で複雑なモデルや検索空間ではさらに意味が大きくなります。
ベイジアン最適化では、(ランダム検索やグリッド検索とは異なり) 以前の反復から学習できるため、これらの結果を得るために 10 回の反復のみを使用したことに注意してください。
下の表は、これまで説明した 3 つの方法の結果を比較しています。 「方法論」列では、使用されるハイパーパラメータの最適化方法について説明します。これに、各方法を使用して選択されたハイパーパラメータが続きます。 「ベスト スコア」は特定の方法を使用して取得されたスコアで、「経過時間」はローカル ラップトップで最適化戦略を実行するのにかかった時間を表します。最後の列「得られた効率」では、ベースラインとしてグリッド検索を想定し、グリッド検索と比較して他の 2 つの方法のそれぞれによって得られる効率を計算します (経過時間を使用)。たとえば、ランダム検索には 75.5 秒かかり、グリッド検索には 352.0 秒かかるため、グリッド検索ベースラインに対するランダム検索の効率は、1 – 75.5/352.0 = 78.5% と計算されます。
表 2 - メソッドのパフォーマンス比較表
上記の比較表の 2 つの主な結論:
元のタイトル: ハイパーパラメータ最適化 — グリッド検索、ランダム検索、ベイジアン最適化の概要と実装 、著者: Farzad Mahmoodinobar
以上がハイパーパラメータ最適化の比較: グリッド検索、ランダム検索、ベイジアン最適化の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。