勾配ブースティングの推定器の数を選択する方法

データ サイエンスでは、最近使用できるアルゴリズムが数多くあります。 したがって、有用な手法の XNUMX つは、それらを XNUMX つのモデルに組み合わせてそれぞれを最大限に活用し、より正確なモデルを作成することです。

Scikit-Learn を使用すると、バギングのようなアンサンブル モデルであるランダム フォレスト アルゴリズムを見つけることができます。 一方、推定器を順番にトレーニングするブースティング モデルもあります。このモデルでは、XNUMX つのモデルの結果が次のモデルに渡され、最適な結果に達するまで予測を改善しようとします。

勾配ブースティング推定器を作成すると、このハイパーパラメーターが見つかります n_estimator=100 結果を得るために作成される 100 ツリーのデフォルト値を使用します。 多くの場合、グリッド検索手法を使用しても、これをデフォルトに設定するか、必要に応じて増やすことができます。

この投稿では、モデルのトレーニングに使用する単一の数値を取得する簡単な方法を見つけます。

勾配ブースティングは、このクラスを使用して Scikit-Learn から読み込むことができます from sklearn.ensemble import GradientBoostingRegressor. 勾配ブースティング アルゴリズムは、分類モデルまたは回帰モデルのいずれかに使用できます。 これはツリーベースの推定器です。つまり、多くの決定木で構成されています。

の結果 ツリー1 エラーが発生します。 これらのエラーが使用され、 ツリー2. もう一度、最後のモデルのエラーが使用され、次のモデルの入力が、 n_estimators の値です。

各モデルは、前のモデルのエラーに適合します。 著者による画像。

各推定量は前の推定量の誤差に適合するため、予測を組み合わせた方が単独の推定量よりも優れていることが期待されます。 各反復の後、モデルをより複雑にし、バイアスを減らしますが、逆に分散を増やします。 したがって、いつ停止するかを知っておく必要があります。

その方法を見てみましょう。

この演習のコードは単純です。 必要なのは、各反復の後にループし、どれが最もエラーが少なかったかを確認することだけです。

データセットを選択することから始めましょう。 使用します 車の衝突 データセット、seaborn ライブラリのネイティブ (つまり、BDS ライセンスの下でのオープン データ)。

# データセット
df = sns.load_dataset('car_crashes')

ここで、データを簡単に見てみましょう。 を見積もってみます。 total 他の機能を予測子として使用する量。 実数出力なので、回帰モデルについて話しています。

自動車事故データセット、シーボーンより。 著者による画像。

相関関係をすばやく調べます。

# 相関
df.corr().style.background_gradient(cmap='coolwarm')
データセット内の相関。 著者による画像。

OK、大きな多重共線性はありません。 私たちはそれを見ることができます ins_premium & ins_losses とはあまり相関しない total であるため、モデルでは考慮しません。

欠落しているデータを確認すると、何もありません

# ない
df.isnull()。sum()
0

それでは、データを分割しましょう。

# X と Y
X = df.drop(['ins_premium', 'ins_losses', 'abbrev', 'total'], axis=1)
y = df['合計']
# トレインテスト
X_train、X_test、y_train、y_test = train_test_split(X、y、test_size=0.3、random_state=22)

データをスケーリングしてモデル化するためのパイプラインを作成できます (このデータをスケーリングする必要はあまりありません。なぜなら、それらはすでに同じスケールであり、XNUMX のベースであるからです。)。 次に、データをモデルに当てはめ、結果を予測します。

私は 500 個の推定器を使用しています。 learning_rate 0.3の。

学習率は、最小エラーに到達するために取るステップのサイズです。 高すぎる値を使用すると、最小値を通過する可能性があります。 小さすぎる数値を使用すると、それに近づくことさえできない場合があります。 したがって、考慮できる経験則は次のとおりです。多数の推定量がある場合は、学習率の値を低くすることができます。 少数の推定量しかない場合は、より高い値の学習率を使用することをお勧めします。

steps = [('scale', StandardScaler()),
('GBR', GradientBoostingRegressor(n_estimators=500, learning_rate=0.03)) ]
# インスタンス パイプラインとフィット
パイプ = パイプライン (ステップ).fit(X_train, y_train)
# 予測する
preds = パイプ.predict(X_test)

では、評価です。

# 予測の RMSE
print(f'RMSE: { round(np.sqrt(mean_squared_error(y_test, preds)),1 )}')
[アウト]: RMSE: 1.1# 真の Y 値の平均
print(f'Data y mean: {round( y.mean(),1 )}')
[OUT]: データ y 平均: 15.8

良い。 RMSE は平均値の約 6.9% です。 つまり、平均してこれだけずれています。

ここで、エラー率が最も低くなる最適な数の推定量を選択してモデルを調整する方法を確認してみましょう。

先ほど言ったように、このデータは既に同じ比率になっているため、実際にスケーリングする必要はありません。 それでは、モデルを当てはめてみましょう。

#モデル
gbr = GradientBoostingRegressor(n_estimators=500, learning_rate=0.3).fit(X_train, y_train)

今では良いものです。 勾配ブースティングには、トレーニングされた各推定量の予測を 1 から 500 まで繰り返すことができる方法があります。 gbr モデル、メソッドを使用して結果を予測する staged_predict()、平均二乗誤差を計算し、結果をリストに保存します errors.

# 最適な数をループ
エラー = [ gbr.staged_predict(X_test) の preds の mean_squared_error(y_test, preds)]
# 推定器の最適数
最適な_num_estimators = np.argmin(エラー) + 1

次に、結果をプロットできます。

#プロット
g=sns.lineplot(x=範囲(500), y=エラー)
g.set_title(f'{best_n_estimators} での推定値の最適数', size=15);
推定量の最適数。 著者による画像。

最小のエラー率は 34 個の推定量であることがわかります。 それでは、34 個の推定器でモデルを再トレーニングし、パイプラインでトレーニングされたモデルの結果と比較してみましょう。

# 再訓練
gbr = GradientBoostingRegressor(n_estimators=34, learning_rate=0.3).fit(X_train, y_train)
# 予測
preds2 = gbr.predict(X_test)

評価中…

# 予測の RMSE
print(f'RMSE: { round(np.sqrt(mean_squared_error(y_test, preds2)),1 )}')
[アウト]: RMSE: 1.0
# データ Y 平均
print(f'Data y mean: {round( y.mean(),1 )}')
[OUT]: データ y 平均: 15.8

6.9% から 6.3% オフになりました。 約。 9%改善。 いくつかの予測を見てみましょう。

両方のモデルからの予測。 著者による画像。

興味深い結果です。 XNUMX 番目のモデルの予測の一部は、最初のモデルよりも優れています。

微調整する推定量の最適な数を決定する方法を学びました GradientBoostingRegressor Scikit-Learn から。 これは、エスティメータを順番にトレーニングする、この種のアンサンブル モデルに違いをもたらすことができるハイパーパラメータです。

場合によっては、数回の反復の後、モデルがオーバーフィットし始め、分散が大きくなりすぎて予測に影響を与えることがあります。

この場合、単純なループが最適なソリューションを見つけるのに役立つことがわかりました。 しかし、確かに、大規模なデータセットの場合、計算にコストがかかる可能性があるため、アイデアはより低い値を試すことです. n_estimators 最初は、最小誤差にすぐに到達できるかどうかを確認します。

ここに GitHub の完全なコード.

このコンテンツが気に入ったら、私のブログをフォローしてください。

私を見つけて LinkedIn.

この演習は、参考文献にある Aurélien Géron による優れた教科書に基づいています。

ソースから再公開された勾配ブースティングの推定器の数を選択する方法8 https://towardsdatascience.com/feed経由

<!–

–>

タイムスタンプ:

より多くの ブロックチェーンコンサルタント