EnsekiTT Blog

EnsekiTTが書くブログです。

異常値が混ざった学習データを掴まされたのでOneClassSVMで綺麗にしてみた話

つまりなにしたの?

OneClassSVMで異常値を含んだ学習データセットを学習してしまったので、
学習データセットをOneClassSVMで分類して異常値を削除してみた。
youtu.be

なんでやったの?

One Class SVMで異常値判定をするのは良いものの、最初に与えるデータに異常値が含まれていると辛い。
ただ、全部のデータを見るのも辛い。

用意したデータ

実行環境

Python 3.6.2

matplotlib==2.0.2
numpy==1.13.1
scipy==0.19.1
scikit-learn==0.19.0

やってみた手順

大体何割くらい外れ値が紛れ込んでいるか予想する(今回は10%くらい)
10%分のデータを外すまでループ
 学習データセットをocsvmで学習する
 同じ学習データセットを学習したocsvmにかけて分離超平面からの距離を出してもらう
 最も離れているものを学習データセットから外す
  (データ量が多い場合は上位何サンプルかを一気に外しても良いかも)
以上ループ

終わった後に、
異常学習データのうちいくつ外せたか?

正常学習データのうちいくつ外してしまったか?
を調べてみた。

結果

正常値の分布が1箇所の場合

  • 異常学習データのうちいくつ外せたか?

error_delete = 84

  • 正常学習データのうちいくつ外してしまったか?

normal_delete = 16
f:id:ensekitt:20170831225723p:plainf:id:ensekitt:20170831225759p:plain

正常値の分布が2箇所の場合

  • 異常学習データのうちいくつ外せたか?

error_delete = 79

  • 正常学習データのうちいくつ外してしまったか?

normal_delete = 21
f:id:ensekitt:20170831225812p:plain
f:id:ensekitt:20170831225730p:plain

正常値の分布が4箇所の場合

  • 異常学習データのうちいくつ外せたか?

error_delete = 69

  • 正常学習データのうちいくつ外してしまったか?

normal_delete = 31
f:id:ensekitt:20170831225818p:plainf:id:ensekitt:20170831225907p:plain

どうだったのか

異常値の分布のとり方上正常時が広範囲に分布するほどこの手法が取りにくくなる。
実データの場合は異常値が異常値同士で狭い範囲に分布してしまうとこの方法は使えない。
俯瞰してみて行けそうだったら使ってみるのもありかもしれない。