【Rによるデータサイエンス】サポートベクターマシン(SVM)
【定義】
サポートベクターマシンとは。。。
サポートベクターマシン(SVM:Support 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)
以上。
相変わらず内容の薄い内容だが、詳細はまた別途勉強することとする。