アクチュアリーはデータサイエンスの夢を見るか?

Rで保険数理と機械学習をやっています

Rで異常値検出してみた(MT法、One Class SVM)(スイス銀行紙幣③)

今回は初心に帰ってスイス銀行紙幣を取り扱います。使用するデータは以前の記事と同じものです。
r-std.hatenablog.com
f:id:r_std:20160503082222p:plain

真札と偽札が含まれるスイス銀行紙幣のデータについて、線形判別分析、二次判別分析を行って識別したところ、高い精度で識別を行うことができました。以前の記事では誤識別されたデータ(下記散布図のピンク色の点)について、「真札中の異常値である」と評価をしていました。
f:id:r_std:20160504100515p:plain
本記事では当該データが本当に異常値であるかを検証します。真札のデータのみが得られている状況から異常値の特定を行い、当該データが異常値として検出されることを確認します。今回は2つの方法を用いて検証します。

1.MT(マハラノビス・タグチ)法
名前のとおりマハラノビス距離を用いて群団の重心から遠いデータを異常値として判定する方法になります。手法の詳細については下記リンクが分かりやすいです。
http://heartland.geocities.jp/ecodata222/ed/edj1-2-2-4.html

スイス銀行紙幣の真札データに適用したところ次の散布図の青点のとおり異常値を検出しました。(異常値のマハラノビス距離は3以上と設定しています。)f:id:r_std:20180708131227p:plain
前述の誤識別された点(既出の図ではピンクの点)が、MT法では異常値として検出されていることが確認できます。(diagonalが最小の点、つまり散布図の一番下の列でx軸に張り付いている青点が誤識別された点になります。)

2.One Class SVM
SVM教師なし学習として用いる方法です。カネール関数を利用してデータを高次元空間に写像し、原点からの距離を最大化するように識別境界を設定します。通常のSVMでは2群のデータの間に識別境界を描こうとしますが、One Class SVMでは原点とデータとの間に識別境界を描こうとする特徴があります。手法の詳細については下記リンクが分かりやすいです。
datachemeng.com
スイス銀行紙幣の真札データに適用したところ次の散布図の緑点のとおり異常値を検出しました。(sigma=0.01,mu=0.001)
f:id:r_std:20180708161409p:plain
こちらも前述の誤識別された点(ピンクの点)が、異常値として検出されていることが確認できます。

3.MT法とOne Class SVM法の違い
スイス銀行紙幣では両者の違いがいまひとつよくわからなかったので、次のような仮想のデータを作成してみました。平均100程度の2変量正規乱数を大量に用意し、ノイズデータとして平均150程度の2変量正規乱数を少量とY=250-Xとなるような関係を持つデータを追加してみました。
f:id:r_std:20180708173631p:plain
MT法の結果は次の通りです。愚直にデータの重心からの距離を用いて評価していることが伺えます。
f:id:r_std:20180708173614p:plain
マハラノビス距離の分布は次の通りです。追加したノイズデータについてマハラノビス距離が大きいことが観察できます。
f:id:r_std:20180708172348p:plain

一方でOne Class SVMの結果は次の通りです。
f:id:r_std:20180709013032p:plain
各データの類似性を捉えて異常値を評価できていることが観察されます。識別境界を引いてみたところ次のようになりました。
f:id:r_std:20180709012958p:plain

もうひとパターンデータを用意してみます。
f:id:r_std:20180709232346p:plain

MT法の場合
f:id:r_std:20180709232500p:plain

One Class SVM法の場合
f:id:r_std:20180709232540p:plain

データが一定の分布に従っている場合にはMT法が有効と思われますが、複数のデータが混じっていたり、データの散らばりが大きい場合はOne Class SVMの方が有効かもしれません。

今回使用したソースコードは次の通りです。

Outliers

Outliers2