アルゴリズムモデルの自動ハイパーパラメータ最適化手法

アルゴリズムモデルの自動ハイパーパラメータ最適化手法

ハイパーパラメータとは何ですか?

学習モデルには、一般的に 2 種類のパラメータがあります。1 つはデータから学習して推定できるもので、パラメータと呼ばれます。データから推定できず、人間の経験に基づいてのみ設計および指定できる別の種類のパラメータがあります。これをハイパーパラメータと呼びます。ハイパーパラメータは、学習プロセスを開始する前に値が設定されるパラメータです。対照的に、他のパラメータの値はトレーニングを通じて学習されます。

ハイパーパラメータ:

複雑さや学習能力など、モデルに関する高レベルの概念を定義することは、標準的なモデルトレーニングプロセスのデータから直接学習することはできず、事前に定義する必要があります。パラメータ空間での検索は、異なる値を設定し、異なるモデルをトレーニングし、より良いテスト値を選択することで決定できます。一般的に、次の部分で構成されます。

  • 推定器(回帰器または分類器)

  • パラメータ空間

  • 候補パラメータのセットを取得するための検索またはサンプリング方法

  • クロス検証メカニズム

  • スコアリング機能

Scikit-Learn におけるハイパーパラメータ最適化手法

機械学習モデルでは、たとえば、ランダムフォレストの決定木の数、人工ニューラルネットワークモデルの隠れ層の数と各層のノードの数、正則化項の定数のサイズなど、すべてを事前に指定する必要があります。ハイパーパラメータが適切に選択されていない場合、アンダーフィッティングまたはオーバーフィッティングの問題が発生する可能性があります。 Scikit-Learn では、ハイパーパラメータは学習プロセスが開始される前に値が設定されるパラメータです。代表的な例としては、サポートベクターマシンの C、カーネル、ガンマなどが挙げられます。

  1. クラスsklearn.svm.SVC(*、C= 1.0 、カーネル= 'rbf' 、次数= 3 、ガンマ= 'scale' 、coef0= 0.0 、縮小=True、確率=False、tol= 0.001 、キャッシュサイズ= 200 、クラス重み=なし、詳細=False、最大イター=- 1 、決定関数シェイプ= 'ovr' 、ブレークタイ=False、ランダム状態=なし)

使用中は、estimator.get_params() を使用して、学習器モデルのハイパーパラメータリストと現在の値を取得できます。

Sklearn は、グリッド検索とランダム検索という 2 つの一般的なハイパーパラメータ最適化手法を提供します。

クロスバリデーション - CV の紹介

機械学習では、一般的に、すべてのデータを使用してモデルをトレーニングすることはできません。そうしないと、モデルを検証してモデルの予測効果を評価するためのデータセットがなくなるからです。この問題を解決するために、一般的に使用される方法は次のとおりです。

検証セットアプローチ

これは最も簡単な方法であり、考えるのも簡単です。データ セット全体を 2 つの部分に分けることができます。1 つはトレーニング用、もう 1 つは検証用で、これらはトレーニング セットとテスト セットと呼ばれることがよくあります。

ただし、この単純なアプローチには 2 つの欠点があります。

  • 最終的なモデルとパラメータの選択は、トレーニング セットとテスト セットをどのように分割するかによって大きく異なります。異なる分割方法では、テスト MSE は大きく異なり、対応する最適次数も異なります。したがって、トレーニング セットとテスト セットを分割する方法が十分でない場合、最適なモデルとパラメータを選択できない可能性が高くなります。

  • この方法では、データの一部のみを使用してモデルをトレーニングします。一般的に、モデルのトレーニングに使用されるデータの量が多いほど、トレーニングされたモデルの品質は向上します。そのため、トレーニング セットとテスト セットを分割すると、手元にあるデータを十分に活用できなくなるため、得られるモデルの効果もある程度影響を受けることになります。

このような背景から、交差検証法であるCross-Validation法が提案されました。

クロス検証

LOOCV (1つを省く)

LOOCV は、Leave-one-out 交差検証の略です。テスト セット アプローチと同様に、LOOCV メソッドでもデータセットをトレーニング セットとテスト セットに分割します。ただし、違いは、テスト セットとして 1 つのデータのみを使用し、残りのデータはトレーニング セットとして使用し、この手順を N 回繰り返すことです (N はデータ セット内のデータ数)。

現在、n 個のデータで構成されるデータ セットがあると仮定すると、LOOCV メソッドでは、テスト セットの唯一の要素として一度に 1 つのデータを取り出し、他の n-1 個のデータはモデルのトレーニングとパラメーターの調整のためのトレーニング セットとして使用されます。その結果、n 個のモデルをトレーニングすることになり、そのたびに MSE が取得されます。最終テスト MSE の計算は、これらの n 個の MSE を平均化することです。

テスト セット アプローチと比較して、LOOCV には多くの利点があります。まず、各データは個別にテストされているため、テスト セットとトレーニング セットの分割方法による影響を受けません。同時に、n-1 データを使用してモデルをトレーニングし、ほぼすべてのデータを使用することで、モデルのバイアスが小さくなることを保証します。しかし、LOOCV の欠点も明らかです。つまり、計算量が大きすぎて、テスト セット アプローチの n-1 倍の時間がかかります。

K 分割交差検証

K 分割交差検証と LOOCV の違いは、各テスト セットに 1 つのデータだけでなく複数のデータが含まれるようになることです。具体的な数は K の選択によって決まります。たとえば、K = 5 の場合、5 分割交差検証に使用する手順は次のようになります。

  • すべてのデータセットを5つの部分に分割する

  • 繰り返しなく毎回サンプルの1つをテストセットとして取り、他の4つのサンプルをトレーニングセットとして使用してモデルをトレーニングし、テストセットでモデルのMSEを計算します。

  • MSE は 5 つの MSE を平均することによって得られます。

LOOCV が実際には特別な K 分割交差検証 (K=N) であることは理解しにくいことではありません。最後に、K の選択はバイアスと分散の間のトレードオフです。 K が大きいほど、毎回トレーニング セットで使用されるデータが多くなり、モデルのバイアスが小さくなります。ただし、K が大きいほど、毎回選択されるトレーニング セット間の相関が大きくなります (最も極端な例として、k = N の場合、つまり LOOCV ではトレーニング データが毎回ほぼ同じである場合を考えてみましょう)。この大きな相関関係により、最終的なテスト エラーの変動が大きくなります。一般的に、K 値は 5 または 10 です。

グリッドサーチCV

ハイパーパラメータを選択する方法は 2 つあります。1) 経験に基づく方法、2) 異なるサイズのパラメータを選択し、モデルに取り入れて、パフォーマンスが最も優れたパラメータを選択する方法です。アプローチ 2 でハイパーパラメータを選択する場合、注意を手動で調整するコストが高すぎるため、価値がありません。 for ループまたは for ループに類似したメソッドは、階層が明確すぎる、シンプルさと柔軟性に欠ける、注意コストが高い、エラーが発生しやすいなどの制限があります。 GridSearchCV は、グリッド検索クロス検証パラメータ調整と呼ばれます。渡されたパラメータのすべての順列と組み合わせを走査し、クロス検証を通じてすべてのパラメータの組み合わせでの評価インデックススコアを返します。

GridSearchCV は非常に印象的ですが、実際にはブルート フォース検索です。この方法は小さなデータセットには役立ちますが、大きなデータセットにはそれほど役立たないことに注意してください。データ量が多い場合は、座標降下法という迅速なチューニング方法を使用できます。これは実際には貪欲なアルゴリズムです。モデルに現在最も大きな影響を与えているパラメータを最適化されるまで調整し、次に最も大きな影響を与えている次のパラメータを調整するというように、すべてのパラメータが調整されるまで繰り返します。この方法の欠点は、グローバル最適値ではなくローカル最適値に調整される可能性があることですが、時間と労力を節約できます。

GridSearchCV 使用方法

  1. クラスsklearn.model_selection.GridSearchCV(estimator、param_grid、scoring=None、n_jobs=None、refit=True、cv= 'warn' 、verbose= 0 、pre_dispatch= '2*n_jobs' 、error_score= 'raise-deprecating' 、return_train_score= 'warn' )

パラメータの詳細:

  • 推定器: 最適に決定する必要のあるパラメータ以外のパラメータを渡す、使用されるモデル。すべてのモデルにはスコアリング メソッドが必要であり、またはスコアリング パラメータを渡す必要があります。

  • param_grid: パラメータを検索するパラメータ辞書。パラメータ値の型は辞書 (dict) または辞書のリスト (list) です。評価するパラメータと対応するパラメータ値を設定するために使用されます。

  • スコアリング: モデルの評価基準。デフォルトは「なし」です。この場合、スコアリング関数を使用する必要があります。または、scoring='roc_auc' を使用すると、選択したモデルに応じて評価基準が異なります。文字列 (関数名) または、関数シグネチャが次のとおりである呼び出し可能なオブジェクト: scorer(estimator, X, y); None の場合、推定器のエラー推定関数が使用されます。次の表は、スコアの可能な値と関数形式を示しています。

  • n_jobs: 並列計算スレッドの数。デフォルト値は 1 ですが、マシンのすべてのプロセッサを最大限に活用するには、-1 (CPU コアの数と一致) に設定できます。

  • refit: デフォルトは True で、プログラムはクロス検証トレーニング セットを使用して最適なパラメータを取得します。つまり、パラメータを検索した後、最適なパラメータ結果を使用してデータセット全体を再度適合させます。

  • cv: クロス検証パラメータ、許容パラメータ:

    • デフォルト値は None で、3 段階のクロス検証を使用します。

    • 折り目の数を指定する

    • CVスプリッター

    • トレーニングおよびテスト データ ジェネレーターを生成します。

  • verbose: ログの詳細度

    • 0: トレーニングプロセスを出力しない

    • 1: 時々出力

    • dayda'y'd1: 各サブモデルの出力

  • pre_dispatch: 分散される並列タスクの合計数を指定します。 n_jobs が 1 より大きい場合、データは実行ポイントごとにコピーされるため、メモリの問題が発生する可能性があります。pre_dispatch パラメータを設定すると、ジョブの合計数を事前に分割して、データが最大で pre_dispatch 回コピーされるようにすることができます。

  • error_score: フィット時にエラーが発生したときに割り当てられる値。「raise」に設定するとエラーが発生します。数値が設定されると、FitFailedWarning 警告メッセージが表示されます。バージョン 22 では、デフォルト値が 'raise' から np.nan に変更されます。

  • return_train_score: 「False」の場合、cv_results_ 属性にはトレーニング スコアは含まれません。

GridSearchCV オブジェクト

  • cv_results_: cv 結果を出力するために使用されます。辞書形式または numpy 形式で出力でき、DataFrame 形式に変換することもできます。

  • best_estimator_: パラメータを検索して得られた最良の推定値。このオブジェクトは、パラメータ refit=False の場合は使用できません。

  • best_score_: float型、最高スコアを出力

  • best_params_: グリッド検索で得られたスコアの最適な対応パラメータ

  • best_index_: 最適な候補パラメータ設定に対応するインデックス (cv_results_ 配列)。 cv_results_['params'][search.best_index_] の辞書は、最高の平均スコア (best_score_) を与える最良のモデルのパラメータ設定を示します。

  • scorer_: スコアリング関数

  • n_splits_: クロス検証の数

  • refit_time_: 再フィットに使用される時間。このオブジェクトは、パラメータ refit=False の場合は使用できません。

GridSearchCV メソッド

  • decision_function(X): 決定関数の値(SVMの決定距離など)を返します。

  • fit(X,y=None,groups=None,fit_params) : データセットのすべてのパラメータの組み合わせを実行します。

  • get_params(deep=True): 推定器のパラメータを返します

  • inverse_transform(Xt):最適なパラメータを持つ推定器に対してinverse_transformを呼び出します。

  • predict(X): 予測値(0/1)を返す

  • predict_log_proba(X): 見つかった最適なパラメータを持つ推定器に対してpredict_log_probaを呼び出します。

  • predict_proba(X): 各カテゴリの確率値を返します(カテゴリが複数ある場合は複数の列の値を返します)

  • score(X, y=None): 関数を返す

  • set_params(**params): この推定器のパラメータを設定します。

  • transform(X): Xの訓練されたパラメータを使用する

使用例:

  1. sklearn.model_selection から GridSearchCVをインポートします
  2. sklearn.svm から SVRをインポートします
  3. sklearnからデータセットをインポートする
  4. データセット = datasets.load_iris()
  5. X = データセット.データ
  6. y = データセット.ターゲット
  7. グリッド = グリッドサーチCV(
  8. 推定器 = SVR(カーネル = 'rbf' )、
  9. パラメータグリッド={
  10. 'C' : [ 0.1 , 1 , 10 , 100 ],
  11. 'イプシロン' : [ 0.0001 , 0.001 , 0.01 , 0.1 , 1 , 10 ],
  12. 'ガンマ' : [ 0.001 , 0.01 , 0.1 , 1 ]
  13. },
  14. cv= 5 、スコアリング= 'neg_mean_squared_error' 、詳細= 0 、n_jobs=- 1 )
  15. グリッドにフィット(X, y)
  16. 印刷(grid.best_score_)
  17. 印刷(grid.best_params_)

ランダム検索 RandomizedSearchCV

ハイパーパラメータを検索するときに、ハイパーパラメータの数が少ない場合(3 個または 4 個以下)は、網羅的な検索方法であるグリッド検索を使用できます。ただし、ハイパーパラメータの数が多い場合は、グリッド検索を使用することになり、検索に必要な時間は指数関数的に増加します。そこで誰かが、ハイパーパラメータ空間内の数十または数百の点をランダムに検索し、その中に比較的小さな値が存在する可能性のあるランダム検索法を提案しました。この方法は上記のスパースグリッド法よりも高速であり、実験ではランダム検索法の結果がスパースグリッド法の結果よりもわずかに優れていることが示されています。

RandomizedSearchCV は GridSearchCV と非常に似ていますが、すべての可能な組み合わせを試すのではなく、各ハイパーパラメータのランダムな値の特定の数のランダムな組み合わせを選択します。この方法には 2 つの利点があります。

パラメータ空間全体と比較すると、選択できるパラメータの組み合わせの数は比較的少なくなります。ランダム検索を実行させると、ハイパーパラメータごとに異なる値を探索します。検索回数を設定することで、各ハイパーパラメータの探索に必要な計算量を簡単に制御できます。パラメータ ノードを追加しても、パフォーマンスに影響はなく、効率も低下しません。 RandomizedSearchCV の使用方法は実際には GridSearchCV と同じですが、パラメータの GridSearchCV のグリッド検索をパラメータ空間でのランダム サンプリングに置き換えます。連続変数を持つパラメータがある場合、RandomizedSearchCV はそれらを分布としてサンプリングしますが、これはグリッド検索では不可能です。その検索能力は、設定された n_iter パラメータに依存します。

RandomizedSearchCV 使用方法

  1. クラスsklearn.model_selection.RandomizedSearchCV(estimator、param_distributions、*、n_iter= 10 、scoring=None、n_jobs=None、refit=True、cv=None、verbose= 0 、pre_dispatch= '2*n_jobs' 、random_state=None、error_score=nan、return_train_score=False)

GridSearchCV との主な違いは、次の 2 つのパラメータです。

  • param_distributions: パラメータ分布、辞書形式。モデルに渡したパラメータを辞書に結合します。検索戦略は次のとおりです。

    • 探索範囲が分布であるハイパーパラメータについては、与えられた分布に従ってランダムにサンプリングする

    • 検索範囲がリストであるハイパーパラメータの場合、サンプリングの確率は指定されたリスト内で等しくなります。

  • n_iter: 300 回トレーニングします。値が大きいほど、パラメータの精度は高くなりますが、検索時間は長くなります。例:


    1. scipy.statsからrandintをsp_randintとしてインポートします
    2. sklearn.model_selection から RandomizedSearchCVをインポートします
    3. sklearn.datasetsからload_digitsをインポートする
    4. sklearn.ensemble から RandomForestClassifierをインポートします
    5. # データを読み込む
    6. 数字 = load_digits()
    7. X, y = 数字.データ、数字.ターゲット
    8. #分類器または回帰器を構築する
    9. clf = ランダムフォレスト分類器(n_estimators= 20 )
    10. # 指定されたパラメータ検索範囲: リストまたは分布
    11. param_dist = { "max_depth" : [ 3 , None], # 指定されたリスト
    12. "max_features" : sp_randint( 1 , 11 ), # 与えられた分布
    13. "min_samples_split" : sp_randint( 2 , 11 ), # 与えられた分布
    14. "bootstrap" : [True, False], # 指定されたリスト
    15. "criterion" : [ "gini" , "entropy" ]} # リストが与えられた場合
    16. # RandomSearch+CVを使用してハイパーパラメータを選択する
    17. n_iter_search = 20
    18. random_search = RandomizedSearchCV(clf、param_distributions=param_dist、n_iter=n_iter_search、cv= 5 、iid=False)
    19. ランダム検索.fit(X, y)
    20. 印刷(ランダム検索.ベストスコア)
    21. 印刷(ランダム検索.ベストパラメータ)

自動ハイパーパラメータ最適化手法

ベイズ最適化

機械学習パラメータ調整のためのベイズ最適化は、J. Snoek (2012) によって提案されました。主なアイデアは、最適化する目的関数 (内部構造や数学的特性を知らなくても入力と出力を指定するだけでよい一般化関数) が与えられた場合、目的関数の事後分布は、事後分布が基本的に真の分布に適合するまで、サンプル ポイントを継続的に追加することによって更新されます (ガウス過程)。簡単に言えば、以前のパラメータの情報を考慮して、現在のパラメータをより適切に調整します。

ベイズ最適化と従来のグリッド検索やランダム検索の違いは次のとおりです。

  • ベイズパラメータ調整はガウス過程を使用し、以前のパラメータ情報を考慮し、事前確率を継続的に更新します。グリッド検索は以前のパラメータ情報を考慮しません。

  • ベイジアンパラメータチューニングは反復回数が少なく高速ですが、グリッド検索は遅く、パラメータが多いと次元爆発につながりやすくなります。

  • ベイズパラメータ調整は非凸問題に対して依然として堅牢であり、グリッド探索は非凸問題に対して局所最適解を容易に得ることができる。

  • ベイズ最適化は、可能な限り少ないステップでグローバル最小値を見つけるための優れたフレームワークを提供します。

入力 x を受け取る関数 c(x) またはモデルを構築してみましょう。次の図は c(x) の形状を示しています。もちろん、オプティマイザーは「目的関数」と呼ばれるこの関数を認識しません。

ベイズ最適化はプロキシ最適化を通じてタスクを完了します。プロキシ関数は、サンプリング ポイントをシミュレートすることによって構築されます (下の図を参照)。

代理関数に基づいて、どの点が最小値になる可能性があるかを大まかに判断できます。次に、これらのポイントの近くでさらにサンプリングが実行され、それに応じてプロキシ関数が更新されます。

各反復で、現在の代理関数を継続的に観察し、サンプリングを通じて興味深い領域についてさらに学習し、関数を更新します。代理関数は、評価コストを大幅に削減する方法で数学的に表現できることに注意することが重要です。関数の形状が非常に奇妙でない限り、一定回数の反復を繰り返すと、必ずグローバル最小値に到達します。

代理関数を詳しく見てみましょう。代理関数は通常、ガウス過程によって表されます。代理関数は、サイコロを振って、1 から 6 までの数字ではなく、指定されたデータ ポイント (sin、log など) に適合する関数を返すものと考えることができます。このプロセスは複数の関数を返しますが、それらすべてには確率が関連付けられています。代替関数をモデル化するために他の曲線フィッティング方法ではなくガウス過程が使用されるのには十分な理由があります。それは、それが本質的にベイズ的であるからです。確率分布、事前分布として表現される代理関数は、「獲得関数」として更新されます。この機能は、探索と活用のトレードオフにおいて新しいテスト ポイントを提案する役割を担います。

  • 「活用」は、代理モデルによって予測されたターゲットが適切な場所をサンプリングしようとします。これはすべて、既知の有望なスポットを活用することです。しかし、すでにある領域を十分に調査してしまった場合、すでに知っていることを継続的に活用しても得られるものはほとんどありません。

  • 探索では、不確実性が高い場所をサンプリングしようとします。これにより、宇宙の主要な領域が未探索のまま残されることがなくなり、グローバル最小値がそこにある可能性があります。

過剰な利用と過剰な探索を促す獲得関数では、モデルは最初に見つけた最小値(多くの場合、局所的 - 「光があるところだけに進む」)にのみ留まることになります。その逆を奨励するフェッチ関数は、最初にローカルまたはグローバルの最小値に落ち着くことはありません。微妙なバランスで良い結果を生み出します。獲得関数(a(x) と表記)では、活用と探索の両方を考慮する必要があります。一般的な獲得関数には、期待改善と最大改善確率が含まれます。これらはすべて、事前情報 (ガウス過程) を与えられた場合に特定の入力が将来的に成果を上げる確率を測定します。

これらをまとめてみましょう。ベイズ最適化は次のように実行できます。

  1. ガウス過程「代理関数」の事前分布を初期化します。

  2. 現在の事前分布で動作する取得関数a(x)を最大化するいくつかのデータポイントxを選択します。

  3. データ ポイント x で目的コスト関数 c(x) を評価し、結果 y を取得します。

  4. 新しいデータを使用してガウス過程事前分布を更新し、事後分布(次のステップの事前分布になる)を生成します。

  5. 複数の反復については、手順 2 ~ 5 を繰り返します。

  6. 現在のガウス過程分布(非常に安価)を解釈して、グローバル最小値を見つけます。

ベイズ最適化とは、置換最適化の考え方の背後に確率論の考え方を組み込むことです。要約すれば:

  • 代理最適化では、代理関数または近似関数を使用して、サンプリングを通じて目的関数を推定します。

  • ベイズ最適化は、代理最適化を確率的フレームワークに配置し、代理関数を新しい情報に基づいて更新できる確率分布として表します。

  • 取得関数は、探索と開発のバランスを取りながら、現在知られている事前の条件下で探索空間内のポイントが「良好な」収益を生み出す確率を評価するために使用されます。

  • ベイズ最適化は、主に目的関数の評価コストが非常に高い場合に使用され、ハイパーパラメータのチューニングによく使用されます。

ハイパーオプト

Hyperopt は、jamesbergstra によって開発された、ハイパーパラメータ最適化のための強力な Python ライブラリです。 Hyperopt は、パラメータの調整にベイズ最適化の形式を使用し、特定のモデルに最適なパラメータを取得できるようにします。広範囲の条件にわたって数百のパラメータを持つモデルを最適化できます。

Hyperoptには4つの重要な機能が含まれています

1. 探索空間

Hyperopt には、入力パラメータの範囲を指定するためのさまざまな関数があり、これらはランダムな検索空間です。最も一般的な検索オプションを選択します:

  • choice(label, options) - これはカテゴリ引数に使用でき、オプションの 1 つを返します。これはリストまたはタプルである必要があります。例: hp.choice("criterion",["gini","entropy",])

  • randint(label, upper) - 整数引数とともに使用でき、範囲 (0, upper) 内のランダムな整数を返します。例: hp.randint("max_features",50)

  • universe(label, low, high) − low と high の間の値を返します。例: hp.uniform("max_leaf_nodes",1,10)

使用できるその他のオプションは次のとおりです。

  • normal(label, mu, sigma) - 平均muと標準偏差sigmaの正規分布に従う実数値を返します。

  • qnormal(label, mu, sigma, q) - round(normal(mu, sigma) / q) * q に似た値を返します。

  • lognormal(label, mu, sigma) - exp(normal(mu, sigma)) を返します

  • qlognormal(label, mu, sigma, q) - round(exp(normal(mu, sigma)) / q) * q に似た値を返します。

2. 目的関数

これは、探索空間からハイパーパラメータ値を入力として受け取り、損失を返す最小化関数です。つまり、最適化プロセス中に、選択されたハイパーパラメータ値を使用してモデルをトレーニングし、ターゲット機能を予測し、予測誤差を評価してオプティマイザーに返します。オプティマイザーはどの値をチェックするかを決定し、再度繰り返します。実際の例を使用して目的関数を作成する方法を学習します。

3. f分

  • fmin 関数は、さまざまなアルゴリズムとそのハイパーパラメータのセットを反復処理し、目的関数を最小化する最適化関数です。 fmin には 5 つの入力があります。

  • 目的関数を最小化する

  • 定義された検索空間

  • 使用される検索アルゴリズムは、ランダム検索、TPE (Tree-Parzen 推定器)、および適応型 TPE です。注: rand.suggest と hyperopt.tpe.suggest は、ハイパーパラメータ空間の順次検索のロジックを提供します。

  • 評価の最大数

  • トライアルオブジェクト(オプション)

4. 被験者

Trials オブジェクトは、すべてのハイパーパラメータ、損失、およびその他の情報を保存するために使用されます。つまり、最適化を実行した後にそれらにアクセスできます。さらに、トライアルは重要な情報を保存して読み込み、最適化プロセスを続行するのに役立ちます。

Hyperoptの使用

Hyperopt の重要な機能を理解した後、次に Hyperopt の使用方法を紹介します。

  • 検索するスペースを初期化する

  • 目的関数を定義する

  • 使用する検索アルゴリズムを選択してください

  • ハイパーオプト関数を実行する

  • テストオブジェクトに保存された評価出力を分析する

  1. sklearnからデータセットをインポートする
  2. hyperopt から fmin、tpe、hp、STATUS_OK、トライアルをインポートします
  3. sklearn.neighbors から KNeighborsClassifierをインポートします
  4. sklearn.model_selection から cross_val_scoreをインポートします
  5. アイリス = datasets.load_iris()
  6. X = アイリスデータ
  7. y = アイリスターゲット
  8. def hyperopt_train_test(パラメータ):
  9. clf = KNeighborsClassifier(**パラメータ)
  10. cross_val_score(clf, X, y).mean()を返す
  11. # パラメータ空間を定義する
  12. スペース_knn = {
  13. 'n_neighbors' : hp.choice( 'n_neighbors' , 範囲( 1 , 100 ))
  14. }
  15. # 最小化関数(目的関数)を定義する
  16. fn_knn(パラメータ):
  17. acc = hyperopt_train_test(パラメータ)
  18. return { 'loss' : -acc, 'status' : STATUS_OK} # hyperopt は関数を最小化するため、acc に負の符号が追加されます
  19. # Trial オブジェクトをインスタンス化し、モデルを微調整して、ハイパーパラメータ値とともに最適な損失を出力します。
  20. トライアル = トライアル()
  21. ベスト = fmin(fn_knn, space_knn, algo=tpe.suggest, max_evals= 100 , trials=trials)
  22. print( "ベスト: {}" .format(best))
  23. print(trials.results) # 検索中に「objective」によって返された辞書のリスト。

algo は検索アルゴリズムを指定します。現在、次のアルゴリズムがサポートされています。

  • ランダム検索 (hyperopt.rand.suggest)

  • シミュレーテッドアニーリング (hyperopt.anneal.suggest)

  • TPE アルゴリズム (tpe.suggest、アルゴリズムの正式名称は Tree-structured Parzen Estimator Approach)

Hyperopt に加えて、ベイズ最適化手法用の Python パッケージには次のものがあります。

  • 出典: github.com

  • https://github.com/fmfn/ベイジアン最適化

  • https://github.com/HIPS/スペアミント

遺伝的アルゴリズム

遺伝的アルゴリズムは、自然選択のメカニズムを機械学習のコンテキストに適用しようとします。これはダーウィンの自然選択のプロセスに触発されたもので、進化アルゴリズムとも呼ばれます。いくつかの定義済みハイパーパラメータを使用して N 個の機械学習モデルを作成するとします。次に、各モデルの精度を計算し、モデルの半分だけ(パフォーマンスが最も優れたモデル)を保持することを決定できます。ここで、最良のモデルと同様のハイパーパラメータを持つ子孫を生成し、再び N 個のモデルの集団を取得できます。この時点で、各モデルの精度を再度計算し、定義されたエポックに対してサイクルを繰り返すことができます。この方法では、プロセスの最後には最良のモデルだけが残ります。

TPOT は、機械学習パイプラインを最適化するための遺伝的アルゴリズムに基づく Python 自動機械学習ツールです。簡単に言えば、TPOT は何千ものパイプラインをインテリジェントに探索してデータセットに最適なパイプラインを見つけ、機械学習の最も面倒な部分を実行します。

さらに重要なのは、TPOT が検索を完了すると、TPOT は Python コードも提供するということです。このコードを通じて、TPOT が最適なパフォーマンスを達成したときのパイプラインの具体的な内容を知ることができ、その後の変更に非常に便利です。

TPOT は、sklearn をベースにしたパッケージ ライブラリです。主に sklearn のモデル関連モジュール、処理モジュール、および feature_selection モジュールをカプセル化しているため、TPOT の主な機能は、パイプラインを使用してモデルのデータ前処理、機能選択、およびモデル選択を完了することに重点を置くことです。さらに、TPOT はすでに xgboost をサポートしていることもわかりました。

TPOT はハイパーパラメータの選択に従来のグリッド検索ではなく遺伝的アルゴリズムを使用しますが、デフォルトの初期値がランダムであるため、TPOT によって最終的に選択されるモデルは、少数の進化 (反復) の後で異なることがよくあります。

計算効率の問題。著者はコード内に次のように書いています: 進化 (反復) が増え、各世代に保持される個体が増えるほど、最終的なモデル スコアは高くなります。しかし、これには非常に時間がかかることもあります。かなり複雑なデータセットを使用する場合や、TPOT を短時間実行する場合、TPOT の実行ごとにパイプラインの推奨事項が異なる場合があります。 TPOT の最適化アルゴリズムは本質的に確率的であり、つまり、ランダム性 (部分的) を使用して、可能なパイプラインの空間を検索します。 2 回の TPOT 実行で異なるパイプラインが推奨された場合、これは、時間不足のために TPOT 実行が収束しなかったか、データセットに対して複数のパイプラインがほぼ同じ回数実行されたことを意味します。これは実際には固定グリッド検索手法よりも優れています。TPOT は、これまで考えたこともなかったパイプライン構成を探索することで特定の機械学習の問題を解決する方法についてのアイデアを提供し、その後の微調整をグリッド検索などのより制約のあるパラメータ調整手法に任せるアシスタントです。

TPOT (バージョン 0.9.5) を使用してモデルを開発する場合は、次の点に留意する必要があります。

  • TPOT をモデリングに使用する前に、必要なデータクリーニングと特徴エンジニアリング操作が必要です。

  • TPOT は現在、教師あり学習のみを実行できます。

  • 現在 TPOT でサポートされている分類器には、主にベイズ、決定木、アンサンブル ツリー、SVM、KNN、線形モデル、xgboost が含まれます。

  • 現在 TPOT でサポートされている回帰モデルには、主に決定木、統合木、線形モデル、xgboost が含まれます。

  • TPOT は、入力データに対して、2 値化、クラスタリング、次元削減、標準化、正則化、ワンホット エンコーディングなどのさらなる処理操作を実行します。

  • モデル効果に応じて、TPOT は、ツリー モデル ベース、分散ベース、F 値ベースのパーセンテージなど、入力機能に対して機能選択操作を実行します。

  • トレーニングプロセスは、export()メソッドを介してsklearnパイプラインの形式で.pyファイルとしてエクスポートできます。

サンプルコード:

  1. tpotからTPOTClassifierをインポートする
  2. sklearn.datasetsからload_irisをインポートする
  3. sklearn.model_selection から train_test_splitをインポートします
  4. アイリス = load_iris()
  5. X = アイリスデータ
  6. y = アイリスターゲット
  7. X_train、X_test、y_train、y_test = train_test_split(X、y、test_size= 0.2 )
  8. tpot = TPOTClassifier(世代数= 5 、人口サイズ= 50 、詳細度= 2 、n_jobs=- 1 )
  9. tpot.fit(X_train、y_train) を使います。
  10. tpot.score(X_test, y_test) を印刷します。

TPOT の主なパラメータは次のとおりです。

  • 世代 – 子孫(新しい個体)を作成するための反復回数を決定します

  • population_size – 作成する個体の初期数(子孫を作成するために使用されます)

  • offspring_size – 各世代で作成する新しい個体の数

  • 突然変異率 – プロパティ値のランダムな変化が発生する確率(初期集団では利用できない可能性のある新しいパラメータを含む)

  • crossover_rate – 子孫を作るために使われる個体の割合

この反復プロセスを使用して、最適な構成を選択します。遺伝的アルゴリズムを準備した結果は、通常、初期状態に依存します。したがって、ランダムに生成される初期集団が出力に影響し、同じ設定を再実行すると異なる結果が出力される可能性があります。

<<:  2021 年に備えるべきビジネス インテリジェンスのトレンド トップ 10

>>:  調査 | AIと機械自動化が社会に与える影響に関する世界の見解

ブログ    

推薦する

マイクロソフトがAR仮想「翻訳機」をデモ、将来の翻訳業界に影響を与える

7月22日のニュース:AR技術は継続的な発展により、徐々に成熟してきました。他の新しいテクノロジーと...

マイクロソフト、AIシステムツール「Counterfit」のソースコードを公開

最近、マイクロソフトは、開発者が AI および機械学習システムのセキュリティをテストできるように設計...

于聖奇:顔認識技術のリスクと法的規制

デジタル時代の到来により、顔認識技術の開発は大きく進歩しました。顔認識技術は普及し、多くの分野で広く...

...

ドローン操縦開始!この国は迎撃のための航空システムを開発している

ドローンはハイテク製品として、遠隔操作が可能で、移動が地形に制限されないことから、技術愛好家や写真愛...

...

...

AI、機械学習、ディープラーニングの謎を解く

ディープラーニング、機械学習、人工知能 — これらの流行語は分析の未来を表しています。この記事では、...

...

Baidu PaddlePaddleがHuawei Kirinと提携し、中国のAIの道を歩む

7月3日、北京で開催されたBaidu Create 2019 Baidu AI Developer ...

...

ジェネレーティブ AI 初心者ガイド

ソフトウェア アーキテクトとして、私は人工知能 (AI) の発展とさまざまな業界でのその応用を目の当...

RPA大手UiPath独占インタビュー:やがて「1人1台ロボット」の時代が到来

【51CTO.comオリジナル記事】 【はじめに】 2019年後半、RPAは一気に普及したように思わ...

...