クロスバリデーションに関するLightGBMのドキュメントを読んだ後、このコミュニティが結果のクロスバリデーションとLightGBMを使用した予測の改善に光を当てることを望んでいます。予測を改善するために_lightgbm.cv
_からの辞書出力をどのように使用することになっていますか?
例は次のとおりです。以下のコードを使用してcvモデルをトレーニングします。
_cv_mod = lgb.cv(params,
d_train,
500,
nfold = 10,
early_stopping_rounds = 25,
stratified = True)
_
上記のコードの最適な反復で見つかったパラメーターを使用して、出力を予測するにはどうすればよいですか?この場合、_cv_mod
_には_lightgbm.train
_のような「予測」メソッドがなく、_lightgbm.cv
_からの辞書出力は、lightgbm.train.predict(..., pred_parameters = cv_mod)
で使用するとエラーをスローします。
重要な変換ステップがありませんか?
一般に、CVの目的は、ハイパーパラメーターの最適化を行うための[〜#〜] not [〜#〜]です。目的は、モデル構築手順のパフォーマンスを評価することです。
基本的なトレイン/テストスプリットは、概念的には1倍CVと同じです(スプリットのカスタムサイズは、kフォールドCVの1/Kトレインサイズとは対照的です)。より多くの分割(つまり、k> 1 CV)を行う利点は、一般化誤差の推定に関する詳細情報を取得することです。エラー+統計の不確実性を取得するという意味で、より多くの情報があります。優れた CrossValidatedについての議論 があります(同じ質問をカバーするが、異なる方法で作成された質問に追加されたリンクから始めます)。ネストされたクロス検証をカバーし、絶対に簡単ではありません。しかし、一般的な概念に頭を包む場合、これはさまざまな非自明な状況で役立ちます。あなたが取り去らなければならないアイデアは次のとおりです:CVの目的は、モデル構築手順のパフォーマンスを評価することです。
その考えを念頭に置いて、一般的に(LightGBMだけでなく)ハイパーパラメーター推定にどのようにアプローチしますか?
その後、さらに一歩進んで、追加のホールドアウトセットがあり、それがハイパーパラメーター最適化が開始される前に分離されたと言うことができます。この方法で、そのセットで選択された最適なモデルを評価して、最終的な汎化誤差を測定できます。ただし、さらに一歩進んで、単一のテストサンプルを使用する代わりに、外側のCVループを使用して、ネストされた相互検証を行うことができます。
技術的には、lightbgm.cv()
では、固定モデルパラメーターを使用したk分割のパフォーマンスのみを評価できます。ハイパーパラメーターの調整では、最適なパラメーターセットを選択するために、さまざまなパラメーターを提供し、平均化されたパフォーマンスを記録するループで実行する必要があります。ループが完了した後。このインターフェイスは、CVループでハイパーパラメーター最適化を行うための完全な機能を提供するsklearn
とは異なります。個人的には、lightgbmのsklearn-APIを使用することをお勧めします。これは、ネイティブlightgbm.train()
機能の単なるラッパーであるため、遅くはありません。しかし、それはあなたがsklearn
ツールキットのフルスタックを使用することを可能にします。
CVの結果に満足している場合は、これらのパラメーターを使用して 'lightgbm.train'メソッドを呼び出すだけです。 @phoが言ったように、CVは通常、パラメータの調整のためだけです。実際のCVオブジェクトを予測に使用しません。
パラメーターの最適化にはCVを使用する必要があります。
モデルがすべてのフォールドで良好に機能する場合、これらのパラメーターを使用してトレーニングセット全体でトレーニングします。次に、外部テストセットでそのモデルを評価します。