Help us understand the problem. What is going on with this article?

pythonで、不均衡データを識別が難しいサンプルを残してundersamplingしたいときは、imbalanced-learnのNearMissを使う

More than 1 year has passed since last update.

intro

分類タスクなどで、クラスごとのサンプル数が極端に偏っていることがあります。

そういった場合、一つの方法としてresamplingを行うことがあります。

どちらかといえばoversamplingを使うことのケースが多いかと思うのですが、
以下のようにundersamplingを使いたいケースがありました。

  • 全部を使ってトレーニングするには、データが多すぎる。
  • 偏りが非常に大きいため、Majority classを大幅に減らしたい
  • 線形で分けにくいケースがある
  • Majority classのうち明らかに識別できそうなものを除いて、識別が難しいサンプルを残したい

例えば、異常検知系だとこういったケースもあるかと思います。

pythonでこういったケースに簡単に対処するには、どうすればいいか調べたのでシェアいたします。

(なおundersamplingしたいのはMajority classのほうが多いかと思うので、
この記事の中では対象をMajority classサンプルとしています。)

方法

imabalanced-learn.under_samplingのNearMissを使います。

imbalanced-learnのUndersamplingにはTomek’s linksなどcleaningベースのmethodもあります

しかしノイズなるかもしれないsampleや境界付近のサンプルを取り除く手法で、

目的にはそぐわないのでここでは選びません。

(図はすべてimbaanced-learnの公式サイトから引用)

アルゴリズム

以下の手順で残すMajority classに属するサンプルを選びます。

Minority classのサンプルはすべて残します。

  1. 事前にk-nearest neighborsにより、それぞれのサンプルの近傍にあるサンプルを計算しておきます。
  2. heuristicルールを使って残すサンプルを選ぶ。ルールには3タイプあります。

  • NearMiss-1
    Minority classのサンプルのうち近くにあるkサンプルからの平均距離が小さいMajority classのサンプルを残します。 sphx_glr_plot_illustration_nearmiss_0011.png
    そのため理想的な状況なら、境界近くにあるサンプルが残りやすくなります。
    ただしMajority Classの領域の中にノイズとしてMinority Classのサンプルが含まれていると、
    それらの近くのサンプルを選びやすくなります。
    逆にMinority Classの領域の中にMajority Classのサンプルが含まれていても、それらは残りやすくなります。

  • NearMiss-2
    1.とは逆に遠いkサンプルからの平均距離がもっとも小さいMajority classのサンプルを選びます。
        sphx_glr_plot_illustration_nearmiss_0021.png
    残ったsampleは境界に集中することはありませんが、それでもある領域に集中しやすいです。 こちらもminority classに大きな外れ値が複数あると、それに引っ張られて残る領域に偏りができてしまいます。 逆にMajority class領域内に存在するMinority Classのサンプルには影響を受けにくくなります。

  • NearMiss-3
    minority classのそれぞれのサンプルから、それぞれM番目までの近さにあるMajority Classのサンプルを残します。

sphx_glr_plot_illustration_nearmiss_0031.png
その絞り込まれたMajority Classのサンプルから、さらに自身の近傍にあるN個のminorityのclassからの平均距離が一番遠いものを残します。
他の2つよりノイズの影響を受けにくいようです。

単純な例での比較

example

example2

NearMiss-1とNeaMiss-2により残ったサンプルがMajority領域の一部に集中している一方で、
NearMiss-3はばらけて分布しているのが分かるかと思います。

性能

原著の論文では、医学論文のアブストから関連するproteinの名前のtagをつける分類タスク(ただし文章中の単語を分類)で
性能を比較しています。

性能劣化が一番抑えられたのは、NearMiss-2でした。
なお原著ではrandom samplingとそんなに変わらなかったともあります。

まとめ

pythonで識別の難しいサンプルを残しながらundersamplingをするなら、

imbalanced-learnのNearMissを使うといいということが分かりました。

ただし結局どこまでいってもベースとなるk-nearest neighborが、
うまく機能する特徴量を探す必要があります。

場合によってはrandom samplingの方がいいかもしれません。

参考文献

daimonji-bucket
オオサンショウウオは未知なる食材を調理する。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした