回答:
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パッケージは、カットオフを決定するために、コストに敏感なアルゴリズムを含む多くのアルゴリズムを実装しています。
私の理解では、これは機械学習コミュニティの研究の活発な分野であり、大きな答えはありませんが、多数の潜在的なソリューションが増えています。検討している特定のアルゴリズムを指定すると、より良い答えが得られる可能性があります。
パラメトリックモデル(ロジスティック回帰)を使用している場合、これは問題ではなく、損失関数(偽陰性から偽陽性のコスト)に基づいてしきい値を変更するだけです。
機械学習アルゴリズムを使用している場合、これはもっと難しいかもしれません。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
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には他のいくつかの分類アルゴリズムがあり、そのいくつかはクラスの重みを受け入れます。