「金塊か、キノコ料理か」(外れ値検出問題)を解く[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"