R言語を使ってOne Class SVM(1クラス サポートベクターマシン)を使った外れ値検出を行う手順を自分用のメモとしてまとめました。
手順 1: サンプルデータ UKgas
を読み込みます
R> data("UKgas")
R> UKgas
手順 2: 関数 str()
を使って、時系列データ UKgas
の構造を確認します
R> str(UKgas)
Time-Series [1:108] from 1960 to 1987: 160.1 129.7 84.8 120.1 160.1 ...
→ 1960年から1987年までのデータが格納された時系列データであることを確かめます。
手順 3: ライブラリ kernlab
を読み込みます
R> library("kernlab")
手順 4: 関数 as.numeric()
と関数 data.frame()
を使って、時系列データ UKgas
を数値ベクトルデータに変換、 class
列を追加し、データフレームを作成します
R> ukgas.data <- data.frame(as.numeric(UKgas), class=1)
R> ukgas.data
手順 5: 関数 str()
を使って、作成したデータフレーム ukgas.data
の構造を確認します
R> str(ukgas.data)
'data.frame': 108 obs. of 2 variables:
$ as.numeric.UKgas.: num 160.1 129.7 84.8 120.1 160.1 ...
$ class : num 1 1 1 1 1 1 1 1 1 1 ...
→ 1列目に as.numeric.UKgas(ガスの消費量)、2列目に class(値は全て"1")が格納された data.frame 型オブジェクトであることを確かめます。
手順 6: 関数 ksvm()
を使って、SVMオブジェクトを作成します
R> ukgas.data.svm <- ksvm(x=class~., data=ukgas.data, type="one-svc", kernel="vanilladot")
R> ukgas.data.svm
※ kernel: vanilladot(線形カーネル)、polidot(多項式カーネル)、rbfkernel(RBFカーネル)等から選択。
手順 7: 関数 predict()
を使って、外れ値を検出します
R> ukgas.data.outlier <- predict(ukgas.data.svm)
R> ukgas.data.outlier
手順 8: 関数 ifelse()
を使って、TRUE
,FALSE
の値をそれぞれ2
,1
に置換します
R> cluster <- ifelse(ukgas.data.outlier==TRUE, 2, 1)
R> cluster
手順 9: 関数 rm()
を使って、不要なオブジェクト ukgas.data.outlier
を削除します
R> rm(ukgas.data.outlier)
手順 10: 関数 data.frame()
を使って、元データと外れ値の検出結果をマージします
R> ukgas.data <- data.frame(ukgas.data, cluster)
R> ukgas.data
手順 11: 関数 str()
を使って、作成したデータフレーム ukgas.data
の構造を確認します
R> str(ukgas.data)
'data.frame': 108 obs. of 3 variables:
$ as.numeric.UKgas.: num 160.1 129.7 84.8 120.1 160.1 ...
$ class : num 1 1 1 1 1 1 1 1 1 1 ...
$ cluster : num 1 1 1 1 1 1 1 1 1 1 ...
→ 3列目に cluster が追加されたことを確かめます。
手順 12: 関数 plot()
を使って、散布図を作成します
R> plot(ukgas.data[,1], type="o", col=ukgas.data$cluster)
以上