実装関連事項

各種プログラミング言語の基本的な書き方やソフトウェア等の使用方法について.

R にてサポートベクターマシン (SVM: support vector machine) によるデータの分類を行う.SVM によるデータの分類とは,持っているデータから未知のデータに対するデータの分類器を作り,今度は,新たに得られた未知のデータをその分類器に供することで,そのデータがどのように分類されるのか,または,どのようなカテゴリーに属するのかを分類する操作を意味する.R にて SVM 解析を行うためのパッケージは複数存在するが,パッケージ e1071 は SVM 解析で最も有名なツールのひとつである LIBSVM を実装しており,様々な拡張が可能である.最初に,R を起動させ,以下のコマンドにてパッケージをインストールし,そのパッケージを読み込む.

$ install.packages("e1071", repos="http://cran.ism.ac.jp/")
$ 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~150の整数から144個の整数をランダムに抽出し,それを用いてトレーニングデータセット train とテストデータセット test を作る.

$ samples=sort(sample(nrow(iris), nrow(iris)*0.96))
$ train=iris[samples,]
$ 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回繰り返す手法のことである.

$ 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))

これを以下のように実行する.

$ 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="radial" により,カーネルとしてラジアル基底関数カーネル (ガウシアンカーネル) を指定しているが,その他のカーネルは linear,polynomial および sigmoid にて指定する.

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

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

$ predict(classifier, test)

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

        17         52         87         90         98        105
    setosa versicolor versicolor versicolor versicolor  virginica
Levels: setosa versicolor virginica

ここで,テストデータセットの真の分類は以下のである.

    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 によって全て正解の分類が導かれたことが分かる.以下のコマンドでテーブルにできる.

$ 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))
Hatena Google+