Scikit learn LinearSVC()不同于SVC(kernel=';linear';)
当数据偏移(不以零为中心)时,Scikit learn LinearSVC()不同于SVC(kernel=';linear';),scikit-learn,libsvm,Scikit Learn,Libsvm,当数据偏移(不以零为中心)时,LinearSVC()和SVC(kernel='linear')会给出完全不同的结果。(编辑:问题可能是它不处理非规范化数据。) 这是我得到的结果: (left=LinearSVC(),right=SVC(kernel='linear')) sklearn.\uuuuu版本\uuuuu=0.17。但我也在Ubuntu 14.04中进行了测试,它附带了0.15 我曾想过报告这个bug,但它似乎太明显了,不可能是一个bug。我缺少什么?阅读文档,他们使用不同的底层实现
LinearSVC()
和SVC(kernel='linear')
会给出完全不同的结果。(编辑:问题可能是它不处理非规范化数据。)
这是我得到的结果:
(left=LinearSVC(),right=SVC(kernel='linear'))
sklearn.\uuuuu版本\uuuuu
=0.17。但我也在Ubuntu 14.04中进行了测试,它附带了0.15
我曾想过报告这个bug,但它似乎太明显了,不可能是一个bug。我缺少什么?阅读文档,他们使用不同的底层实现
LinearSVC
使用liblinear,而SVC
使用libsvm
仔细观察系数和截距,似乎LinearSVC
将正则化应用于截距,而SVC
没有
通过添加截距和缩放,我能够获得两者相同的结果
LinearSVC(loss='hinge', intercept_scaling=1000)
仔细看,似乎存在变量规模的优化问题。稍后我将扩展我的回答。谢谢。因此,如果我不想规范化我的数据集,而且我没有时间逐一进行,我应该坚持使用
SVC(kernel='linear')
,对吗?SVC
似乎不那么挑剔:-)。对于任何梯度下降优化器,使用特征缩放和平均居中通常都是一个好主意。你为什么要逃避它?它可以通过管道
和标准缩放器
在scikit learn中轻松实现。只有当你试图自己解释系数时,它才会变得烦人。只是我们使用的是来自UCI的数据,我们想将我们的方法与使用线性核的SVC进行比较。但是,我们现在要对数据进行标准化,并且可以考虑使用<代码> SVC 进行最后的运行。code>LinearSVC自然要快得多。
LinearSVC(loss='hinge', intercept_scaling=1000)