[[396168]] 機械学習アルゴリズムには、特定のデータセットに合わせて調整できるハイパーパラメータがあります。 ハイパーパラメータの効果は一般的に理解されていますが、データセットへの具体的な影響や学習中の相互作用は不明な場合があります。したがって、機械学習プロジェクトの一環として、アルゴリズムのハイパーパラメータの値を調整することが重要です。 ハイパーパラメータは、グリッド検索やランダム検索などの単純な最適化アルゴリズムを使用して調整されることが多いです。別のアプローチは、ランダム化ヒルクライミングなどのランダム化最適化アルゴリズムを使用することです。 このチュートリアルでは、機械学習アルゴリズムのハイパーパラメータを手動で最適化する方法を学びます。このチュートリアルを完了すると、次のことが分かります。 - ハイパーパラメータの最適化には、グリッドとランダム検索の代わりにランダム化最適化アルゴリズムを使用できます。
- ランダム化ヒルクライミングを使用してパーセプトロン アルゴリズムのハイパーパラメータを調整する方法。
- XGBoost 勾配ブースティング アルゴリズムのハイパーパラメータを手動で最適化する方法。
チュートリアルの概要このチュートリアルは、次の 3 つの部分に分かれています。 - 手動ハイパーパラメータ最適化
- パーセプトロンハイパーパラメータ最適化
- XGBoost ハイパーパラメータの最適化
手動ハイパーパラメータ最適化機械学習モデルには、データセットに合わせてモデルをカスタマイズするために設定する必要があるハイパーパラメータがあります。通常、ハイパーパラメータがモデルに及ぼす一般的な影響はわかっていますが、特定のデータセットと相互作用するハイパーパラメータの組み合わせに対してハイパーパラメータを最適に設定する方法は困難です。より良いアプローチは、モデルのハイパーパラメータのさまざまな値を客観的に検索し、特定のデータセットでモデルに最適なパフォーマンスをもたらすサブセットを選択することです。これはハイパーパラメータ最適化またはハイパーパラメータチューニングと呼ばれます。使用できる最適化アルゴリズムは多岐にわたりますが、最も単純で一般的な 2 つの方法はランダム検索とグリッド検索です。 ランダム検索。検索空間をハイパーパラメータ値の境界付きドメインとして定義し、このドメイン内のポイントをランダムにサンプリングします。 グリッド検索。検索空間をハイパーパラメータ値のグリッドとして定義し、グリッド内の各位置を評価します。 グリッド検索は、一般的にパフォーマンスが良いドローチェックの組み合わせに最適です。ランダム検索は、直感的に推測できないハイパーパラメータの組み合わせを発見して取得するのに最適ですが、通常は実行に時間がかかります。 ハイパーパラメータ調整のためのグリッドおよびランダム検索の詳細については、チュートリアルを参照してください。 ランダム検索とグリッド検索によるハイパーパラメータの最適化 https://machinelearningmastery.com/hyperparameter-optimization-with-random-search-and-grid-search/ グリッド検索とランダム検索は、任意の最適化を使用して機械学習アルゴリズムのパフォーマンスを調整するために使用できる基本的な最適化アルゴリズムです。たとえば、確率的最適化アルゴリズムが使用される場合があります。これは、良好または優れたパフォーマンスが要求され、モデルを調整するための十分なリソースが利用できる場合に適しています。次に使い方を見てみましょう パーセプトロンハイパーパラメータ最適化パーセプトロン アルゴリズムは、最も単純なタイプの人工ニューラル ネットワークです。これは、2 クラス分類問題に使用できる単一ニューロンのモデルであり、後でより大きなネットワークを開発するための基礎を提供します。このセクションでは、パーセプトロン モデルのハイパーパラメータを手動で最適化する方法について説明します。まず、モデルを最適化するための焦点として使用できる合成バイナリ分類問題を定義しましょう。 make_classification() 関数を使用して、1,000 行と 5 つの入力変数を持つバイナリ分類問題を定義できます。次の例では、データセットを作成し、データの形状を要約します。 - # バイナリ分類データセットを定義する
- sklearn.datasets から make_classification をインポートします
- #データセットを定義する
- X, y = make_classification ( n_samples = 1000 、 n_features = 5 、 n_informative = 2 、 n_redundant = 1 、 random_state = 1 )
- # データセットの形状を要約する
- print(X.shape, y.shape)
例を実行すると、作成されたデータセットの形状が出力され、期待どおりであることが確認されます。 - (1000, 5) (1000,)
scikit-learn は、Perceptron クラスを通じてパーセプトロン モデルの実装を提供します。 モデルのハイパーパラメータを調整する前に、デフォルトのハイパーパラメータを使用してパフォーマンス ベースラインを確立できます。 RepeatedStratifiedKFold クラスを介して、繰り返し層別 k 分割クロス検証という優れた方法を使用してモデルを評価します。以下に、合成バイナリ分類データセットでデフォルトのハイパーパラメータを使用してパーセプトロン モデルを評価する完全な例を示します。 - # バイナリ分類のためのパーセプトロンのデフォルトハイパーパラメータ
- numpyからの平均をインポート
- numpyからstdをインポート
- sklearn.datasets から make_classification をインポートします
- sklearn.model_selection から cross_val_score をインポートします
- sklearn.model_selection から RepeatedStratifiedKFold をインポートします
- sklearn.linear_model から Perceptron をインポートします
- #データセットを定義する
- X, y = make_classification ( n_samples = 1000 、 n_features = 5 、 n_informative = 2 、 n_redundant = 1 、 random_state = 1 )
- # モデルを定義する
- モデル=パーセプトロン()
- # 評価手順を定義する
- cv = RepeatedStratifiedKFold ( n_splits = 10 、 n_repeats = 3 、 random_state = 1 )繰り返し階層化Kフォールド
- # モデルを評価する
- スコア= cross_val_score (モデル、X、y、スコアリング= '精度' 、 cv cv =cv、 n_jobs =-1)
- # レポート結果
- print('平均精度: %.3f (%.3f)' % (mean(scores), std(scores)))
サンプルレポートを実行すると、モデルが評価され、分類精度の平均と標準偏差が報告されます。 注意: アルゴリズムや評価手順の確率的特性、または数値精度の違いにより、結果が異なる場合があります。例を複数回実行し、平均結果を比較することを検討してください。 この場合、デフォルトのハイパーパラメータを持つモデルは約 78.5% の分類精度を達成していることがわかります。 最適化されたハイパーパラメータを使用することで、これよりも優れたパフォーマンスを実現できることを期待しています。 - 平均精度: 0.786 (0.069)
次に、ランダム化ヒルクライミングアルゴリズムを使用して、パーセプトロン モデルのハイパーパラメータを最適化します。最適化できるハイパーパラメータは多数ありますが、ここではモデルの学習動作に最も大きな影響を与える可能性が高い 2 つのパラメータに焦点を当てます。彼らです: 学習率は、予測誤差に基づいてモデルがどの程度更新されるかを制御し、学習の速度を制御します。 eta のデフォルト値は 1.0 です。適切な値は 0 より大きく (たとえば、1e-8 または 1e-10 より大きい)、おそらく 1.0 より小さい必要があります。デフォルトでは、Perceptron は正則化を使用しませんが、学習中に L1 正則化と L2 正則化の両方を適用する「エラスティック ネット」正則化を有効にします。これにより、モデルはより小さなモデル重みを求めるようになり、パフォーマンスが向上する傾向があります。正規化の重みを制御する「アルファ」ハイパーパラメータを調整します。これは学習の量に影響します。 0.0 に設定すると、正規化が使用されていないかのようになります。適切な値は 0.0 ~ 1.0 です。まず、最適化アルゴリズムの目的関数を定義する必要があります。平均分類精度と反復層別 k 分割交差検証を使用して構成を評価します。設定の精度を最大限に高めるよう努めてまいります。次の Objective() 関数は、データセットと構成値のリストを取得してこれを実装します。設定値(学習率と正則化の重み)をアンパックし、それを使用してモデルを設定し、モデルを評価して平均精度を返します。 - # 目的関数
- def目標値(X, y, cfg):
- # 設定を解凍する
- η、アルファ= cfg
- # モデルを定義する
- モデル=パーセプトロン(ペナルティ= 'elasticnet' 、アルファアルファ=alpha、イータeta0 =eta)
- # 評価手順を定義する
- cv = RepeatedStratifiedKFold ( n_splits = 10 、 n_repeats = 3 、 random_state = 1 )繰り返し階層化Kフォールド
- # モデルを評価する
- スコア= cross_val_score (モデル、X、y、スコアリング= '精度' 、 cv cv =cv、 n_jobs =-1)
- # 平均精度を計算する
- 結果=平均(スコア)
- 結果を返す
次に、検索空間内でステップを踏む関数が必要です。検索空間は 2 つの変数 (eta と alpha) によって定義されます。検索空間内のステップは、前の値と何らかの関係を持ち、適切な値(たとえば、0 から 1 の間)にバインドされている必要があります。 「ステップ サイズ」ハイパーパラメータを使用して、アルゴリズムが既存の構成からどの程度移動できるかを制御します。新しい構成は、現在の値を分布の平均とし、ステップ サイズを分布の標準偏差とするガウス分布を使用して確率的に選択されます。ガウス分布の乱数を生成するには、NumPy 関数 randn() を使用できます。以下の step() 関数はこれを実装し、検索空間内でステップを実行し、既存の構成を使用して新しい構成を生成します。 - # 検索スペースに一歩踏み出す
- def step(cfg, step_size):
- # 設定を解凍する
- η、アルファ= cfg
- # ステップ η
- new_eta = eta + randn() * ステップサイズ
- # ηの境界をチェックする
- new_eta < = 0.0の場合:
- 新しい_eta = 1e -8
- # ステップアルファ
- new_alpha = alpha + randn() * step_size
- # アルファの境界をチェックする
- new_alpha <の場合 0.0:
- 新しいアルファ= 0.0
- # 新しい設定を返す
- [new_eta, new_alpha]を返す
次に、ランダム化ヒルクライミングアルゴリズムを実装する必要があります。このアルゴリズムでは、Objective() 関数を呼び出して候補ソリューションを評価し、step() 関数を呼び出して検索空間でステップを実行します。検索は、ランダムな初期ソリューションを生成することから始まります。この場合、eta 値と alpha 値は 0 ~ 1 の範囲になります。その後、最初のソリューションが評価され、現在最も有効なソリューションとみなされます。 - # 検索の開始点
- 解= [rand(), rand()]
- # 初期点を評価する
- solution_eval =目標値(X, y, 解)
次に、アルゴリズムは、検索に提供されるハイパーパラメータである固定回数だけ反復します。各反復では、手順を実行し、新しい候補ソリューションを評価する必要があります。 - # 一歩踏み出す
- 候補=ステップ(ソリューション、ステップサイズ)
- # 候補ポイントを評価する
- candidate_eval =目標値(X, y, 候補値)
新しいソリューションが現在機能しているソリューションよりも優れている場合は、それが新しい現在機能しているソリューションとみなされます。 - # 新しいポイントを保持するかどうかを確認します
- 候補評価> = 解決評価の場合:
- # 新しいポイントを保存する
- 解決策、 solution_eval =候補、candidate_eval
- # 進捗状況を報告する
- print(' > %d, cfg =%s %.5f' % (i, solution, solution_eval))
検索の最後に、最適なソリューションとそのパフォーマンスが返されます。これらすべてをまとめると、次の hillclimbing() 関数は、データセット、目的関数、反復回数、およびステップ サイズをパラメーターとして受け取り、パーセプトロン アルゴリズムを調整するために使用されるランダム化ヒル クライミング アルゴリズムを実装します。 - # ヒルクライミング局所探索アルゴリズム
- def hillclimbing(X, y, 目的, n_iter, ステップサイズ):
- # 検索の開始点
- 解= [rand(), rand()]
- # 初期点を評価する
- solution_eval =目標値(X, y, 解)
- # ヒルクライムを走る
- iが範囲内(n_iter)の場合:
- # 一歩踏み出す
- 候補=ステップ(ソリューション、ステップサイズ)
- # 候補ポイントを評価する
- candidate_eval =目標値(X, y, 候補値)
- # 新しいポイントを保持するかどうかを確認します
- 候補評価> = 解決評価の場合:
- # 新しいポイントを保存する
- 解決策、 solution_eval =候補、candidate_eval
- # 進捗状況を報告する
- print(' > %d, cfg =%s %.5f' % (i, solution, solution_eval))
- [ソリューション、ソリューション評価] を返す
その後、アルゴリズムを呼び出して検索結果を報告できます。この場合、アルゴリズムを 100 回繰り返し実行し、試行錯誤の末に選択されたステップ サイズ 0.1 を使用します。 - # 合計反復回数を定義する
- 反復回数= 100
- # 探索空間のステップサイズ
- ステップサイズ= 0.1
- # ヒルクライミング検索を実行する
- cfg、スコア=ヒルクライミング(X、y、目標、n_iter、ステップサイズ)
- print('完了しました!')
- print(' cfg =%s: 平均精度: %f' % (cfg, スコア))
すべてをまとめると、パーセプトロン アルゴリズムを手動で調整する完全な例が次のようになります。 - # バイナリ分類のパーセプトロンハイパーパラメータを手動で検索する
- numpyからの平均をインポート
- numpy.randomからrandnをインポート
- numpy.randomからrandをインポート
- sklearn.datasets から make_classification をインポートします
- sklearn.model_selection から cross_val_score をインポートします
- sklearn.model_selection から RepeatedStratifiedKFold をインポートします
- sklearn.linear_model から Perceptron をインポートします
- # 目的関数
- 定義目標(X, y, cfg):
- # 設定を解凍する
- η、アルファ= cfg
- # モデルを定義する
- モデル=パーセプトロン(ペナルティ= 'elasticnet' 、アルファアルファ=alpha、イータeta0 =eta)
- # 評価手順を定義する
- cv = RepeatedStratifiedKFold ( n_splits = 10 、 n_repeats = 3 、 random_state = 1 )繰り返し階層化Kフォールド
- # モデルを評価する
- スコア= cross_val_score (モデル、X、y、スコアリング= '精度' 、 cv cv =cv、 n_jobs =-1)
- # 平均精度を計算する
- 結果=平均(スコア)
- 結果を返す
- # 検索スペースに一歩踏み出す
- def step(cfg, step_size):
- # 設定を解凍する
- η、アルファ= cfg
- # ステップ η
- new_eta = eta + randn() * ステップサイズ
- # ηの境界をチェックする
- new_eta < = 0.0の場合:
- 新しい_eta = 1e -8
- # ステップアルファ
- new_alpha = alpha + randn() * step_size
- # アルファの境界をチェックする
- new_alpha <の場合 0.0:
- 新しいアルファ= 0.0
- # 新しい設定を返す
- [new_eta, new_alpha]を返す
- # ヒルクライミング局所探索アルゴリズム
- def hillclimbing(X, y, 目的, n_iter, ステップサイズ):
- # 検索の開始点
- 解= [rand(), rand()]
- # 初期点を評価する
- solution_eval =目標値(X, y, 解)
- # ヒルクライムを走る
- iが範囲内(n_iter)の場合:
- # 一歩踏み出す
- 候補=ステップ(ソリューション、ステップサイズ)
- # 候補ポイントを評価する
- candidate_eval =目標値(X, y, 候補値)
- # 新しいポイントを保持するかどうかを確認します
- 候補評価> = 解決評価の場合:
- # 新しいポイントを保存する
- 解決策、 solution_eval =候補、candidate_eval
- # 進捗状況を報告する
- print(' > %d, cfg =%s %.5f' % (i, solution, solution_eval))
- [ソリューション、ソリューション評価] を返す
- #データセットを定義する
- X, y = make_classification ( n_samples = 1000 、 n_features = 5 、 n_informative = 2 、 n_redundant = 1 、 random_state = 1 )
- # 合計反復回数を定義する
- 反復回数= 100
- # 探索空間のステップサイズ
- ステップサイズ= 0.1
- # ヒルクライミング検索を実行する
- cfg、スコア=ヒルクライミング(X、y、目標、n_iter、ステップサイズ)
- print('完了しました!')
- print(' cfg =%s: 平均精度: %f' % (cfg, スコア))
例を実行すると、各検索中に改善が見られるため、構成と結果が報告されます。実行の最後に、最適な構成と結果が報告されます。 注意: アルゴリズムや評価手順の確率的特性、または数値精度の違いにより、結果が異なる場合があります。例を複数回実行し、平均結果を比較することを検討してください。 この場合、学習率を 1 よりわずかに高い 1.004 に、正則化重みを約 0.002 にすると最良の結果が得られ、平均精度は約 79.1% となり、デフォルト設定の精度約 78.5% よりも優れていることがわかります。 - > 0、 cfg =[0.5827274503894747、0.260872709578015] 0.70533
- > 4、 cfg =[0.5449820307807399、0.3017271170801444] 0.70567
- > 6、 cfg =[0.6286475606495414、0.17499090243915086] 0.71933
- > 7、 cfg =[0.5956196828965779、0.0] 0.78633
- > 8、 cfg =[0.5878361167354715、0.0] 0.78633
- > 10、 cfg =[0.6353507984485595、0.0] 0.78633
- > 13、 cfg =[0.5690530537610675、0.0] 0.78633
- > 17、 cfg =[0.6650936023999641、0.0] 0.78633
- > 22、 cfg =[0.9070451625704087、0.0] 0.78633
- > 23、 cfg =[0.9253366187387938、0.0] 0.78633
- > 26、 cfg =[0.9966143540220266、0.0] 0.78633
- > 31、 cfg =[1.0048613895650054、0.002162219228449132] 0.79133
- 終わり!
- cfg =[1.0048613895650054, 0.002162219228449132]: 平均精度: 0.791333
ランダム化ヒルクライミング法を使用して単純な機械学習アルゴリズムのハイパーパラメータを調整する方法がわかったので、XGBoost などのより高度なアルゴリズムを調整する方法を見てみましょう。 XGBoost ハイパーパラメータの最適化XGBoost は Extreme Gradient Boosting の略で、確率的勾配ブースティング機械学習アルゴリズムの効果的な実装です。確率的勾配ブースティング アルゴリズム (勾配ブースティング マシンまたはツリー ブースティングとも呼ばれます) は、さまざまな困難な機械学習の問題に対して優れたパフォーマンス、またはクラス最高のパフォーマンスを発揮する強力な機械学習手法です。まず、XGBoost ライブラリをインストールする必要があります。次のように pip を使用してインストールできます。 - sudo pip xgboostをインストールします
インストールが完了したら、次のコマンドを実行して、正常にインストールされ、最新バージョンを使用していることを確認できます。 - #xgブースト
- xgboostをインポートする
- print("xgboost", xgboost.__version__)
コードを実行すると、次のバージョン番号以上が表示されます。 - xgboost 1.0.1
XGBoost ライブラリには独自の Python API がありますが、XGBClassifier ラッパー クラスを通じて scikit-learn API で XGBoost モデルを使用できます。モデルのインスタンスは、他の scikit-learn クラスと同様にインスタンス化して、モデル評価に使用できます。例えば: - # モデルを定義する
- モデル= XGBClassifier ()
XGBoost のハイパーパラメータを調整する前に、デフォルトのハイパーパラメータを使用してパフォーマンス ベースラインを確立できます。前のセクションと同じ合成バイナリ分類データセットを使用し、繰り返し層別 k 分割クロス検証を使用した同じテスト ハーネスを使用します。デフォルトのハイパーパラメータを使用して XGBoost のパフォーマンスを評価するための完全な例を以下に示します。 - # バイナリ分類用のデフォルトのハイパーパラメータを使用した xgboost
- numpyからの平均をインポート
- numpyからstdをインポート
- sklearn.datasets から make_classification をインポートします
- sklearn.model_selection から cross_val_score をインポートします
- sklearn.model_selection から RepeatedStratifiedKFold をインポートします
- xgboost から XGBClassifier をインポートします
- #データセットを定義する
- X, y = make_classification ( n_samples = 1000 、 n_features = 5 、 n_informative = 2 、 n_redundant = 1 、 random_state = 1 )
- # モデルを定義する
- モデル= XGBClassifier ()
- # 評価手順を定義する
- cv = RepeatedStratifiedKFold ( n_splits = 10 、 n_repeats = 3 、 random_state = 1 )繰り返し階層化Kフォールド
- # モデルを評価する
- スコア= cross_val_score (モデル、X、y、スコアリング= '精度' 、 cv cv =cv、 n_jobs =-1)
- # レポート結果
- print('平均精度: %.3f (%.3f)' % (mean(scores), std(scores)))
例を実行すると、モデルが評価され、分類精度の平均と標準偏差が報告されます。 注意: アルゴリズムや評価手順の確率的特性、または数値精度の違いにより、結果が異なる場合があります。例を複数回実行し、平均結果を比較することを検討してください。この場合、デフォルトのハイパーパラメータを持つモデルは約 84.9% の分類精度を達成していることがわかります。最適化されたハイパーパラメータを使用することで、これよりも優れたパフォーマンスを実現できることを期待しています。 - 平均精度: 0.849 (0.040)
次に、ランダム化ヒルクライミング最適化アルゴリズムを使用して、XGBoost モデルのハイパーパラメータを調整します。 XGBoost モデル用に最適化したいハイパーパラメータは多数あります。 XGBoost モデルのチューニング方法の概要については、チュートリアルを参照してください。 勾配ブースティングアルゴリズムの設定方法 https://machinelearningmastery.com/configure-gradient-boosting-algorithm/ 4 つの主要なハイパーパラメータに焦点を当てます。彼らです: - 学習率 (learning_rate)
- ツリーの数 (n_estimators)
- サブサンプルの割合(サブサンプル)
- ツリーの深さ(最大深さ)
学習率は、各ツリーが全体にどれだけ貢献するかを制御します。適切な値は 1.0 未満ですが、0.0 よりわずかに大きい値 (例: 1e-8) になります。ツリーの数によってアンサンブルのサイズが制御され、一般的に、収穫逓減が起こるまではツリーの数が多いほど良いとされます。妥当な値は 1 本の木から数百または数千本の木の間です。サブサンプルのパーセンテージは、各ツリーをトレーニングするために使用されるランダム サンプルのサイズを、元のデータセット サイズのパーセンテージとして定義します。 0.0 よりわずかに大きい値 (例: 1e-8) から 1.0 までの間の値。ツリーの深さは、各ツリーのレベル数です。ツリーが深くなるほど、トレーニング データセットに特化するため、過剰適合する可能性が高くなります。一般的に、ツリーが短いほど一般化がうまくいきます。適切な値は 1 から 10 または 20 の間です。まず、Objective() 関数を更新して XGBoost モデルのハイパーパラメータを展開し、設定してから、平均分類精度を評価する必要があります。 - # 目的関数
- 定義目標(X, y, cfg):
- # 設定を解凍する
- lrate、n_tree、subsam、深さ= cfg
- # モデルを定義する
- モデル= XGBClassifier ( learning_rate = lrate 、 n_estimators = n_tree 、 subsamサブサンプル= subsam、 max_depth = depth)
- # 評価手順を定義する
- cv = RepeatedStratifiedKFold ( n_splits = 10 、 n_repeats = 3 、 random_state = 1 )繰り返し階層化Kフォールド
- # モデルを評価する
- スコア= cross_val_score (モデル、X、y、スコアリング= '精度' 、 cv cv =cv、 n_jobs =-1)
- # 平均精度を計算する
- 結果=平均(スコア)
- 結果を返す
次に、検索空間で 1 ステップ進むために使用される step() 関数を定義する必要があります。 各ハイパーパラメータの範囲は非常に異なるため、各ハイパーパラメータのステップ サイズ (分布の標準偏差) を個別に定義します。簡単にするために、関数のパラメータとしてではなく、オンラインでステップ サイズを定義します。 ツリーの数と深さは整数なので、ステップ値は丸められます。選択されたステップ サイズは任意であり、繰り返し試行した後に選択されました。更新されたステップ関数を以下に示します。 - # 検索スペースに一歩踏み出す
- defステップ(cfg):
- # 設定を解凍する
- lrate、n_tree、subsam、深さ= cfg
- # 学習率
- lrate lrate = lrate + randn() * 0.01
- lrate < = 0.0の場合:
- lrate = 1e -8
- lrate > 1の場合:
- レート= 1.0
- # 木の数
- n_tree =ラウンド(n_tree + randn() * 50)
- n_tree < = 0.0の場合:
- n_tree = 1
- # サブサンプルの割合
- サブサムサブサム= サブサム + randn() * 0.1
- サブサム< = 0.0 の場合:
- サブサム= 1e -8
- サブサム> 1 の場合:
- サブサム= 1.0
- # 最大ツリー深度
- 深さ=ラウンド(深さ + randn() * 7)
- 深さ< = 1 の場合:
- 深さ= 1
- # 新しい設定を返す
- [lrate, n_tree, subsam, depth] を返します
最後に、hillclimbing() アルゴリズムを更新して、適切な値を持つ初期ソリューションを定義する必要があります。この場合、デフォルトのハイパーパラメータに一致するかそれに近い適切なデフォルトを使用して初期ソリューションを定義します。 - # 検索の開始点
- 解=ステップ([0.1, 100, 1.0, 7])
すべてをまとめると、ランダム化ヒルクライミングを使用して XGBoost アルゴリズムのハイパーパラメータを手動で調整する完全な例がここにあります。 - # バイナリ分類のための xgboost 手動ハイパーパラメータ最適化
- numpyからの平均をインポート
- numpy.randomからrandnをインポート
- numpy.randomからrandをインポート
- numpy.randomからrandintをインポート
- sklearn.datasets から make_classification をインポートします
- sklearn.model_selection から cross_val_score をインポートします
- sklearn.model_selection から RepeatedStratifiedKFold をインポートします
- xgboost から XGBClassifier をインポートします
- # 目的関数
- def目標値(X, y, cfg):
- # 設定を解凍する
- lrate、n_tree、subsam、深さ= cfg
- # モデルを定義する
- モデル= XGBClassifier ( learning_rate = lrate 、 n_estimators = n_tree 、 subsamサブサンプル= subsam、 max_depth = depth)
- # 評価手順を定義する
- cv = RepeatedStratifiedKFold ( n_splits = 10 、 n_repeats = 3 、 random_state = 1 )繰り返し階層化Kフォールド
- # モデルを評価する
- スコア= cross_val_score (モデル、X、y、スコアリング= '精度' 、 cv cv =cv、 n_jobs =-1)
- # 平均精度を計算する
- 結果=平均(スコア)
- 結果を返す
- # 検索スペースに一歩踏み出す
- defステップ(cfg):
- # 設定を解凍する
- lrate、n_tree、subsam、深さ= cfg
- # 学習率
- lrate lrate = lrate + randn() * 0.01
- lrate < = 0.0の場合:
- lrate = 1e -8
- lrate > 1の場合:
- レート= 1.0
- # 木の数
- n_tree =ラウンド(n_tree + randn() * 50)
- n_tree < = 0.0の場合:
- n_tree = 1
- # サブサンプルの割合
- サブサムサブサム= サブサム + randn() * 0.1
- サブサム< = 0.0 の場合:
- サブサム= 1e -8
- サブサム> 1 の場合:
- サブサム= 1.0
- # 最大ツリー深度
- 深さ= round (深さ + randn() * 7)
- 深さ< = 1 の場合:
- 深さ= 1
- # 新しい設定を返す
- [lrate, n_tree, subsam, depth] を返します
- # ヒルクライミング局所探索アルゴリズム
- 定義ヒルクライミング(X, y, 目的, n_iter):
- # 検索の開始点
- 解=ステップ([0.1, 100, 1.0, 7])
- # 初期点を評価する
- solution_eval =目標値(X, y, 解)
- # ヒルクライムを走る
- iが範囲内(n_iter)の場合:
- # 一歩踏み出す
- 候補=ステップ(解決策)
- # 候補ポイントを評価する
- candidate_eval =目標値(X, y, 候補値)
- # 新しいポイントを保持するかどうかを確認します
- 候補評価> = 解決評価の場合:
- # 新しいポイントを保存する
- 解決策、 solution_eval =候補、candidate_eval
- # 進捗状況を報告する
- print(' > %d, cfg =[%s] %.5f' % (i, solution, solution_eval))
- [ソリューション、ソリューション評価] を返す
- #データセットを定義する
- X, y = make_classification ( n_samples = 1000 、 n_features = 5 、 n_informative = 2 、 n_redundant = 1 、 random_state = 1 )
- # 合計反復回数を定義する
- 反復回数= 200
- # ヒルクライミング検索を実行する
- cfg、スコア=ヒルクライミング(X、y、目標、n_iter)
- print('完了しました!')
- print(' cfg =[%s]: 平均精度: %f' % (cfg, スコア))
例を実行すると、各検索中に改善が見られるため、構成と結果が報告されます。実行の最後に、最適な構成と結果が報告されます。 注意: アルゴリズムや評価手順の確率的特性、または数値精度の違いにより、結果が異なる場合があります。例を複数回実行し、平均結果を比較することを検討してください。 この場合、学習率を約 0.02、ツリーを 52 個、サブサンプリング率を約 50%、深度を 53 レベルに設定すると、最良の結果が得られることがわかります。この構成では平均精度が約 87.3% となり、デフォルト構成の平均精度である約 84.9% よりも優れています。 - > 0, cfg = [[0.1058242692126418, 67, 0.9228490731610172, 12]] 0.85933
- > 1、 cfg = [[0.11060813799692253、51、0.859353656735739、13]] 0.86100
- > 4、 cfg = [[0.11890247679234153、58、0.7135275461723894、12]] 0.86167
- > 5、 cfg =[[0.10226257987735601、61、0.6086462443373852、17]] 0.86400
- > 15、 cfg = [[0.11176962034280596、106、0.5592742266405146、13]] 0.86500
- > 19、 cfg = [[0.09493587069112454、153、0.5049124222437619、34]] 0.86533
- > 23、 cfg = [[0.08516531024154426、88、0.5895201311518876、31]] 0.86733
- > 46、 cfg = [[0.10092590898175327、32、0.5982811365027455、30]] 0.86867
- > 75、 cfg =[[0.099469211050998、20、0.36372573610040404、32]] 0.86900
- > 96、 cfg =[[0.09021536590375884、38、0.4725379807796971、20]] 0.86900
- > 100、 cfg = [[0.08979482274655906、65、0.3697395430835758、14]] 0.87000
- > 110、 cfg = [[0.06792737273465625、89、0.33827505722318224、17]] 0.87000
- > 118、 cfg = [[0.05544969684589669、72、0.2989721608535262、23]] 0.87200
- > 122、 cfg = [[0.050102976159097、128、0.2043203965148931、24]] 0.87200
- > 123、 cfg = [[0.031493266763680444、120、0.2998819062922256、30]] 0.87333
- > 128、 cfg = [[0.023324201169625292、84、0.4017169945431015、42]] 0.87333
- > 140、 cfg =[[0.020224220443108752、52、0.5088096815056933、53]] 0.87367
- 終わり!
- cfg =[[0.020224220443108752, 52, 0.5088096815056933, 53]]: 平均精度: 0.873667
|