Rで行うSVM解析

SVM のアルゴリズムは様々なものが考え出されている。これらのうち、いくつかのアルゴリズムが R のパッケージとして提供されている。いずれも、学習データとしてデータフレーム型(または行列型)のデータを用意する必要がある。

パッケージアルゴリズム
e1071libsvm のアルゴリズム(Chang and Lin, 2001)を利用することができる。他に視覚化やパラメーター調整などを行いこともできる。(Dimitriadou et al., 2005)
kernlabカーネル法に基づく SVM アルゴリズムを利用できる。そのほかに、libsvm や bsvm (Hsu and Lin, 2002) を改良した柔軟性のある SVM を提供している。
klaRSVMlight アルゴリズムを利用できる。
svmpath

e1071

e1071 は libsvm へのインターフェースを提供している。また、実際に作ったモデルを視覚化することもできる。

library(e1071)
data(iris)

# libsvm でモデル作成
model <- svm(
           Species ~ ., data = iris,       # irisのSpeciesを他の特徴量で予測
           method = "C-classification",    # 分類方法
           kernel = "linear",              # カーネル関数
           cost = 2                        # Cパラメーター
         )


# モデルの確認
model
## Call:
## svm(formula = Species ~ ., data = iris, method = "C-classification", 
##     kernel = "linear", cost = 2)
## 
## Parameters:
##    SVM-Type:  C-classification 
##  SVM-Kernel:  linear 
##        cost:  2 
##      gamma:  0.25 
## 
## Number of Support Vectors:  24


# 予測用にサンプルデータを5つ作成します
unknown <- data.frame(
             Sepal.Length = c(5.1, 5.2, 6.7, 4.5, 7.0),
             Sepal.Width = c(3.5, 3.3, 4.1, 3.1, 5.0),
             Petal.Length = c(1.1, 1.5, 2.1, 6.7, 4.1),
             Petal.Width = c(0.2, 0.1, 0.3, 1.2, 1.4)
           )


# 予測結果
predict(model, unknown, decision.values = TRUE)
##          1          2          3          4          5 
##     setosa     setosa     setosa  virginica versicolor 
## attr(,"decision.values")
##   setosa/versicolor setosa/virginica versicolor/virginica
## 1         1.8208103       1.47264811            12.167505
## 2         1.5335990       1.34830896            11.547934
## 3         0.7999217       1.15153503            11.701613
## 4        -2.2194464      -1.10219176            -2.061327
## 5        -1.0224676      -0.01898811             5.856400
## Levels: setosa versicolor virginica

交差検定(cross validation)を利用する場合は、cross 引数にデータの分割数を与えることで、簡単に実現可能です。

model <- svm(Species ~ ., data = iris, cross = 5)

# モデルの確認
summary(model)
## Call:
## svm(formula = Species ~ ., data = iris, cross = 5)
## 
## Parameters:
##    SVM-Type:  C-classification 
##  SVM-Kernel:  radial 
##        cost:  1 
##       gamma:  0.25 
## 
## Number of Support Vectors:  51
##  ( 8 22 21 )
## 
## Number of Classes:  3 
## 
## Levels: 
##  setosa versicolor virginica
## 
## 5-fold cross-validation on training data:
## 
## Total Accuracy: 94.66667 
## Single Accuracies:
##  93.33333 93.33333 93.33333 96.66667 96.66667 

kernlab

kernlab パッケージを利用した SVM のモデルの生成方法です。データは R に標準搭載されている iris のデータセットを用います。

kernlab の基本的な使い方

library(kernlab)
data(iris)

# データを確認
head(iris)


# SVMモデル構築
model <- ksvm(
           Species ~ ., data = iris,  # irisデータのSpeciesを他の特徴量でモデル化
           type = "C-bsvc",           # 分類方法を指定します
           kernel = "rbfdot",         # 利用するカーネル関数を指定します
           kpar = list(sigma = 0.2),  # カーネル関数のパラメーターを指定
           C = 5,                     # Cパラメーター
           prob.model = TRUE          # 予測時に予測確率を出力するためにTRUEにします
         )


# モデルの確認
model
## Support Vector Machine object of class "ksvm" 
## 
## SV type: C-bsvc  (classification) 
##  parameter : cost C = 5 
## 
## Gaussian Radial Basis kernel function. 
##  Hyperparameter : sigma =  0.2 
## 
## Number of Support Vectors : 35 
## 
## Objective Function Value : -4.0585 -2.8851 -71.6198 
## Training error : 0.013333 
## Probability model included.


# 予測用にサンプルデータを5つ作成します
unknown <- data.frame(
             Sepal.Length = c(5.1, 5.2, 6.7, 4.5, 7.0),
             Sepal.Width = c(3.5, 3.3, 4.1, 3.1, 5.0),
             Petal.Length = c(1.1, 1.5, 2.1, 6.7, 4.1),
             Petal.Width = c(0.2, 0.1, 0.3, 1.2, 1.4)
           )


# 予測結果(decision value)
predict(model, unknown, type = "decision")
##            [,1]         [,2]        [,3]
## [1,] -1.2927447 -1.091186585 -1.46073412
## [2,] -1.1958328 -1.051977445 -1.89962462
## [3,] -0.5993780 -0.612076340 -0.92521246
## [4,]  0.5588753  0.518512789  0.25939620
## [5,] -0.1994391 -0.002662102 -0.01813103


# 予測結果(probabilities)
predict(model, unknown, type = "probabilities")
##          setosa versicolor   virginica
## [1,] 0.98184361 0.01012550 0.008030891      #1番目のデータはsetosaの可能性が大
## [2,] 0.97716470 0.01381751 0.009017784      #2番目のデータはsetosaの可能性が大
## [3,] 0.85831311 0.09598516 0.045701729      #...
## [4,] 0.07959653 0.32750762 0.592895851
## [5,] 0.44050096 0.24062263 0.318876411

カーネル関数の調整

ksvm 関数にはオリジナルのカーネル関数を入力することができます。以下は、k01 関数を作成し、これを SVM のモデル生成に利用した例です。

# カーネル関数を定義
k01 <- function(x, y) {
  return(exp(x) ^ 2 / y)
}
class(k01) <- "kernel"


# SVMモデルの作成
mdoel <- ksvm(Species ~ Sepal.Length, data = iris, kernel = k01)

References

  • B. Schölkopf, J. Platt, J. Shawe-Taylor, A. J. Smola, and R. C. Williamson. Estimating the support of a high-dimensional distribution. Neural Computation 2001, 13:1443-71. ACM
  • Dimitriadou E, Hornik K, Leisch F, Meyer D, Weingessel A Misc Functions of the Department of Statistics (e1071) TU Wien 2005.
  • C.-W. Hsu and C.-J. Lin. A. comparison on methods for multi-class support vector machines IEEE Transactions on Neural Networks 2002, 13:415-25. PDF
  • C.-W. Hsu and C.-J. Lin. A. A simple decomposition method for support vector machines Machine Learning 2002, 46:291-314.