scikit-learnのロジスティック回帰のclass_weight
パラメータがどのように機能するかを理解するのに多くの問題があります。
状況
ロジスティック回帰を使用して、非常に不均衡なデータセットでバイナリ分類を実行したい。クラスには0(負)と1(正)のラベルが付けられ、観測されたデータは約19:1の比率になっています。否定的な結果をもたらすサンプルの大部分。
最初の試み:トレーニングデータを手動で準備する
トレーニングとテストのために、持っていたデータをばらばらのセットに分割しました(約次に、トレーニングデータを手動でランダムにサンプリングして、19:1とは異なる比率(2:1-> 16:1)のトレーニングデータを取得しました。
次に、これらについてロジスティック回帰をトレーニングしました。さまざまなトレーニングデータサブセットとプロットされたリコール(= TP /(TP + FN))をさまざまなトレーニング比率の関数として計算しました。もちろん、リコールは、19:1の比率が観測されたばらばらのテストサンプルで計算されました。Nさまざまなトレーニングデータでさまざまなモデルをトレーニングしましたが、同じ(ばらばらの)テストデータですべてのモデルのリコールを計算しました。
結果は期待どおりでした。リコールは2で約60%でした。トレーニングの比率は1:1で、16:1になるまでにかなり速く落ちました。 2:1-> 6:1の比率がいくつかあり、リコールは5%を上回りました。
2回目の試行:グリッド検索
次に、さまざまな正規化パラメーターをテストしたかったので、GridSearchCVを使用して、 C
パラメーターとclass_weight
パラメーターのいくつかの値のグリッドを作成しました。ネガティブ:ポジティブトレーニングサンプルのn:mの比率を class_weight
の辞書言語に変換するには、次のようにいくつかの辞書を指定するだけだと思いました。
{0: 0.67、1:0.33} #expected 2:1 {0:0.75、1:0.25} #expected 3:1 {0:0.8、1:0.2} #expected 4:1
また、 None
とauto
も含めました。
今回は、結果が完全に奇抜でした。 auto
を除くclass_weight
のすべての値について、すべてのリコールはごくわずか(< 0.05)でした。したがって、 class_weight
ディクショナリを設定する方法についての私の理解が間違っていると推測することしかできません。興味深いことに、グリッド検索での「auto」の class_weight
値はC
のすべての値で約59%であり、1:1のバランスであると思いましたか?
私の質問
-
class_weight
を適切に使用して、実際とは異なるトレーニングデータのバランスを実現するにはどうすればよいですか。それを与える?具体的には、n:mの比率のネガティブ:ポジティブトレーニングサンプルを使用するために、どの辞書をclass_weight
に渡しますか? さまざまな
を渡す場合相互検証中に、GridSearchCVへのclass_weight
辞書は、辞書に従ってトレーニングフォールドデータのバランスを取り直しますが、テストフォールドでスコアリング関数を計算するために、指定された真のサンプル比率を使用しますか?メトリックは、観察された比率のデータからのものである場合にのみ役立つため、これは重要です。auto
値は何ですか。 > class_weight はプロポーションまで行いますか?私はドキュメントを読み、「データのバランスをそれらの頻度に反比例させる」とは、それが1:1になることを意味すると思います。これは正しいです?そうでない場合、誰かが明確にすることができますか?