SVM(サポートベクターマシン)

手を動かしながら学ぶ ビジネスに活かすデータマイニング(尾崎隆 著)http://amzn.asia/hcUqrIXを 買ったあとにpackageがうまく使えずRをしばらく勉強できなかったので放置・挫折。

サポートベクトルマシンの考え方https://logics-of-blue.com/svm-concept/を参考に実際にやってみる。

SVMは本当に予測に必要なデータ、サポートベクトルのみ使用して分類する。
境界線ともっとも近くにあるのがサポートベクトル
SVMにおいて正しい分類基準を探す基準がマージン最大化
誤判定を許さないハードマージンと許容するソフトマージン

SVMの目標としては
・境界線とデータとはなるべく離れていたほうがいい
・誤判別はなるべく少ないほうがいい

irisを使って実践。まずはデータセット準備

irisを使って実践してみる。Iris(アヤメ)はSepal(がく片)とPetal(花びら)のデータ
ヒオウギアヤメ(Setosa)、ハナショウブ(Versicolor)、カキツバタ(Virginica)の3種のデータ
今回はヒオウギアヤメとハナショウブに絞って行う。
図のためにggplot2、SVMにkernlabはインストール済み(codeは非表示)

# irisを解析用にiris_svmとして保存
iris_svm <- iris
# irisのデータフレームの中身を確認
str(iris_svm)
## 'data.frame':    150 obs. of  5 variables:
##  $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
##  $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
##  $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
##  $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
##  $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
# Species(数値データ)を置換&1列追加
# iris_svm[,"Species"] <-as.numeric(iris_svm$Species)だとfactorが消えるので分類に困る。
iris_svm <- transform(iris_svm, Species2=as.numeric(iris_svm$Species))
# Speciesの1-2をsubsetで抽出
iris_svm <- subset(iris_svm, Species2<=2)
# 図で確認。
plot(iris_svm$Sepal.Length, iris_svm$Sepal.Width, col=as.numeric(iris_svm$Species))

irisを使って実践。まずはデータセット準備2

SVMうまくできないので、データフレーム内のvariableが多いのかと思い減らしてみる。

# irisのうちSVMで使う3つに絞る。試行錯誤過程
iris_Sepallength_vector <- iris[,1]
iris_SepalWidth_vector <- iris[,2]
iris_Species_vector <- iris[,5]
svm_iris <- data.frame(Length=iris_Sepallength_vector,Width=iris_SepalWidth_vector,Species=iris_Species_vector)
# 構造を確認
str(svm_iris)
## 'data.frame':    150 obs. of  3 variables:
##  $ Length : num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
##  $ Width  : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
##  $ Species: Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
# Speciesは3つあってこまるので変更。Numericにして削る(もっといい方法がわからん)
svm_iris[,"Species"] <- as.numeric(svm_iris$Species)
svm_iris <- subset(svm_iris,Species<=2)
str(svm_iris)
## 'data.frame':    100 obs. of  3 variables:
##  $ Length : num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
##  $ Width  : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
##  $ Species: num  1 1 1 1 1 1 1 1 1 1 ...
# もう一度ファクターに直す。
svm_iris$Species <- as.factor(svm_iris$Species)
str(svm_iris)
## 'data.frame':    100 obs. of  3 variables:
##  $ Length : num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
##  $ Width  : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
##  $ Species: Factor w/ 2 levels "1","2": 1 1 1 1 1 1 1 1 1 1 ...

リンク先のようにやったらSVMできるかと思ったらできなかったので終了。
svm_iris2 <- ksvm(
type ~ Length + Width,
data=svm_iris,
type=“C-svc”,
kernel=“vanilladot”)

また学習

Note that the echo = FALSE parameter was added to the code chunk to prevent printing of the R code that generated the plot.