Scikit-learnのLogistic Regressionのclass_weight
パラメーターがどのように動作するかを理解するのに苦労しています。
状況
ロジスティック回帰を使用して、非常に不均衡なデータセットのバイナリ分類を行いたいです。クラスには0(ネガティブ)と1(ポジティブ)のラベルが付けられており、観測されたデータは約19:1の比率であり、サンプルの大半はネガティブな結果を示しています。
最初の試行:トレーニングデータの手動準備
トレーニングとテストのために、持っていたデータをばらばらのセットに分割しました(約80/20)。次に、19:1以外の比率でトレーニングデータを取得するために、トレーニングデータを手作業でランダムにサンプリングしました。 2:1-> 16:1から。
次に、これらの異なるトレーニングデータサブセットでロジスティック回帰をトレーニングし、異なるトレーニング比率の関数として再現率(= TP /(TP + FN))をプロットしました。もちろん、リコールは、19:1の割合で観測されたばらばらのTESTサンプルで計算されました。異なるトレーニングデータで異なるモデルをトレーニングしましたが、同じ(互いに素な)テストデータですべてのモデルのリコールを計算したことに注意してください。
結果は予想通りでした。2:1のトレーニング割合でリコールは約60%で、16:1になるまでにかなり速く落ちました。リコールが5%をかなり上回る2:1-> 6:1の比率がいくつかありました。
2回目の試行:グリッド検索
次に、異なる正則化パラメーターをテストしたいので、GridSearchCVを使用して、C
パラメーターとclass_weight
パラメーターのいくつかの値のグリッドを作成しました。私のn:mの割合のnegative:positiveトレーニングサンプルを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
辞書を設定する方法についての私の理解が間違っているとしか想定できません。興味深いことに、グリッド検索の「自動」のclass_weight
値は、C
のすべての値で約59%でしたが、1:1に収まると思いますか?
私の質問
1)class_weight
を適切に使用して、トレーニングデータで実際に提供するデータと異なるバランスを実現するにはどうすればよいですか?具体的には、n:mの割合のネガティブ:ポジティブトレーニングサンプルを使用するためにclass_weight
に渡す辞書は何ですか?
2)さまざまなclass_weight
辞書をGridSearchCVに渡すと、クロス検証中に辞書に従ってトレーニングフォールドデータのバランスを取り直しますが、テストフォールドでのスコアリング関数の計算に真の所定のサンプル比率を使用しますか?これは非常に重要です。どのメトリックも、観測された割合のデータから得られた場合にのみ役立つからです。
3)class_weight
のauto
値は、プロポーションに関して何をしますか?私はドキュメントを読んで、「データの頻度に反比例するバランスをとる」とは、それが1:1になることを意味すると仮定します。これは正しいです?そうでない場合、誰かが明確にすることができますか?
どうもありがとう、どんな説明も大歓迎です!
まず、リコールだけで行くのは良くないかもしれません。すべてをポジティブクラスとして分類することで、100%のリコールを簡単に達成できます。通常、AUCを使用してパラメーターを選択し、関心のある動作点のしきい値(特定の精度レベルなど)を見つけることをお勧めします。
class_weight
の動作方法については、class[i]
のサンプルの間違いを1ではなくclass_weight[i]
でペナルティを科します。したがって、クラスの重みが高いほど、クラスに重点を置く必要があります。あなたが言うことから、クラス0はクラス1より19倍頻繁であるようです。したがって、クラス0に対してクラス1のclass_weight
を増やす必要があります、たとえば{0:.1、1:.9}。 class_weight
の合計が1にならない場合、基本的に正則化パラメーターが変更されます。
class_weight="auto"
の仕組みについては、 この説明 をご覧ください。 devバージョンでは、class_weight="balanced"
を使用できます。これは理解しやすいです。つまり、基本的に、大規模なサンプルと同じ数のサンプルを暗黙的な方法で作成するまで、小規模なクラスを複製することを意味します。