使用svm的一个常见错误

来源:互联网 发布:lr软件最新版本 编辑:程序博客网 时间:2024/04/28 08:38
几天前,我在微博上面问了一个问题“一个两类分类问题,5400个训练样本,600个测试样本(测试、训练样本不交叠),特征10000维,用RBF核的SVM训练,得到的模型在测试集上测试误差为50%(和随机猜想一样)。而如果改用线性核,则准确率可以达到80%。这正常吗?”

包括余凯、老师木、山世光在内的很多大牛都热情回答,在此一并感谢,就不一一点名啦。

大家的讨论,从RBF核的特点、特征空间分布、高维几何反直觉一直到人脑的处理方式,让人眼花缭乱,同时也受益匪浅。

最终证明,这其实是我在使用RBF Gamma参数时设置不当造成的过训练。我的修改和结果如下:我将每一个样本的特征向量都做了L2归一化(此时,gamma的取值在1附近,对性能影响不大),RBF特征可以得到86%的准确率。未作归一化的线性核结果可以达到84%(相对发微博时的版本,特征上面有所调整,所以线性核性能有所提高,此外,L2会造成不同样本同一特征的相对值改变,所以线性版本未用L2归一化)。

这里面大家需要注意的就是gamma的物理意义,大家提到很多的RBF的幅宽,它会影响每个支持向量对应的高斯的作用范围,从而影响泛化性能。我的理解:如果设的太大,则会造成只会作用于支持向量样本附近,对于未知样本分类效果很差,存在训练准确率可以很高,而测试准确率不高的可能,就是通常说的过训练;而如果设的过小,则会造成平滑效应太大,无法在训练集上得到特别高的准确率,也会影响测试集的准确率。
此外大家注意RBF公式里面的sigma和gamma的关系如下:
The rbf kernel is typically defined as k(x,z) = exp(-(d(x,z)^2)/(2*sigma^2)), which can be re-defined in terms of gamma as k(x,z) = exp(-gamma*(d(x,z)^2)), where gamma = 1/(2*sigma^2). 

此外,可以明确的两个结论是:
结论1:样本数目少于特征维度并不一定会导致过拟合,这可以参考余凯老师的这句评论:
这不是原因啊,呵呵。用RBF kernel, 系统的dimension实际上不超过样本数,与特征维数没有一个trivial的关系。

结论2:RBF核应该可以得到与线性核相近的效果(按照理论,RBF核可以模拟线性核),可能好于线性核,也可能差于,但是,不应该相差太多。
当然,很多问题中,比如维度过高,或者样本海量的情况下,大家更倾向于用线性核,因为效果相当,但是在速度和模型大小方面,线性核会有更好的表现。

老师木还有一句评论,可以加深初学者对SVM的理解:
须知rbf实际是记忆了若干样例,在sv中各维权重重要性等同。线性核学出的权重是feature weighting作用或特征选择 。

转载:http://blog.sina.com.cn/s/blog_6ae183910101cxbv.html
原创粉丝点击