なんでやったの?
One Class SVMで異常値判定をするのは良いものの、最初に与えるデータに異常値が含まれていると辛い。
ただ、全部のデータを見るのも辛い。
やってみた手順
大体何割くらい外れ値が紛れ込んでいるか予想する(今回は10%くらい)
10%分のデータを外すまでループ
学習データセットをocsvmで学習する
同じ学習データセットを学習したocsvmにかけて分離超平面からの距離を出してもらう
最も離れているものを学習データセットから外す
(データ量が多い場合は上位何サンプルかを一気に外しても良いかも)
以上ループ
終わった後に、
異常学習データのうちいくつ外せたか?
と
正常学習データのうちいくつ外してしまったか?
を調べてみた。
結果
正常値の分布が1箇所の場合
- 異常学習データのうちいくつ外せたか?
error_delete = 84
- 正常学習データのうちいくつ外してしまったか?
normal_delete = 16
正常値の分布が2箇所の場合
- 異常学習データのうちいくつ外せたか?
error_delete = 79
- 正常学習データのうちいくつ外してしまったか?
normal_delete = 21
正常値の分布が4箇所の場合
- 異常学習データのうちいくつ外せたか?
error_delete = 69
- 正常学習データのうちいくつ外してしまったか?
normal_delete = 31
どうだったのか
異常値の分布のとり方上正常時が広範囲に分布するほどこの手法が取りにくくなる。
実データの場合は異常値が異常値同士で狭い範囲に分布してしまうとこの方法は使えない。
俯瞰してみて行けそうだったら使ってみるのもありかもしれない。