ハイパーパラメータ調整:GridSearchCVとRandomizedSearchCVの説明
ハイパーパラメータ調整:GridSearchCVとRandomizedSearchCVを使った効果的なパラメータチューニングの解説
訓練するすべての機械学習モデルには、パラメータまたはモデルの係数のセットがあります。機械学習アルゴリズムの目標は、これらのパラメータの最適な値を学習することです。
さらに、機械学習モデルにはハイパーパラメータのセットもあります。例えば、K-最近傍法のKの値、隣人の数です。または、深層ニューラルネットワークを訓練する際のバッチサイズなどです。
これらのハイパーパラメータはモデルによって学習されるのではなく、開発者によって指定されます。これらはモデルの性能に影響を与え、チューニングすることができます。では、これらのハイパーパラメータの最適な値をどのように見つけるのでしょうか?このプロセスはハイパーパラメータの最適化またはハイパーパラメータのチューニングと呼ばれます。
- 「OpenAIのための自然言語からSQLへの変換のためのスーパープロンプトを作成する」
- HuggingFaceはTextEnvironmentsを紹介します:機械学習モデルと、モデルが特定のタスクを解決するために呼び出すことができる一連のツール(Python関数)の間のオーケストレーターです
- 「ブンデスリーガのマッチファクト ショットスピード – ブンデスリーガで一番シュートが速いのは誰か?」
最も一般的なハイパーパラメータのチューニング手法には、次の2つがあります:
- グリッドサーチ
- ランダムサーチ
このガイドでは、これらの手法の動作方法とscikit-learnでの実装方法について学びましょう。
ベースラインのSVM分類器の訓練
まず、ワインデータセットに対して簡単なサポートベクターマシン(SVM)分類器を訓練してみましょう。
まず、必要なモジュールとクラスをインポートします:
from sklearn import datasetsfrom sklearn.model_selection import train_test_splitfrom sklearn.svm import SVCfrom sklearn.metrics import accuracy_score
ワインデータセットは、scikit-learnに組み込まれたデータセットの一部です。以下のように特徴量とターゲットラベルを読み込みます:
# ワインデータセットをロードwine = datasets.load_wine()X = wine.datay = wine.target
ワインデータセットは、13個の数値特徴量と3つの出力クラスラベルを持つシンプルなデータセットです。このデータセットでマルチクラス分類の手法を学ぶための良い候補です。データセットの説明を表示するにはwine.DESCR
を実行してください。
次に、データセットをトレーニングセットとテストセットに分割します。ここではtest_size
に0.2を使用しました。したがって、データの80%がトレーニングデータセットに、20%がテストデータセットに入ります。
# データセットをトレーニングセットとテストセットに分割X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=24)
次に、サポートベクトル分類器をインスタンス化し、モデルをトレーニングデータセットに適合させます。その後、テストセットでの性能を評価します。
# ベースラインのSVM分類器を作成baseline_svm = SVC()baseline_svm.fit(X_train, y_train)y_pred = baseline_svm.predict(X_test)
シンプルなマルチクラス分類問題なので、モデルの精度を見ることができます。
# ベースラインモデルの評価accuracy = accuracy_score(y_test, y_pred)print(f"Baseline SVM Accuracy: {accuracy:.2f}")
このモデルのハイパーパラメータのデフォルト値を使用した場合の精度スコアが約0.78であることがわかります。
出力 >>>Baseline SVM Accuracy: 0.78
ここではrandom_state
に24を使用しました。異なるランダムな状態では、異なるトレーニングテスト分割と、それに続く異なる精度スコアが得られます。
したがって、モデルのパフォーマンスを評価するための単一のトレーニングテスト分割よりも優れた方法が必要です。おそらく、多くのこのような分割でモデルをトレーニングして、平均精度を考慮することができます。また、異なるハイパーパラメータの組み合わせも試してみましょう。そのために、モデル評価とハイパーパラメータの検索にクロスバリデーションを使用するのです。以下のセクションでさらに学びます。
次に、このサポートベクターマシン分類器のチューニング可能なハイパーパラメータを特定しましょう。
チューニングするSVMのハイパーパラメーター
ハイパーパラメーターチューニングでは、SVM分類器の最適なハイパーパラメーターの組み合わせを見つけることを目指します。サポートベクトル分類器の一般的にチューニングされるハイパーパラメーターには以下があります:
- C: 正則化パラメーターで、マージンを最大化し、分類エラーを最小化するトレードオフを制御します。
- kernel: 使用するカーネル関数のタイプを指定します(例:「linear」、「rbf」、「poly」)。
- gamma: 「rbf」と「poly」カーネルのカーネル係数です。
交差検証の役割を理解する
交差検証は、モデルが未知のデータに対してどれだけ汎化されるかを評価し、単一のトレインテスト分割に対するオーバーフィットリスクを減らすために役立ちます。一般的に使用されるk折交差検証では、データセットをk個の等しい大きさのフォールドに分割します。モデルはk回トレーニングされ、各フォールドが1回だけバリデーションセットとして使用され、残りのフォールドがトレーニングセットとして使用されます。したがって、各フォールドに対して交差検証精度が得られます。
最適なハイパーパラメーターを見つけるためのグリッドサーチとランダムサーチを実行する際には、最良の平均交差検証スコアに基づいてハイパーパラメーターを選択します。
グリッドサーチとは何ですか?
グリッドサーチは、最良のモデルパフォーマンスを提供するハイパーパラメーターの組み合わせを見つけるために、指定されたハイパーパラメーター空間を徹底的に探索するハイパーパラメーターチューニング技術です。
グリッドサーチの動作原理
ハイパーパラメーターの探索空間をパラメーターグリッドとして定義します。パラメーターグリッドは、各ハイパーパラメーターを探索するための値のリストで指定する辞書です。
グリッドサーチは、パラメーターグリッドから可能なすべてのハイパーパラメーターの組み合わせをシステマティックに探索します。クロスバリデーションを使用して、各組み合わせに対してモデルを適合させ、評価し、最良のパフォーマンスを提供する組み合わせを選択します。
次に、scikit-learnでグリッドサーチを実装しましょう。
Scikit-LearnにおけるGridSearchCV
まず、scikit-learnのmodel_selectionモジュールからGridSearchCV
クラスをインポートします:
from sklearn.model_selection import GridSearchCV
以下のSVM分類器のためのパラメーターグリッドを定義しましょう:
# ハイパーパラメーターグリッドを定義するparam_grid = { 'C': [0.1, 1, 10], 'kernel': ['linear', 'rbf', 'poly'], 'gamma': [0.1, 1, 'scale', 'auto']}
グリッドサーチは、パラメーターグリッドから可能なすべてのハイパーパラメーターの組み合わせをシステマティックに探索します。この例では、以下のモデルのパフォーマンスを評価します:
C
を0.1、1、および10に設定kernel
を「linear」、「rbf」、「poly」に設定gamma
を0.1、1、「scale」、および「auto」に設定
これにより、合計で3 * 3 * 4 = 36の異なる組み合わせの評価が行われます。グリッドサーチは、クロスバリデーションを使用して各組み合わせのモデルを適合させ、評価し、最良のパフォーマンスを提供する組み合わせを選択します。
次に、baseline_svm
のハイパーパラメーターをチューニングするためにGridSearchCV
をインスタンス化します:
# GridSearchCVオブジェクトを作成するgrid_search = GridSearchCV(estimator=baseline_svm, param_grid=param_grid, cv=5)# グリッドのハイパーパラメーターでモデルを適合させるgrid_search.fit(X_train, y_train)
ここで、5つのフォールド交差検証を使用しています。
最後に、グリッドサーチで見つかった最適なハイパーパラメーターを持つ最良のモデルのパフォーマンスをテストデータ上で評価します:
# 最適なハイパーパラメータとモデルを取得します。
best_params = grid_search.best_params
best_model = grid_search.best_estimator_
# 最良のモデルを評価します。
y_pred_best = best_model.predict(X_test)
accuracy_best = accuracy_score(y_test, y_pred_best)
print(f"最良のSVM精度:{accuracy_best:.2f}")
print(f"最適なハイパーパラメータ:{best_params}")
以上のように、モデルは以下のハイパーパラメータで0.94の精度を達成します:
出力 >>>最良のSVM精度:0.94
最適なハイパーパラメータ:{'C': 0.1, 'gamma': 0.1, 'kernel': 'poly'}
グリッドサーチの利点と欠点
ハイパーパラメータの調整におけるグリッドサーチの利点は次のとおりです:
- グリッドサーチは、指定された組み合わせをすべて探索するため、定義された探索空間内の最適なハイパーパラメータを見逃すことがありません。
- ハイパーパラメータの空間が小さい場合には良い選択肢となります。
しかし、一方で以下のような欠点もあります:
- グリッドサーチは計算コストが高くなることがあります。特に大量のハイパーパラメータとその値に対応する場合には、非常に複雑なモデルや広範なハイパーパラメータ探索には適さないかもしれません。
では次に、ランダムサーチについて学びましょう。
ランダムサーチとは?
ランダムサーチは、指定された分布または範囲内でハイパーパラメータのランダムな組み合わせを探索するもう一つのハイパーパラメータ調整手法です。特に大きなハイパーパラメータ探索空間に対して有用です。
ランダムサーチの仕組み
ランダムサーチでは、値のグリッドを指定する代わりに、各ハイパーパラメータについて確率分布または範囲を定義することができます。これにより、はるかに大きなハイパーパラメータ探索空間が生まれます。
ランダムサーチは、これらの分布から固定された数のハイパーパラメータの組み合わせをランダムにサンプリングします。これにより、ランダムサーチは多様なハイパーパラメータの組み合わせを効率的に探索することができます。
Scikit-LearnのRandomizedSearchCV
では、ランダムサーチを使用してベースラインのSVM分類器のパラメータを調整してみましょう。
RandomizedSearchCV
クラスをインポートし、param_dist
を定義します。これははるかに大きなハイパーパラメータ探索空間です:
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import uniform
param_dist = {
'C': uniform(0.1, 10), # 0.1から10の間の一様分布
'kernel': ['linear', 'rbf', 'poly'],
'gamma': ['scale', 'auto'] + list(np.logspace(-3, 3, 50))
}
グリッドサーチと同様に、最適なハイパーパラメータを探索するためにランダムサーチモデルをインスタンス化します。ここではn_iter
を20に設定しており、20のランダムなハイパーパラメータの組み合わせがサンプリングされます。
# RandomizedSearchCVオブジェクトを作成します。
randomized_search = RandomizedSearchCV(estimator=baseline_svm, param_distributions=param_dist, n_iter=20, cv=5)
randomized_search.fit(X_train, y_train)
その後、ランダムサーチで見つかった最善のハイパーパラメータを使用してモデルのパフォーマンスを評価します:
# 最適なハイパーパラメータとモデルを取得します。
best_params_rand = randomized_search.best_params
best_model_rand = randomized_search.best_estimator_
# 最良のモデルを評価します。
y_pred_best_rand = best_model_rand.predict(X_test)
accuracy_best_rand = accuracy_score(y_test, y_pred_best_rand)
print(f"最良のSVM精度:{accuracy_best_rand:.2f}")
print(f"最適なハイパーパラメータ:{best_params_rand}")
最良の精度と最適なハイパーパラメータは以下の通りです:
出力 >>>最良のSVM精度:0.94
最適なハイパーパラメータ:{'C': 9.66495227534876, 'gamma': 6.25055192527397, 'kernel': 'poly'}
ランダム化された検索を通じて見つかったパラメータは、グリッドサーチを通じて見つかったものとは異なります。これらのハイパーパラメータを持つモデルは、正解率のスコア0.94を達成しています。
ランダム化された検索の利点と欠点
ランダム化された検索の利点をまとめてみましょう:
- ランダム化された検索は、ハイパーパラメータの数や値の範囲が広い場合に効率的です。全ての組み合わせを網羅する必要がないためです。
- 連続値や離散値を含むさまざまなパラメータタイプを扱うことができます。
ランダム化された検索のいくつかの制約事項は次のとおりです:
- ランダムな性質のため、常に最適なハイパーパラメータを見つけられるわけではありません。ただし、良い結果を素早く得ることが多いです。
- グリッドサーチとは異なり、すべての組み合わせが探索されることは保証されません。
結論
scikit-learnでのハイパーパラメータチューニングの方法として、RandomizedSearchCV
とGridSearchCV
の実行方法を学びました。そして、最適なハイパーパラメータでモデルの性能を評価しました。
要約すると、グリッドサーチはパラメータグリッド内のすべての可能な組み合わせを徹底的に探索します。一方、ランダム化された検索はハイパーパラメータの組み合わせをランダムにサンプリングします。
これらのテクニックの両方は、機械学習モデルの最適なハイパーパラメータを特定するのに役立ちます。また、特定のトレイン-テスト分割に過剰適合するリスクを軽減します。
[Bala Priya C](https://twitter.com/balawc27)は、インド出身の開発者兼テクニカルライターです。彼女は数学、プログラミング、データサイエンス、コンテンツ作成の交差点での作業が好きです。彼女の関心と専門分野にはDevOps、データサイエンス、自然言語処理が含まれます。彼女は読書、執筆、コーディング、そしてコーヒーが好きです!現在、チュートリアル、ハウツーガイド、意見記事などを執筆して、開発者コミュニティと彼女の知識を共有することに取り組んでいます。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles
- 大きな言語モデルはどれくらい透明性があるのか?
- 「GPTからMistral-7Bへ:AI会話のエキサイティングな進化」
- 「企業におけるAIの倫理とESGへの貢献の探求」
- Google AIがSpectronを導入:スペクトログラムを入力および出力として直接処理する、最初のスポークンランゲージAIモデルとしてエンドツーエンドでトレーニングされたものです
- 「Amazon SageMaker Canvasで構築されたMLモデルをAmazon SageMakerリアルタイムエンドポイントに展開します」
- マシンラーニングの革命:光フォトニックアクセラレータでの3D処理の活用による高度な並列処理とエッジコンピューティングの互換性の実現
- Amazon SageMaker JumpStartを使用した対話型ビジュアル言語処理