以下の論文を読みます。
それも含めて、検証実験のコンフィギュレーションを説明しましょう。今回は2つの実験を行うのですが、1つ目の実験では、各データセットをまず訓練用とテスト用に2分割します。そして、訓練用データから正常データのみを取り出してモデルを訓練します。そのモデルをテストデータに適用するのですが、今回は教師なし学習なので、モデルの出力は各サンプルが「正常か異常か」ではなく「どれくらい異常か」ですね。そこで、今回は次のようにします。「各データセットの異常データ混入割合をa%としたとき、テストデータ異常度の上位a%が『異常』、その他が『正常』と判定されたとする。」 例えば、3つ目の不整脈のデータセットには異常データが15%含まれているので、異常度の上位15%が『異常』判定ということです。こうすれば、通常の分類問題の評価指標がそのまま利用できますね。つまり、精度、感度、F値で各モデルを比較します。
なるほど、それならある程度フェアな比較になるのかな。
それでその1つ目の実験の結果ですが、論文10ページに数表がありますが、見やすいようにF値のみグラフにしてみました。
4.5 節に低次元表現の可視化がありますね。Figure 3. (a) の DAGMM の低次元表現は、他のモデル (b) (c) (d) よりも正常データ(青)と異常データ(赤)をよく分離できていると思いませんか?
まあ、(a) が比較的赤と青が混ざっていないようには見えるけど…3次元プロットじゃ他の角度からも見てみないとよくわかんないような。
どっち!? ちゃんと読んで!
論文の内容は以上になります。あ、今後の課題とかは特にないです。
ないんだ!?
実際にベンチマークに用いられたデータセットを見てみましょう。どのデータセットも Web 上で見つかると思いますが、一番サイズが小さいところで不整脈のデータは以下に落ちてました。
UCI Machine Learning Repository: Arrhythmia Data Set
これは一番最後のカラムが不整脈の種類ラベルみたいですね。それで、論文には dimension が 274 とあるのにラベルを除いても 279 カラムあってどういうことだろうかと思ったんですが、11~15カラム目に欠損値があったのでおそらくそこを除いていると思います。なので欠損カラムを取り除いてとりあえず自己符号化器にかけてみました。ニューロン数も活性化関数もバッチサイズもエポック数も全て論文に明記されていますからね。あ、論文には tensorflow で実装したとありますが、さしあたり keras で書きます。
# -*- coding: utf-8 -*- import numpy as np import pandas as pd from keras.models import Sequential from keras.layers import Dense if __name__ == '__main__': df = pd.read_csv('arrhythmia.data', header=None) df = df.drop(df.columns[[10,11,12,13,14]], axis=1) y = df.iloc[:,274].values x = df.drop(df.columns[[274]], axis=1).values print(y.shape) print(x.shape) encoder = Sequential() encoder.add(Dense(10, activation='tanh', input_shape=(274,))) encoder.add(Dense(2)) decoder = Sequential() decoder.add(Dense(10, activation='tanh', input_shape=(2,))) decoder.add(Dense(274)) compression_net = Sequential() compression_net.add(encoder) compression_net.add(decoder) compression_net.compile(loss='mean_squared_error', optimizer='RMSProp') compression_net.fit(x, x, shuffle=True, epochs=10000, batch_size=128)
じゃあもうちょっと頑張ろうよ!?
今日はもう遅いので…。ところで、R を書いた直後に Python を書くと混乱しませんか?
知らないよ…。