サポートベクターマシン解析

Rにてサポートベクターマシン (SVM: support vector machine) によるデータの分類を行う。SVMによるデータの分類とは、持っているデータから未知のデータに対するデータの分類器を作り、今度は、新たに得られた未知のデータをその分類器に供することで、そのデータがどのように分類されるのか、または、どのようなカテゴリーに属するのかを分類する、という操作を意味する。RにてSVM解析を行うためのパッケージは複数存在するが、パッケージ 'e1071' はSVM解析で最も有名なツールのひとつである 'libsvm' を実装しており、様々な拡張が可能である点を考慮すると最良の選択肢のひとつである。

まず、Rを起動させ、以下のコマンドにてパッケージをインストールし、そのパッケージを読み込む。

1|$install.packages("e1071", repos="http://cran.ism.ac.jp/")
2|$library(e1071)

仮想的なデータセットとして、Rにデフォルトでインストールされているデータセット 'iris' を用いる。本データセットには、150標本のアヤメの萼片の長さ (Sepal.Length)、萼片の幅 (Sepal.Width)、花弁の長さ (Petal.Length)、花弁の幅 (Petal.Width) という4種類からなる各標本の特徴量とその特徴量を持つアヤメが属する種 (Species)、すなわち、'setosa'、'versicolor' および 'virginica' という3種類のラベルの情報が格納されている。このirisデータセットから全標本の96%、すなわち144標本 (150*0.96) をトレーニングデータセットとして分類器を作成し、残りの6標本をテストデータセットとして、それらの標本が属する種を予測する

まず、以下の1行目のコマンドで1~150の整数から144個の整数をピックアップする。'nrow(iris)' はirisデータフレームの行数 (150行) を指し、'nrow(iris)*0.96' はその96%の個数 (144個) を意味する。コマンド 'sample' は 'sample(x, n)' のように指定することでx個の整数からランダムにn個の整数を抜き出すためのものである。このように作成した144個の整数が格納されている変数 'samples' を用い、2行目および3行目のコマンドで、それぞれトレーニングデータセット 'train' およびテストデータセット 'test' を作成する。

1|$samples=sort(sample(nrow(iris), nrow(iris)*0.96))
2|$train=iris[samples,]
3|$test=iris[-samples,]

次に、このトレーニングデータセットで分類器を作成するが、その前に、分類器作成のために必要なパラメーターの最適化を行う。パラメーターの最適化は、コマンド 'tune.svm' にて行う。オプションの 'Species ~.' は萼片の長さ等の特徴量を種 (ラベル) に帰属させるということを意味する。'data' には用いるデータフレームの変数名を、'gamma' および 'cost' には適当な範囲からなる値を指定する。この 'gamma' および 'cost' こそが最適化すべきパラメーターであり、'gamma' については '10^(seq(-5, 5, 0.1))' の、'cost' については '10^(seq(-2, 2, 0.1))' の範囲でグリッドサーチし、最適パラメーターを探索することになる。ここで、'10^(seq(-5, 5, 0.1))' は、10-5から105に至るまで、100.1ずつ値を増加させた数列を意味する。最後の 'tunecontrol' に指定してある "cross" および 'cross=10' は10-foldクロスバリデーションにて最適パラメーターを探索するということを示している。ここで、クロスバリデーション (交差検定) とは、データをk分割して、k-1個ををトレーニング、残り1個をテストセットにしてモデルを評価。これを、k回繰り返す手法のことである。

1|$tune=tune.svm(Species ~ ., data=train, gamma=10^(seq(-5, 5, 0.1)), cost=10^(seq(-2, 2, 0.1)), tunecontrol=tune.control(sampling="cross", cross=10))

結果は以下のようになる。

1|$tune
Parameter tuning of ‘svm’:

- sampling method: 10-fold cross validation

- best parameters:
     gamma     cost
 0.1258925 2.511886

- best performance: 0.02809524

以上より、最適gamma値は '0.1258925'、cost値は '2.511886' であることが判ったので、以下のように、これらの値を用いて分類器を作成する。分類器の作成はコマンド 'svm' によって行う。ここでは、オプション 'kernel="radical"' により、カーネルとしてラジアル基底関数カーネル (ガウシアンカーネル) を指定しているが、その他のカーネルは 'linear'、'polynomial' および 'sigmoid' にて指定する。

1|$classifier=svm(Species ~ ., data=train, method="C-classification", kernel="radial", gamma=0.1258925, cost=2.511886)

以上にて作成した分類器 'classifier' を用いて、テストデータセットの分類は以下のように行う。

1|$predict(classifier, test)
        17         52         87         90         98        105
    setosa versicolor versicolor versicolor versicolor  virginica
Levels: setosa versicolor virginica

結果の17や52等の数字はサンプル名であり、その下のsetosa等の種の名前は、作成した分類器によって予測された、これら6つのテストデータセットの分類結果である。すなわち、サンプル17は分類器によると 'setosa' である可能性が高いと判断されたということになる。

1|$predict(classifier, test)
        17         52         87         90         98        105
    setosa versicolor versicolor versicolor versicolor  virginica
Levels: setosa versicolor virginica

ここで、テストデータセットの真の分類は以下のようなものである。

1|$test
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
17           5.4         3.9          1.3         0.4     setosa
52           6.4         3.2          4.5         1.5 versicolor
87           6.7         3.1          4.7         1.5 versicolor
90           5.5         2.5          4.0         1.3 versicolor
98           6.2         2.9          4.3         1.3 versicolor
105          6.5         3.0          5.8         2.2  virginica

以上より、全ての標本名とその分類が完全に一致しており、分類器 'classifier' によって全て正解の分類が導かれたことが分かる。以下のようにテーブルにすると判りやすい。

1|$table(predict(classifier, test), test$Species)
             setosa versicolor virginica
  setosa          1          0         0
  versicolor      0          4         0
  virginica       0          0         1

精度 (accuracy) は以下のように計算する。

1|$sum(diag( table(predict(classifier, test), test$Species)))/sum(table(predict(classifier, test), test$Species))*100

以上の場合では全て正解しているので精度は当然、100%となる。

このエントリーをはてなブックマークに追加

Site search

ページのトップへ戻る