web-dev-qa-db-ja.com

sklearnでRandomForestClassifierを使用した不均衡な分類

クラスのバランスが取れていないデータセットがあります。クラスは「1」または「0」で、クラス「1」:「0」の比率は5:1です。次のリンクのようなランダムフォレストを使用したsklearnで、各クラスの予測誤差とそれに応じてリバランスの重みをどのように計算しますか? http://www.stat.berkeley.edu/~breiman/RandomForests/ cc_home.htm#balance

32
mlo

サンプルの重みの引数をランダムフォレストに渡すことができます fit method

_sample_weight : array-like, shape = [n_samples] or None
_

サンプル重量。なしの場合、サンプルは均等に重み付けされます。正味ゼロまたは負の重みを持つ子ノードを作成する分割は、各ノードで分割を検索するときに無視されます。分類の場合、いずれかの子ノードで負の重みを持つ単一のクラスが生じる場合、分割も無視されます。

古いバージョンでは、クラスが均一に分散されるように、特定のサンプルのバランスウェイトを生成する_preprocessing.balance_weights_メソッドがありました。内部にありますが、まだ使用可能です preprocessing._weights モジュールですが、非推奨であり、将来のバージョンで削除されます。これの正確な理由がわからない。

更新

混乱しているように見えるため、いくつかの説明。 _sample_weight_の使用法は、トレーニングデータセットのターゲットクラスのバランスを取ることが目的であることを覚えていれば簡単です。つまり、Xが観測値であり、yがクラス(ラベル)である場合、len(X) == len(y) == len(sample_wight)、および_sample witght_ 1-d配列の各要素は対応する_(observation, label)_ペアの重み。あなたの場合、_1_クラスが_0_クラスの5倍で表され、クラスの分布のバランスを取る場合、シンプルな

_sample_weight = np.array([5 if i == 0 else 1 for i in y])
_

_5_の重みをすべての_0_インスタンスに割り当て、_1_の重みをすべての_1_インスタンスに割り当てます。少し巧妙な_balance_weights_重み評価関数については、上記のリンクを参照してください。

44
alko

これは、sklearnの「適合」方法では、最適化するパフォーマンス測定値を指定することはできません。分類タスクを解決するときにデータサンプルのfitメソッドを呼び出したときに実際に何が起こっているのかを理解したり、質問したり、興味を持っている人はいないようです。

scikit学習パッケージのユーザー)は、適切なAUCまたはF1スコアを生成するパラメーター/メタパラメーターセットに出くわすことを期待して、不均衡なデータセットに適した特定のスコアリング方法でクロス検証グリッド検索を間接的に使用する提案を静かに残しています。

しかし、それについて考えてみてください。毎回、常に精度を最適化するボンネットの下で呼び出される「適合」メソッドのように見えます。最終的に、F1スコアを最大化することを目指す場合、GridSearchCVは「すべてのモードから最高の精度で最高のF1を持つモデル」を提供します。それはばかげていませんか? F1スコアが最大になるようにモデルのパラメーターを直接最適化する方が良いと思いませんか?古い優れたMatlab ANNsパッケージを思い出してください。ここでは、希望するパフォーマンスメトリックをRMSE、MAE、および勾配計算アルゴリズムが定義されている場合に必要なものに設定できます。パフォーマンスメトリックの選択がsklearnから静かに省略されるのはなぜですか?

少なくとも、不均衡なデータセットの問題を解決するためにクラスインスタンスの重みを自動的に割り当てる簡単なオプションがないのはなぜですか?ワイトを手動で計算する必要があるのはなぜですか?その上、多くの機械学習の本/記事で、著者はスクレルンのマニュアルをトピックに関する最高の情報源ではないとしても素晴らしいと称賛しています。いや、本当に?不均衡なデータセットの問題(データサイエンティストにとって明らかに重要である)が、ドキュメントのどこにも記載されていないのはなぜですか? sklearnの寄稿者にこれらの質問に対処します。あるいは、それを行う理由を知っている人なら誰でもコメントをしてクリアすることを歓迎します。

[〜#〜] update [〜#〜]

Scikit-learn 0.17以降、class_weight = 'balanced'オプションがあり、少なくともいくつかの分類器に渡すことができます。

「平衡」モードでは、yの値を使用して、n_samples /(n_classes * np.bincount(y))として入力データのクラス頻度に反比例する重みを自動的に調整します。

7

多数派クラスが1で、少数派クラスが0で、それらの比率が5:1の場合、sample_weight配列は次のようになります。

sample_weight = np.array([5 if i == 1 else 1 for i in y])

比率を反転させないことに注意してください。これはclass_weightsにも適用されます。大きい数字は多数決クラスに関連付けられています。

2
Meena Mani

パラメーター_class_weight='balanced'_を使用します

Sklearnのドキュメントから:balancedモードはyの値を使用して、入力データのクラス頻度に反比例する重みをn_samples / (n_classes * np.bincount(y))として自動的に調整します

1
negas