library(e1071)
data(iris)
attach(iris)e1071
パッケージの概要
Rのパッケージe1071は、サポートベクトルマシン(Support Vector Machines)やカーネル法に関連する機械学習アルゴリズムやツールを提供するパッケージです。サポートベクトルマシンを実装するためのsvm()関数は、サポートベクトルマシンに特化したC++ライブラリであるlibsvmの機能を利用しています。
本コード活用例では、iris(アイリスの花の種類ごとに測定された花弁などの長さ・幅のデータ)を用いて、サポートベクトルマシンを実装します。
サポートベクトルマシンの実装例
e1071パッケージでサポートベクトルマシンを実装する際は、svm関数を利用します。
以下のコードで、iris(アヤメの花ごとの種類、花弁などの長さ・幅のデータ)のSpecies(種類)を目的変数、Species以外を説明変数として、サポートベクトルマシンを作成し、print(model)で、モデルのParametersなどを出力します。
x <- subset(iris, select = -Species)
y <- Species
model <- svm(x, y)
print(model)
Call:
svm.default(x = x, y = y)
Parameters:
SVM-Type: C-classification
SVM-Kernel: radial
cost: 1
Number of Support Vectors: 51
print(model)の出力結果のうち、Parametersに記載されている「SVM-Type」は、サポートベクトルマシンの種類を示しており、「SVM-Kernel」はカーネル関数の種類を示しています。
svm関数で利用可能なサポートベクトルマシンの種類およびカーネル関数の種類は以下の通りです。詳細については、リンク先を参照してください。
なお、e1071パッケージで利用可能なカーネル関数は下表の4種類のみです。kernlabパッケージでは、カーネル関数を自作するなど、e1071パッケージよりも柔軟にカーネル関数を設定可能です。
https://cran.r-project.org/web/packages/e1071/vignettes/svmdoc.pdf
<サポートベクトルマシンの種類>
| 区分 | 種類 | パラメータ |
|---|---|---|
| 分類 | C-classification | cost |
| 分類 | nu-classification | nu |
| 分類 | one-classification | nu |
| 回帰 | eps-regression | cost, epsilon |
| 回帰 | nu-regression | cost, nu |
<カーネル関数の種類>
| 種類 | パラメータ |
|---|---|
| linear | なし |
| polynomial | gamma, degree, coef0 |
| radial | gamma |
| sigmoid | coef0 |
テストデータと訓練データの分割
本項では、irisをテストデータと訓練データに分割し、訓練データを用いて、先ほどと同じようにサポートベクトルマシンを作成します。
print(model)の出力結果の通り、サポートベクトルマシンの種類は”C-classification”,カーネル関数は”radial”です。
index<-1:nrow(iris)
N<-trunc(length(index)/3)
testindex<-sample(index, N)
testset<-iris[testindex,]
trainset<-iris[-testindex,]
x <- subset(trainset, select = -Species)
y <- trainset$Species
model <- svm(x, y)
print(model)
Call:
svm.default(x = x, y = y)
Parameters:
SVM-Type: C-classification
SVM-Kernel: radial
cost: 1
Number of Support Vectors: 40
結果の確認
テストデータを対象に、モデルによって予測した結果と正解データを比較すると、ほとんどのデータで品種を正しく予測していることが確認できます。
svm.pred <- predict(model, testset[, -5])
table(pred = svm.pred, true = testset[, 5] ) true
pred setosa versicolor virginica
setosa 20 0 0
versicolor 0 10 2
virginica 0 2 16
パラメータのチューニング
最後に、パラメータのチューニングに利用するtune関数を紹介します。先ほど作成したmodelでチューニング可能なパラメータは”cost”(サポートベクトルマシン”C-classification”のパラメータ)と”gamma”(カーネル関数”radial”のパラメータ)の2つです。
以下のコードでは、rangesで指定したパラメータの組み合わせを対象にモデルのチューニングを行います。
svm.tune <- tune(svm, Species~., data = iris,
ranges = list(gamma = 2^(-6:2), cost = 2^(2:10)),
tunecontrol = tune.control(sampling = "fix")
)summary関数を利用することで、最も良いパフォーマンスとなったパラメータの組み合わせや、パラメータの各組み合わせのパフォーマンスを確認することができます。
summary(svm.tune)
Parameter tuning of 'svm':
- sampling method: fixed training/validation set
- best parameters:
gamma cost
1 4
- best performance: 0.02
- Detailed performance results:
gamma cost error dispersion
1 0.015625 4 0.04 NA
2 0.031250 4 0.06 NA
3 0.062500 4 0.06 NA
4 0.125000 4 0.04 NA
5 0.250000 4 0.06 NA
6 0.500000 4 0.04 NA
7 1.000000 4 0.02 NA
8 2.000000 4 0.06 NA
9 4.000000 4 0.08 NA
10 0.015625 8 0.06 NA
11 0.031250 8 0.06 NA
12 0.062500 8 0.06 NA
13 0.125000 8 0.06 NA
14 0.250000 8 0.06 NA
15 0.500000 8 0.04 NA
16 1.000000 8 0.02 NA
17 2.000000 8 0.06 NA
18 4.000000 8 0.08 NA
19 0.015625 16 0.06 NA
20 0.031250 16 0.04 NA
21 0.062500 16 0.06 NA
22 0.125000 16 0.04 NA
23 0.250000 16 0.04 NA
24 0.500000 16 0.06 NA
25 1.000000 16 0.04 NA
26 2.000000 16 0.06 NA
27 4.000000 16 0.08 NA
28 0.015625 32 0.06 NA
29 0.031250 32 0.06 NA
30 0.062500 32 0.04 NA
31 0.125000 32 0.04 NA
32 0.250000 32 0.06 NA
33 0.500000 32 0.04 NA
34 1.000000 32 0.04 NA
35 2.000000 32 0.06 NA
36 4.000000 32 0.08 NA
37 0.015625 64 0.06 NA
38 0.031250 64 0.04 NA
39 0.062500 64 0.04 NA
40 0.125000 64 0.04 NA
41 0.250000 64 0.06 NA
42 0.500000 64 0.04 NA
43 1.000000 64 0.04 NA
44 2.000000 64 0.06 NA
45 4.000000 64 0.08 NA
46 0.015625 128 0.04 NA
47 0.031250 128 0.04 NA
48 0.062500 128 0.04 NA
49 0.125000 128 0.06 NA
50 0.250000 128 0.06 NA
51 0.500000 128 0.04 NA
52 1.000000 128 0.04 NA
53 2.000000 128 0.06 NA
54 4.000000 128 0.08 NA
55 0.015625 256 0.04 NA
56 0.031250 256 0.04 NA
57 0.062500 256 0.04 NA
58 0.125000 256 0.06 NA
59 0.250000 256 0.06 NA
60 0.500000 256 0.04 NA
61 1.000000 256 0.04 NA
62 2.000000 256 0.06 NA
63 4.000000 256 0.08 NA
64 0.015625 512 0.02 NA
65 0.031250 512 0.04 NA
66 0.062500 512 0.04 NA
67 0.125000 512 0.06 NA
68 0.250000 512 0.06 NA
69 0.500000 512 0.04 NA
70 1.000000 512 0.04 NA
71 2.000000 512 0.06 NA
72 4.000000 512 0.08 NA
73 0.015625 1024 0.04 NA
74 0.031250 1024 0.04 NA
75 0.062500 1024 0.04 NA
76 0.125000 1024 0.06 NA
77 0.250000 1024 0.06 NA
78 0.500000 1024 0.04 NA
79 1.000000 1024 0.04 NA
80 2.000000 1024 0.06 NA
81 4.000000 1024 0.08 NA