【R的机器学习】模型性能提升探索:支持向量机

来源:互联网 发布:软件试用报告模板 编辑:程序博客网 时间:2024/05/22 09:39

这一章简单理解下大名鼎鼎的支持向量机,SVM;

还是先举个栗子:

有一条路把一片森林分开两块,左边是杨树,右边是松树,那么如果我们找一个分界线的话,当然就是这条路,这个是个很简单的分类方式;

下一个场景:
我们坐直升飞机在山顶飞过,这时候山对我们来说就是个平面,看到下面有两种树:松树和杨树,假设我们往下看的时候,发现杨树都在最外面一圈,而松树都在里面那一圈,我们用什么方法把他们分隔开呢?当然可以说我们画个圆就行,但是如果我们需要用一个平面来分类呢?

其实也好办,按照树木生长的属性,一般松树在山顶,杨树在山脚,如果我们下了直升飞机,侧面去看这个树木分布的话,是可以用一个平面去分割,类似如下图:
这里写图片描述

从平面到高维空间的变化,是通过一种核技巧(kernel)的方式,下面的视频可以更容易让人理解:

https://www.youtube.com/watch?v=3liCbRZPrZA

墙内:

https://v.qq.com/x/page/k05170ntgzc.html

那么理论上,SVM和神经网络都是用一种方式进行数据集的分类,我认为不同的地方主要就是分类的方式:
神经网络可以在同一平面用非线性的方式进行分类,而SVM在同一平面都是线性分类,如果遇到非线性问题,需要借助空间扭曲。

这句话有点绕,其实也很好理解,举个例子,比如之前的那个山脚和山顶的问题,其实如果在山顶看下面的这个平面的话,神经网络可以画一个圈(当然也是不严谨的,暂且认为可以),但是SVM不可以,SVM只能把空间做变换,然后仍然以线性方式划分。

说完了相关原理,下面还是看我们的iris数据集:

还是载入SVM包,然后选定训练集和测试集:

library(kernlab)iris_train<-iris[random_order[1:105],]iris_test<-iris[random_order[106:150],]

然后用SVM方式建模:

m_svm<-ksvm(Species~.,data=iris_train,kernel='rbfdot')

下面观察下ksvm函数,也就是建模函数:

ksvm(x, y = NULL, scaled = TRUE, type = NULL,     kernel ="rbfdot", kpar = "automatic",     C = 1, nu = 0.2, epsilon = 0.1, prob.model = FALSE,     class.weights = NULL, cross = 0, fit = TRUE, cache = 40,     tol = 0.001, shrinking = TRUE, ...,      subset, na.action = na.omit)

x,y就是模型的因变量和自变量,一般是y~x,也是很熟悉的方式了;

scaled是数据的标准化和归一化,保证数据集量度差很大的时候趋于稳定,默认是T,顺便说一句,神经网络的包相比其他的机器学习的包就不是很理想,没有这些功能。

type:这个是SVM分类的类型,有几类:

C-svc C classificationnu-svc nu classificationC-bsvc bound-constraint svm classification

这三类是针对因变量y的类别是离散变量或者因子;而且是二分类,比如0,1分类,T/F分类等等;

spoc-svc Crammer, Singer native multi-classkbb-svc Weston, Watkins native multi-class

这两个是multi-class的分类,也就是有大于2的分类;

eps-svr epsilon regressionnu-svr nu regressioneps-bsvr bound-constraint svm regression

这三个是针对数值型的Y进行回归;

one-svc novelty detection

这个可以理解为离群点检测,或异常值发现;针对这个变量多说一句,根据一个稳定值建模,然后我们在预测的时候会看到结果是True/False,False的就是异常值,或者说分类和其他不太一样的指标。如果是False也就是没办法分干净的数值。

还有一个比较重要的参数是:

rbfdot Radial Basis kernel "Gaussian"polydot Polynomial kernelvanilladot Linear kerneltanhdot Hyperbolic tangent kernellaplacedot Laplacian kernelbesseldot Bessel kernelanovadot ANOVA RBF kernelsplinedot Spline kernelstringdot String kernel

一般常用的就是高斯核估计:Gaussian

常用的参数介绍完了,其实建模反而非常简单:

m_svm<-ksvm(Species~.,data=iris_train,kernel='rbfdot')m_svm_results<-predict(m_svm,iris_test)

还是同样的道理,看下结果:

table(iris_test$Species,m_svm_results)-- m_svm_results             setosa versicolor virginica  setosa         12          0         1  versicolor      0         17         0  virginica       0          2        13

可以看到,SVM这个分类反而不是很好,有三个没有分成功:准确率为93.3%。

同步看下kappa值:

 Kappa(table(predict=m_svm_results1,test=iris_test$Species)) ---               value        ASE        zUnweighted 0.8989521 0.05627881 15.97319Weighted   0.8939929 0.06285632 14.22280

unweighted值为0.899,竟然不敌神经网络,不过这个数据集毕竟比较小,偶然性还是比较大的。

阅读全文
0 0
原创粉丝点击