【Rによるデータサイエンス】サポートベクターマシン(SVM)

【定義】
サポートベクターマシンとは。。。

サポートベクターマシンSVMSupport Vector Machine)は、分類と回帰問題を主としたデータ解析方法である。

SVMは、高次元の分類問題が得意。また、SVMは線形分離が可能な高次元の仮想空間で、線形的なアプローチで学習を行うシステムである。

1つだけ重要な点を述べるとするなら、説明変数の次元を高次元へ拡張(説明変数から高次元空間に属する新たな変数を作る)し、新しい高次元空間での線形判別問題に帰着させることであろうか。

参考になりそうな資料を探したが、適当なものが見つからない。
下記資料には、次元の拡張をイメージしやすいスライドがある。

東京大学の中川研究室の資料に、理論的な説明がある。
いずれにせよ、理論的な説明の詳細を「Rによるデータサイエンス」のみで理解することは厳しいので、また別の機会に勉強することとして今回は一旦飛ばす。

ケーススタディ
1.判別分析のケーススタディ
パッケージkernlabに含まれているspamメールのデータを使用して、判別分析の練習を行う。

> data(spam)
> dim(spam)
[1] 4601   58
> colnames(spam)
 [1] "make"              "address"           "all"              
 [4] "num3d"             "our"               "over"    
・・・・・・・・・・・・・・・・・・・・
[55] "capitalAve"        "capitalLong"       "capitalTotal"     
[58] "type"             

4601通のメールを58項目に分けているデータであることが分かる。
ここで58列目のtype属性のデータを確認してみる。

> summary(spam$type)
nonspam    spam 
   2788    1813 

2788通の非スパムメールと1813通のスパムメールが保存されていることが分かる。

次に、データのサンプリングを行い、学習データとテストデータを用意する。

> set.seed(500)
> tr.num<-sample(4601,2500)
> spam.train<-spam[tr.num,]
> spam.test<-spam[-tr.num,]

学習用データspam.trainを用いてksvmを実行する。
引数typeで分類と回帰のタイプを指定するが、今回は目的変数が質的データなのでC-svc分類法を使用する。
また、引数crossに3を指定し、n重交差確認法の値を3にしている。

> set.seed(500)
> (spam.svm<-ksvm(type~.,data=spam.train,cross=3))
Using automatic sigma estimation (sigest) for RBF or laplace kernel 
Support Vector Machine object of class "ksvm" 

SV type: C-svc  (classification) 
 parameter : cost C = 1 

Gaussian Radial Basis kernel function. 
 Hyperparameter : sigma =  0.0302192067639099 

Number of Support Vectors : 884 

Objective Function Value : -488.6327 
Training error : 0.04 
Cross validation error : 0.082796 

今度は、学習結果(spam.svm)にテストデータをあてはめる。

> spam.pre<-predict(spam.svm,spam.test[,-58])
> (spam.tab<-table(spam.test[,58],spam.pre))
         spam.pre
          nonspam spam
  nonspam    1229   56
  spam         89  727
> 1-sum(diag(spam.tab))/sum(spam.tab)
[1] 0.06901475

2.回帰分析のケーススタディ
【Rによるデータサイエンス】非線形回帰分析 〜 多項式回帰」で使用した多項式曲線の人工データを使用する。

> x1<-seq(-10,10,0.1);set.seed(10)
> y1<-50*sin(x1)+x1^2+10*rnorm(length(x1),0,1)

学習を行う。

> xy.svm<-ksvm(x1,y1,epsilon=0.01,kpar=list(sigma=16))
> plot(x1,y1,type="l")

学習結果に基づいた予測を行う。

> sy.pre<-predict(xy.svm,x1)
> lines(x1,sy.pre,col="red",lty=2)

以上。
相変わらず内容の薄い内容だが、詳細はまた別途勉強することとする。