ハイパーパラメータ調整:GridSearchCVとRandomizedSearchCVの説明

ハイパーパラメータ調整:GridSearchCVとRandomizedSearchCVを使った効果的なパラメータチューニングの解説

 

訓練するすべての機械学習モデルには、パラメータまたはモデルの係数のセットがあります。機械学習アルゴリズムの目標は、これらのパラメータの最適な値を学習することです。

さらに、機械学習モデルにはハイパーパラメータのセットもあります。例えば、K-最近傍法のKの値、隣人の数です。または、深層ニューラルネットワークを訓練する際のバッチサイズなどです。

これらのハイパーパラメータはモデルによって学習されるのではなく、開発者によって指定されます。これらはモデルの性能に影響を与え、チューニングすることができます。では、これらのハイパーパラメータの最適な値をどのように見つけるのでしょうか?このプロセスはハイパーパラメータの最適化またはハイパーパラメータのチューニングと呼ばれます。

最も一般的なハイパーパラメータのチューニング手法には、次の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でのハイパーパラメータチューニングの方法として、RandomizedSearchCVGridSearchCVの実行方法を学びました。そして、最適なハイパーパラメータでモデルの性能を評価しました。 

要約すると、グリッドサーチはパラメータグリッド内のすべての可能な組み合わせを徹底的に探索します。一方、ランダム化された検索はハイパーパラメータの組み合わせをランダムにサンプリングします。

これらのテクニックの両方は、機械学習モデルの最適なハイパーパラメータを特定するのに役立ちます。また、特定のトレイン-テスト分割に過剰適合するリスクを軽減します。  

[Bala Priya C](https://twitter.com/balawc27)は、インド出身の開発者兼テクニカルライターです。彼女は数学、プログラミング、データサイエンス、コンテンツ作成の交差点での作業が好きです。彼女の関心と専門分野にはDevOps、データサイエンス、自然言語処理が含まれます。彼女は読書、執筆、コーディング、そしてコーヒーが好きです!現在、チュートリアル、ハウツーガイド、意見記事などを執筆して、開発者コミュニティと彼女の知識を共有することに取り組んでいます。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

データサイエンス

「生成AIの組織化:データサイエンスチームから得た5つの教訓」

「経営陣が曖昧な約束をした後、新しいGen AIの機能が組織全体に組み込まれることを利害関係者に約束した後、あなたのタイガ...

データサイエンス

ディープラーニングのマスタリング:分岐推定を使った非線形概算の芸術 パート1

過去の1年間で、私たちはディープラーニングの人気が爆発的に急増しているのを目撃してきましたGPT-4のような大規模な言語モ...

機械学習

「LangChainとは何ですか?利用事例と利点」

LangChainはプログラマが大規模言語モデルを用いてアプリケーションを開発するための人工知能フレームワークです。ライブラリ...

データサイエンス

「二つの頭を持つ分類器の使用例」

実際のコンピュータビジョンタスクの実例について話しましょう初めて見ると、分類問題は非常に単純ですが、それは一部当ては...

機械学習

量産自動運転におけるBEVパーセプション

BEVの認識技術は、ここ数年で非常に進歩しました自動運転車の周りの環境を直接認識することができますBEVの認識技術はエンド...

機械学習

「FlexGenに会おう:GPUメモリが限られている場合に大規模な言語モデル(LLM)を実行するための高スループットな生成エンジン」

大規模言語モデル(LLM)は最近、さまざまなタスクで印象的なパフォーマンスを発揮しています。生成型LLMの推論は以前にない...