1. ホーム
  2. python

[解決済み] scikit-learnのclass_weightパラメータはどのように機能するのでしょうか?

2022-04-28 09:50:50

質問

を理解するのに非常に苦労しています。 class_weight scikit-learnのLogistic Regressionのパラメータを操作しています。

シチュエーション

非常にアンバランスなデータセットに対して、ロジスティック回帰を使ってバイナリ分類を行いたいと思います。クラスは、0(負)と1(正)とラベル付けされ、観測されたデータは、約19:1の比率で、大多数のサンプルが負の結果を持つというものです。

最初の試み 手動で学習データを準備する

手持ちのデータを学習用とテスト用に分けた(約80/20)。そして、学習データを手作業でランダムにサンプリングし、19:1とは異なる割合で学習データを取得しました。

そして、これらの異なる訓練データのサブセットに対してロジスティック回帰の訓練を行い、異なる訓練比率の関数としてリコール(= TP/(TP+FN))をプロットしてみました。もちろん、回収率は19:1の割合で観測された分離されたTESTサンプルで計算されました。異なるモデルを異なるトレーニングデータでトレーニングしましたが、同じ(不連続の)テストデータですべてのモデルのリコールを計算しました。

結果は予想通り、2:1の学習比率で約60%の想起率を示し、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

を入れ、さらに Noneauto .

今回の結果は、まったくおかしなものでした。のどの値でも、私のリコールはすべて小さな値(< 0.05)になりました。 class_weight ただし auto . ということで、私の理解では class_weight の辞書が間違っている。興味深いことに class_weight のすべての値に対して、グリッド検索で 'auto' の値は約 59% でした。 C ということで、1:1のバランスになったのでしょうか。

私の質問

  1. の正しい使い方は? class_weight を使うと、学習データで実際に与えたものと異なるバランスになるのでしょうか?具体的には、どのような辞書を class_weight は、ネガティブ:ポジティブの割合が n:m の学習サンプルを使用するのですか?

  2. を渡すと、様々な class_weight ディクショナリを GridSearchCV に渡す場合、クロスバリデーションでは、ディクショナリに従って学習フォールドのデータをリバランスしますが、テストフォールドのスコアリング関数の計算には、与えられた真のサンプル比率を使用するのでしょうか。これは非常に重要なことで、どのような指標も、観測された比率のデータから得られる場合にのみ、私にとって有用です。

  3. はどのようなものなのでしょうか? auto の値は class_weight 比率はどうなんでしょうか?ドキュメントを読むと、quot;データを頻度に反比例してバランスさせる"は、単に1:1にすることを意味すると思います。これは正しいのでしょうか?そうでない場合、誰かが明確にすることができますか?

解決方法は?

まず、想起率だけで判断するのは良くないかもしれません。何でもかんでもポジティブクラスに分類すれば、単純にリコール100%になるわけではありません。 私は通常、パラメータの選択にはAUCを使用し、興味のある動作点(例えば所定の精度レベル)の閾値を見つけることをお勧めします。

どのように class_weight が機能します。のサンプルに誤りがあった場合、ペナルティを課します。 class[i]class_weight[i] つまり、クラスウェイトが高いということは、そのクラスをより強調したいということです。あなたの話からすると、クラス0はクラス1よりも19倍も頻度が高いようです。ですから class_weight のクラス1のクラス0に対する相対的な値、例えば {0:.1, 1:.9} を指定します。 もし class_weight の和が1にならない場合は、基本的に正則化パラメータを変更することになります。

どのように class_weight="auto" の動作を確認することができます。 本論 . 開発版では class_weight="balanced" これは基本的に、大きなクラスと同じ数のサンプルが得られるまで小さなクラスを複製することを意味しますが、暗黙的な方法で複製します。