verum ipsum factum

sudillap's blog

「金塊か、キノコ料理か」(外れ値検出問題)を解く[1クラスサポートベクターマシン]

サポートベクターマシンの一種である1クラスサポートベクターマシンで外れ値を見つけてみます。

1クラスサポートベクターマシンでデータを入力空間から特徴空間に写像すると、入力空間で孤立しているデータは特徴空間内の原点近くに写像されます。この性質から支持超平面より原点側にあるデータを外れ値とみなせばいいことになります。

ついでに述べておきますと、クラス分類問題に用いられるサポートベクターマシンは教師あり学習ですが、1クラスサポートベクターマシンは教師なし学習です。したがって、外れ値検出のための教師データは不要です。


ところで、1クラスサポートベクターマシンには次に述べる2つのパラメータがあり、それらをユーザーが指定する必要があります。

$\sigma$
カーネルにRBF(radial basis function)を用いているため。
$\nu$
1クラスサポートベクターマシンは$\nu$サポートベクターマシンにもとづいています。$\nu$によりデータに占める外れ値の割合の上限を指定できます。

Rスクリプトとその結果を次に示します。SVMのパラメータのうち、$\sigma$は自動推定機能で求め、$\nu$は0.01~0.2まで0.01刻みで指定しています。
実行結果から1番、87番、100番が外れ値の候補となります。ただし、このスクリプトとは異なったパラメータ($\sigma$、$\nu$)を指定するとまた異なった結果が得られると思います。

library(kernlab)
for(i in 1:20){
  nu <- 0.01*i
  mdl <- ksvm(as.matrix(gold),type="one-svc",kernel="rbfdot",nu=nu)
  outliers <- SVindex(mdl)[which(coef(mdl)==1.0)]
  if(length(outliers)>0){
    print(paste("nu:",nu," -> ",paste(outliers,collapse=" / ")))
  }
}
[1] "nu: 0.15  ->  87 / 100"
[1] "nu: 0.16  ->  1 / 87 / 100"
[1] "nu: 0.18  ->  1 / 87 / 100"
[1] "nu: 0.19  ->  1 / 7 / 16 / 18 / 21 / 22 / 63 / 87 / 91 / 94 / 99 / 100"
[1] "nu: 0.2  ->  1 / 7 / 16 / 18 / 21 / 22 / 63 / 87 / 91 / 94 / 99 / 100"