Python:Python Machine Learningでの不均衡クラスの処理


9

ターゲット変数を予測しようとしているデータセットがあります。

Col1    Col2    Col3    Col4    Col5    
  1      2       23      11     1
  2      22      12      14     1
  22     11      43      38     3
  14     22      25      19     3
  12     42      11      14     1
  22     11      43      38     2
  1      2       23      11     4
  2      22      12      14     2
  22     11      43      38     3

私はサンプルデータを提供しましたが、私の場合、同様の方法で数千のレコードが配布されています。ここで、Col1、Col2、Col3、Col4は私の機能で、Col5はターゲット変数です。したがって、これらはターゲット変数の私の値なので、予測は1、2、3、または4である必要があります。ランダムフォレスト、決定木などのアルゴリズムを予測に使用してみました。

ここを見ると、値1、2、3は4と比較してより多く発生しています。したがって、予測している間、モデルは1 2と3に偏っていますが、4の予測の数は少なくなっています(1つだけ予測されました)混乱マトリックスを見たときの数千のレコードのうちのpolicy4の場合)。

モデルを一般化するために、1、2、および3の値に属する同じ割合のデータをランダムに削除しました。Col5の各値でグループ化し、特定のパーセンテージを削除して、レコード数を減らしました。今、私は正確さのパーセンテージの一定の増加と混同行列の値4の予測の合理的な増加を見ることができました。

これは対処する適切なアプローチですか(モデルがバイアスされているグループからランダムにデータを削除します)?

私は、sklearnを使用したAdaboost、GradientBoostテクニックなどの組み込みのPythonアルゴリズムを試しました。私はこれらのアルゴリズムが不均衡クラスを処理するためのものであることを読みました。しかし、データをランダムに削除して精度を向上させることはできませんでした。

この削減はアンダーサンプリング手法ですか?これはアンダーサンプリングの正しいアプローチですか?

ランダムな削除が間違っている場合、sklearnに事前定義されたパッケージや、これを実行するためにpythonに実装できるロジックがありますか?

また、オーバーサンプリングを扱うSMOTEテクニックについても学びました。これを値4に試してみますか?そして、Pythonの組み込みパッケージを使用してこれを行うことができますか?この状況で誰かが私を助けてくれるといいですね。

回答:


5

このペーパーでは、ランキングの使用を提案しています(私が作成しました)。たとえば、SVMを直接使用する代わりに、RankSVMを使用します。ランカーは観察と観察を比較するため、トレーニングは必然的にバランスが取れています。ただし、2つの「しかし」があります。トレーニングははるかに遅く、最終的に、これらのモデルが行うことは、あるクラスに属する可能性から別のクラスに属する可能性の順に、観測をランク付けすることです。その後、しきい値を適用します。

前処理を使用して不均衡を修正する場合は、MetaCostを検討することをお勧めします。このアルゴリズムは、モデルのバギングを構築し、予測が難しいケースに基づいてモデルのバランスをとるためにクラスの事前変更を行います。とても上品です。SMOTEのような方法の優れた点は、新しい観測を作成することにより、小さなデータセットをより堅牢にすることができることです。

とにかく、クラスの不均衡についていくつか書いたとしても、それが現実の世界で重要な問題であるかどうかはまだ懐疑的です。トレーニングセットに事前不均衡があるのは珍しいと思いますが、実際のデータには事前均衡があります。あなたは?通常発生するのは、タイプIのエラーはタイプIIのエラーとは異なり、ほとんどの人がコストマトリックスを使用する方が良いと思います。これは、ほとんどのトレーニングメソッドが受け入れるか、MetaCostまたはSMOTEを使用して前処理することで適用できます。多くの場合、「不均衡の修正」は「タイプIとIIのエラー間の相対的なトレードオフについて考えたくありません」に短いと思います。

補遺:

私は、sklearnを使用したAdaboost、GradientBoostテクニックなどの組み込みのPythonアルゴリズムを試しました。私はこれらのアルゴリズムが不均衡クラスを処理するためのものであることを読みました。

不均衡を考慮して重みの分布を初期化すると、AdaBoostはクラスの不均衡により良い結果をもたらします。必要に応じて、これを読んだ論文を掘り下げることができます。

とにかく、もちろん、これらの方法では精度が良くありません。トレーニングと検証データセットの両方でクラスの不均衡がありますか?F1スコアなどのメトリックを使用するか、コスト行列を精度関数に渡す必要があります。「修正」クラスの不均衡は、トレーニングと検証ケースで事前分布が異なる場合です。


4

sklearnのアルゴリズムの一部には、「balanced」に設定できるclass_weightと呼ばれるパラメーターがあります。これにより、sklearnは、各クラスのサンプル数に応じてクラスの重みを調整します。

ランダムフォレスト分類子については、以下を試して、スコアが向上するかどうかを確認してください。

rf = RandomForestClassifier(class_weight="balanced") # also add your other parameters!

(class_weight = "balanced")を使用しようとしたときに十分な改善が得られない
SRS

2
class_weightkCk=2NkNsample_weight=[C_k for k in y]accuracy_scoref1_score

2

はい、これはクラスの不均衡の問題に取り組むための素晴らしいテクニックです。ただし、アンダーサンプリング手法を使用すると、データセットの情報が失われます(たとえば、残りの変数から興味深いパターンを削除しただけで、モデルのトレーニングが向上した可能性があります)。このため、特にデータセットが小さい場合は、オーバーサンプリング手法が推奨されます。

Pythonパッケージに関するクエリへの応答として、imbalanced-learnツールボックスは同じタスク専用に設計されています。いくつかのアンダーサンプリングおよびオーバーサンプリングメソッドを提供します。SMOTEテクニックを試すことをお勧めします。


1

使用するアンサンブル手法によって異なります。マルチクラスデータの不均衡の問題を扱っている基本的な問題。アンダーサンプリングは、バギングおよびブースティング技術で効率的に使用できます。SMOTEアルゴリズムは、新しいサンプルの生成に非常に効率的です。データの不均衡の問題は、文献で広く研究されています。これらのアルゴリズムの1つについてお読みになることをお勧めします。SMOTEの代わりに、ADA-SMOTEまたはBorder-Line SMOTEを試すことができます。私はマルチクラスのボーダーラインSMOTEを使用して変更しましたが、非常に効率的です。データベースが非常に大きく、問題が簡単な場合:viola-jones classifierを試してください。私はデータの不均衡の問題でも使用しており、それは本当に効率的です


ガイダンスをありがとう。私はあなたが言及したトピックを調査しています。しかし、私がアンダーサンプリング(データをランダムに削減する)に使用した手法は正しい方法ですか?
SRS

データベースが非常に大きい場合に使用できます。ただし、データベースが小さい場合、一部の情報が失われます。Rus-Boostingを読んでください。この方法では、情報の損失を回避するために、ブースティングアルゴリズムの一部としてランダムアンダーサンプリングを使用しています。彼らは、データベース全体ではなく、次の基本学習者のトレーニングに使用されるサブセットをサンプル化しています
Bashar Haddad

私のデータセットには約8万件のレコードがあり、トレーニングセットとして使用しています。私はこれをpythonで実装しています。私はsklearnまたはpythonの他のパッケージを探していました。私はそれらを見つけることができませんでした。これは、実装するために適切なロジックを適切に設定する必要があるものですか?
SRS

これらのメソッドの実装はないと思います。データの不均衡の問題はまだ調査中です。Adaboost.M1またはM2の適切な実装がある場合。Rus Boostになるように簡単に変更できます
Bashar Haddad

私はあなたが持っているデータベースはかなり大きいと思います、そしてあなたが望むならあなたはviola-jones分類器を使うことができます。これについては、利用可能な実装が見つかるかもしれません
Bashar Haddad

0

ここにはすでにいくつかの良い答えがあります。木の集団を使用しているように見えるので、もう1つテクニックを追加すると思いました。多くの場合、ROCのリフト曲線またはAUCを最適化しようとしています。このため、私はあなたの樹の枝を分割するためのヘリンガー距離基準をお勧めします。これを書いている時点では、アンバランス学習パッケージには含まれていませんが、計画があるようです。


0

クラスの不均衡の問題を処理するときは、主にエラーメトリックに集中し、エラーメトリックとしてF1スコアを選択する必要があります。

正しい指標を選択したら、この問題に対処するためにさまざまな手法を使用できます。

興味があれば、次のブログをご覧ください。このクラスの不均衡の問題を解決するために使用される手法について、非常にうまく説明されています。

https://knowledgengg.wordpress.com/2019/03/04/this-is-suresh/

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.