使用svm的一个常见错误
2013-01-03 10:16
246 查看
http://blog.sina.com.cn/s/blog_6ae183910101cxbv.html
几天前,我在微博上面问了一个问题“一个两类分类问题,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作用或特征选择 。”
几天前,我在微博上面问了一个问题“一个两类分类问题,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作用或特征选择 。”
相关文章推荐
- 使用svm的一个常见错误
- 【svm学习】使用svm的一个常见错误
- struts2标签使用最常见的一个错误
- iOS开发——常见错误——使用MJRefresh返回上一个界面蹦掉的情况
- FragmentTabHost使用过程中常见的一个错误
- 安卓项目中使用JSON引发的一个小错误 Multiple dex files define Lorg/apache/commons/collections/Buffer
- HttpWebRequest的常见错误使用TcpClient可避免
- Android使用Camera时的一个小错误
- 用javah 导出类的头文件, 常见的错误及正确的使用方法
- 错误“操作必须使用一个可更新的查询”原因及解决办法
- 一个常见数据库操作错误的分析(四)
- Struts的FormBean及常见错误和标签的使用
- 一个常见的asp.net错误解决
- iOS 中使用 XIB 自定义cell 的两种方法 以及 编译出现常见 的错误 ++++(xcode6.0之后)
- 用javah导出类的头文件常见的错误及正确的使用方法
- Android NDK开发(三)——常见错误集锦以及LOG使用
- RequireComponent的使用: 当你添加的一个用了RequireComponent组件的脚本,需要的组件将会自动被添加到game object(游戏物体)。这个可以有效的避免组装错误
- linux使用过程中的常见错误
- eclipse使用ssh加密方式上传到github常见错误
- FindBugs 使用 及 常见错误解决方法