[解決済み] scikit-learnのclass_weightパラメータはどのように機能するのでしょうか?
質問
を理解するのに非常に苦労しています。
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
を入れ、さらに
None
と
auto
.
今回の結果は、まったくおかしなものでした。のどの値でも、私のリコールはすべて小さな値(< 0.05)になりました。
class_weight
ただし
auto
. ということで、私の理解では
class_weight
の辞書が間違っている。興味深いことに
class_weight
のすべての値に対して、グリッド検索で 'auto' の値は約 59% でした。
C
ということで、1:1のバランスになったのでしょうか。
私の質問
-
の正しい使い方は?
class_weight
を使うと、学習データで実際に与えたものと異なるバランスになるのでしょうか?具体的には、どのような辞書をclass_weight
は、ネガティブ:ポジティブの割合が n:m の学習サンプルを使用するのですか? -
を渡すと、様々な
class_weight
ディクショナリを GridSearchCV に渡す場合、クロスバリデーションでは、ディクショナリに従って学習フォールドのデータをリバランスしますが、テストフォールドのスコアリング関数の計算には、与えられた真のサンプル比率を使用するのでしょうか。これは非常に重要なことで、どのような指標も、観測された比率のデータから得られる場合にのみ、私にとって有用です。 -
はどのようなものなのでしょうか?
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"
これは基本的に、大きなクラスと同じ数のサンプルが得られるまで小さなクラスを複製することを意味しますが、暗黙的な方法で複製します。
関連
-
PythonによるExcelファイルの一括操作の説明
-
[解決済み】"No JSON object could be decoded "よりも良いエラーメッセージを表示する。
-
[解決済み】SyntaxError: デフォルト以外の引数がデフォルトの引数に続く
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] リストの最後の要素を取得する方法
-
[解決済み] 辞書のリストを辞書の値でソートするにはどうしたらいいですか?
-
[解決済み] リストの要素数を取得する方法
-
[解決済み] リスト項目の出現回数を数えるにはどうしたらいいですか?
-
[解決済み] Pythonの@propertyデコレーターはどのように機能するのでしょうか?
-
[解決済み] Pythonのsuper()は多重継承でどう動くのか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Pythonコンテナのための組み込み汎用関数操作
-
Python機械学習Githubが8.9Kstarsに達したモデルインタープリタLIME
-
任意波形を生成してtxtで保存するためのPython実装
-
Python Pillow Image.save jpg画像圧縮問題
-
FacebookオープンソースワンストップサービスpythonのタイミングツールKats詳細
-
[解決済み】「SyntaxError.Syntax」は何ですか?Missing parentheses in call to 'print'」はPythonでどういう意味ですか?
-
[解決済み] 'int'オブジェクトに'__getitem__'属性がない。
-
[解決済み】 AttributeError("'str' object has no attribute 'read'")
-
[解決済み】Python: OverflowError: 数学の範囲エラー
-
[解決済み】Python - "ValueError: not enough values to unpack (expected 2, got 1)" の修正方法 [閉店].