手を動かしながら学ぶ ビジネスに活かすデータマイニング(尾崎隆 著)http://amzn.asia/hcUqrIXを 買ったあとにpackageがうまく使えずRをしばらく勉強できなかったので放置・挫折。
サポートベクトルマシンの考え方https://logics-of-blue.com/svm-concept/を参考に実際にやってみる。
SVMは本当に予測に必要なデータ、サポートベクトルのみ使用して分類する。
境界線ともっとも近くにあるのがサポートベクトル
SVMにおいて正しい分類基準を探す基準がマージン最大化
誤判定を許さないハードマージンと許容するソフトマージン
SVMの目標としては
・境界線とデータとはなるべく離れていたほうがいい
・誤判別はなるべく少ないほうがいい
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))
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.