SVM


使用するパッケージは次のとおりです.
library(ggplot2)
library(e1071)
library(caret)
library(kernlab)
データを訓練、検証、テストデータ6:2:2に分けます.
iris <- data.frame(iris, stringsAsFactors = TRUE)
set.seed(123)
ind <-sample(3, nrow(iris), replace = TRUE, prob=c(0.6, 0.2, 0.2))
iris_train <- iris[ind==1, ]
iris_valid <- iris[ind==2, ]
iris_test <- iris[ind==3, ]
訓練データフィッティング長の基本的なSVMモデルを用いて機械学習を行い,パラメータはラジアルコアを持つc‐classification,cost=1のモデルにフィッティングされることを示した.
iris_svm = svm(Species ~ ., data = iris_train)
summary(iris_svm)
pred = predict(iris_svm, iris_train)
confusionMatrix(pred, iris_train$Species)
最初に機械学習を行ったモデルの正解率は1であるが,検証データを用いて複数のkernelに対してチューニングパラメータを実行する.
#radial kernel
tune1 = tune.svm(Species~., data = iris_valid, 
                 gamma=10^(-5:0), cost=2^(0:4), 
                 kernel="radial")
tune1

svm_radial = svm(Species~., data = iris_valid,
                 gamma=0.1, cost = 8,
                 kernel="radial")
summary(svm_radial)
pred2 = predict(svm_radial, iris_valid)
confusionMatrix(pred2, iris_valid$Species)
Radial kernelを用いた最適パラメータチューニングの結果,gammaは0.1,コストは8であり,1の精度に達した.
# linear kernel
tune2 = tune.svm(Species~., data = iris_valid, 
                   cost=2^(0:4), 
                   kernel="linear")
tune2

svm_linear = svm(Species~., data = iris_valid,
                 cost = 4,
                 kernel="linear")
summary(svm_linear)
pred3 = predict(svm_linear, iris_valid)
confusionMatrix(pred3, iris_valid$Species)
線形kernelを用いた最適パラメータ最適化の結果はcost=4を用いて1の精度が得られたことを示した.
#polynomia kernel
tune3 = tune.svm(Species~., data = iris_valid, 
                 degree = 2:4, cost=2^(0:4), 
                 kernel="polynomia")
tune3

svm_poly = svm(Species~., data = iris_valid,
                 degree = 3, cost = 2,
                 kernel="polynomia")
summary(svm_poly)
pred4 = predict(svm_poly, iris_valid)
confusionMatrix(pred4, iris_valid$Species)
多項式kernelを用いた最適パラメータ最適化の結果はcost=2,degress=3を用いて0.8966の精度が得られることを示した.
#test
predict = predict(svm_linear, iris_test)
confusionMatrix(predict, iris_test$Species)
predict = predict(svm_radial, iris_test)
confusionMatrix(predict, iris_test$Species)
Radial kernelとLinear kernelともにvalidationデータセットを用いて解析を行った場合,1の精度を示したが,両者の中から予測力が高く安定性の良いLinearを選択して最終的なテストデータセットを解析した結果,0.875の精度を示した.
plot(svm_linear, iris_test, Petal.Width ~ Petal.Length, slice=list(Sepal.Width=3, Sepal.Length=5))
plot(svm_linear, iris_test, Sepal.Width ~ Sepal.Length, slice=list(Petal.Width=2.5, Petal.Length=3))
plot(iris_svm, iris_test, Petal.Width ~ Petal.Length, slice=list(Sepal.Width=3, Sepal.Length=5))
plot(iris_svm, iris_test, Sepal.Width ~ Sepal.Length, slice=list(Petal.Width=2.5, Petal.Length=3))