トップページ | ひとつ上のページ | 目次ページ | このサイトについて | ENGLISH

One-Class SVM

One-Class SVMは、 サポートベクターマシン(SVM) の一種ですが、使い方がかなり違います。

One-Class SVM
上の図のようなデータがあったとします。

これを、One-Class SVMに入力すると、出力は下の図になります。
One-Class SVM
元のデータを、「TRUE」と「FALSE」という分類に分けてくれました。 このTRUEとFALSEは、データの塊の内側と外側になっています。

一般的に知られているSVMは、Y(教師データ)を与えて、Xをどのように区切るとYがうまく分かれるのかを分析しますが、 One-Class SVMは、Yを使いません。 教師なし学習 です。 One-Class SVMは、分類の結果を出力します。

One-Class SVMの難しさ

上の例は、2つの塊の外側と内側をうまく分類してくれたケースです。

実際にこの手法を使う時は、カーネル関数の選択が大事になります。 例えば、選択が良くないと、下図のような分類になります。
One-Class SVM

クラスター分析 のk-Means方でkを設定する時と同じ難しさなのですが、 2次元データなら、グラフを確認することで、パラメータの調整ができるのですが、3次元以上になると、この方法が使えません。

R-EDA1 では、3次元以上の場合は、外側と定義したいデータが「外側」と判定されるかどうかで、結果の正しさを確認する方法を使っています。

使い道

異常の判定

例えば、3つの塊のそれぞれの中心付近なら安全な事がわかっていて、 それらの位置から離れている時は、警戒する必要がある場合、 分類が未知のデータがあって「外側」に相当するのなら、警戒すべき状況な事がわかります。

この性質を使うと、 異常検知 の方法として使えます。

グループ分け

ウェブアプリR-EDA1 では、上記のk-Means法などは、次元圧縮して2次元データに変換したデータに対して、グループ分けをする方法として使っています。

One-Class SVMもこのような目的の方法として、このソフトには入れています。 一般的なクラスター分析は、データの塊をグループ分けしますが、One-Class SVMを使うと、塊の内側か外側かでグループ分けしてくれるので、 一般的なクラスター分析ではできないグループ分けができます。

この用途の他の方法との比較は、 外れたサンプルの探索 にあります。

手法の違い

Rのkernlabのライブラリの場合、カーネル関数は8種類あります。

2変数(2次元)のデータについて、データの違いに対して、手法の違いがどのように表れるのかをまとめています。 nuは0.01にしています。

データからモデルと作り、平面を細かい格子にして、それぞれの格子の判定を見ています。 元のデータがある場所の近辺がTRUEで、それ以外がFALSEになるのが理想です。

結論を先に書くと、以下になります。

One class SVMへの期待は、 MT法 では扱えない複雑な分布への対応なのですが、One class SVMも万能という訳にも行かないようです。

例1A

2次元正規分布のデータです。

良さそうな判定ができたのは、besseldotだけでした。

one-class-svm one-class-svm one-class-svm one-class-svm one-class-svm one-class-svm one-class-svm one-class-svm one-class-svm

例1B

例1Aとほぼ同じですが、外れ値が2つあります。

besseldotは外れ値には影響されていないことがわかります。

one-class-svm one-class-svm one-class-svm one-class-svm one-class-svm one-class-svm one-class-svm one-class-svm one-class-svm

例2A

2次元正規分布の塊が2つあります。

2つの塊を捉えらえているのは、rbfdotだけでした。 しかし、TRUEだけで集まっていて欲しい場所にFALSEが少し混ざっています。 品質管理では、良品を不良品として判定することになりますので、良くありません。

この例では、サンプル数は約3000です。 約100000まで増やしたり、nuを調整しても、rbfdotの結果は同じでした。

one-class-svm one-class-svm one-class-svm one-class-svm one-class-svm one-class-svm one-class-svm one-class-svm one-class-svm

例2B

例2Aとほぼ同じですが、外れ値が4つあります。

結果は例2Aとほぼ同じでした。

one-class-svm one-class-svm one-class-svm one-class-svm one-class-svm one-class-svm one-class-svm one-class-svm one-class-svm

例3

塊はひとつですが、円状ではありません。

rbfdotだけが、良い判定をできました。

one-class-svm one-class-svm one-class-svm one-class-svm one-class-svm one-class-svm one-class-svm one-class-svm one-class-svm

R-EDA1の実施例

R-EDA1 では、異常の判定と、グループ分けの2つの使い方ができます。

異常の判定

トップメニューからたどって、One_Class_SVM_All_Varaiablesまで行くと、One-Class SVMによる異常の判定ができます。 出力の棒グラフですが、学習データになる0のラベル(単位空間)のデータが左側、1のラベル(信号空間)のデータが右側に来ます。    この方法の特徴として、0側のFALSEが0個にならないのは、想定通りです。 1側にTRUEが出てくると、うまく判別できていないことになります。

カーネル関数は8種類から選べます。 また、学習データで、TRUEとFALSEの割合を調節するためのauというパラメタも変えられるようになっています。

また、One_Class_SVM_Selected_Varaiablesの方を選ぶと、 8種類すべてのカーネル関数と、特徴量が1〜3個の場合のすべての組合せを計算した結果が出せます。

One-Class SVM One-Class SVM One-Class SVM One-Class SVM One-Class SVM
One-Class SVM

グループ分け

トップメニューからたどって、One_class_SVM_Clusteringまで行くと、One-Class SVMによるグループ分けができます。 「Dimension Reduction」は、この例では「MDS」ですが、「tSNE」でもできます。 ただし、いずれにしても「Add clustering methods」のチェックは必要です。

特徴量の種類と、nuを調節できる点は、上記と同じです。

One-Class SVM One-Class SVM
One-Class SVM



異常値の判定

参考文献

サポートベクトルマシン」 竹内一郎・烏山昌幸 著 講談社 2015
数ページですが、1クラスSVMが異常の分析に使える話があります。


パターン認識」  平井有三 著 森北出版 2012
外れ値の検出の方法として、1クラスSVMが紹介されています。


異常検知に用いられる1クラスSVMの決定境界をパラメータを変えながら描いてみた
https://tjo.hatenablog.com/entry/2017/05/28/135918
尾崎隆氏のブログです、nuを変えると、境界に含まれる学習データの量が変えられることが書かれています。
nuのデフォルトは、ライブラリによって違いますが、0.2や0.5くらいになっています。 これを小さくすれば良いそうです。




順路 次は MT法

Tweet データサイエンス教室