非常に不均衡な設定でのコスト重視の学習のための提案


15

数百万行と100列までのデータセットがあります。共通クラスに属するデータセット内のサンプルの約1%を検出したいと思います。最小精度の制約がありますが、非常に非対称なコストのため、特定のリコールにあまり熱心ではありません(10の肯定的な一致が残っていない限り!)

この設定でお勧めするアプローチは何ですか?(論文へのリンクは歓迎、実装へのリンクは歓迎)

回答:


15

He and Garcia(2009)は、不均衡なクラスの問題の学習の有用なレビューであることがわかりました。考慮すべき完全に包括的ではないいくつかの事項を次に示します。

データベースのアプローチ:

多数派クラスをアンダーサンプリングするか、少数派クラスをオーバーサンプリングできます。(ブライマンは、これは正式には不均一な誤分類コストを割り当てることと同等であると指摘しました。)これにより問題が発生する可能性があります。オーバーサンプリングは、過剰適合のリスクを高めます。

これらの問題を軽減する「インフォームドアンダーサンプリング」方法があります。その1つはEasyEnsembleです。これは、多数派クラスから複数のサブセットを独立してサンプリングし、各サブセットをすべての少数派データと組み合わせて複数の分類器を作成します。

SMOTE(Synthetic Minority Oversampling Technique)またはSMOTEBoost(SMOTEとブースティングの組み合わせ)は、特徴空間で最近傍を作成することにより、マイノリティクラスの合成インスタンスを作成します。SMOTEはDMwRパッケージのRに実装されています(Luis Torgo の本「Data Mining with R、Learning with case study」CRC Press 2016に付属)。

モデルフィッティングアプローチ

損失関数にクラス固有の重みを適用します(少数派の場合はより大きな重み)。

ツリーベースのアプローチの場合、Cieslak et alで提唱されているように、Hellinger距離をノード不純関数として使用できます。「ヘリンジャー距離決定木はロバストでスキューに影響されません」ここにWekaコードがあります。)

1つのクラス分類子を使用して、1つのクラスの確率密度または境界を(モデルに応じて)学習し、他のクラスを外れ値として扱います。

もちろん、モデル作成のメトリックとして精度を使用しないでください。コーエンのカッパは合理的な代替品です。

モデル評価アプローチ

モデルが予測確率または他のスコアを返す場合、エラーの適切なトレードオフを行う決定カットオフを選択します(トレーニングとテストから独立したデータセットを使用)。Rでは、OptimalCutpointsパッケージは、カットオフを決定するために、コストに敏感なアルゴリズムを含む多くのアルゴリズムを実装しています。


詳細な返信をありがとう。私はアンダーサンプリングを試みましたが、惨めに失敗しました。モデルは優れたサンプル内パフォーマンスを示しますが、テストセット(および最終的に使用する実際のデータ)には不均衡が依然として存在するため、モデルのOOS精度は恐ろしいものです。クラス固有の重みも試してみましたが、私のアプリケーションでは、偽陰性よりも偽陽性の方が簡単に定量化できる高いコストがかかります。1つのクラス分類については、私は...線形SVM(非直線的なものが遅すぎる)とあっても、サンプル中0精度を持っているに合わせてみました
EM70

1
心中お察しします。大部分のケースが否定的な場合、高精度は困難です。学習にクラス固有の重み(クラスのケースの割合に反比例するなど)を使用し、決定しきい値を決定するためにエラータイプ固有の重みを保存します。モデル選択の精度ではなく、コーエンのカッパとの交差検証を使用していることを願っています。利用可能なトレードオフを実際に理解するために、すべてのカットオフでのサイド精度と強化(精度/陽性ケースの割合)に沿って、キャリブレーションデータのクラスの確率密度を視覚化します。
MattBagg

すばらしい答え、ありがとう。前述のEasyEnsembleに似た手法をかなり長い間使用してきましたが、それを疑っていました(シミュレートされたデータの実用的なパフォーマンスにもかかわらず)。今、私はそれが理にかなっていることを知っています。
アヨルゴ

5

私の理解では、これは機械学習コミュニティの研究の活発な分野であり、大きな答えはありませんが、多数の潜在的なソリューションが増えています。検討している特定のアルゴリズムを指定すると、より良い答えが得られる可能性があります。

パラメトリックモデル(ロジスティック回帰)を使用している場合、これは問題ではなく、損失関数(偽陰性から偽陽性のコスト)に基づいてしきい値を変更するだけです。

機械学習アルゴリズムを使用している場合、これはもっと難しいかもしれません。Max Kuhnは、「Applied Predictive Modeling」の第16章でこの問題を要約しようとしています。しかし、要約するのは難しいトピックです。この本を購入したくない場合は、この章のAppliedPredictiveModelingパッケージでRコードを利用できます。Rコードと使用するアルゴリズムに精通している場合は、これで十分な場合があります。

通常、議論はアンダーサンプリング/オーバーサンプリング+/-コストに敏感なアルゴリズムを中心に展開します。jous-boostのようなバリエーションも可能です。
この種の議論の例:Chen et al「ランダムフォレストを使用した不均衡データの学習」 http://statistics.berkeley.edu/sites/default/files/tech-reports/666.pdf


しきい値の変更に関する問題は、回帰モデルの切片を変更するようなものです。現実には、コストを考慮して重みベクトルを変更したい場合があります。しかし、それを行うと、すでに深刻な不均衡が発生しているため、精度が0になってしまいます。アルゴリズムに決着がついておらず、有望であれば最先端の研究アイデアを実装するリソースがあります。あなたが提案した本を見てみましょう。
em70

この章はまあまあです。確かな努力ですが、要約するのは難しいトピックです。さまざまな方法で公開されている多くのサポートされていないクレーム。ランダムフォレストでの階層化されたアンダーサンプリングは、機械学習の観点からの良いスタートだと思います。コードは本のパッケージに含まれています。
チャールズ

0

scikit-learnの実装をご覧ください。class_weight引数または 'auto'の辞書の値を持つことができるclass_ weight引数に注意してください。

クラスsklearn.svm.SVC(C = 1.0、kernel = 'rbf'、degree = 3、gamma = 0.0、coef0 = 0.0、shrinking = True、probability = False、tol = 0.001、cache_size = 200、class_weight = None、verbose = False、max_iter = -1、random_state = None)

class_weight引数の値で遊ぶことができます。この引数は、クラスウェイトディクショナリまたは「auto」にすることができます。「自動」モードでは、学習アルゴリズムは各クラス内のサンプル数に基づいて各クラスに自動的に重みを割り当てます。

scikit-learnには他のいくつかの分類アルゴリズムがあり、そのいくつかはクラスの重みを受け入れます。


OPの目標を達成するためにクラスの重みをどのように使用できるかについて詳しく説明できますか?それはあなたの投稿で暗黙的だと思いますが、これはまだ答えではありません。
GUNG -復活モニカ

あり 「自動」の場合、学習アルゴリズム自体が、各クラスのサンプル数に従って各クラスの重みを見つけます。
アッシュ14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.