SVM:缩放数据集结果更差?
我有一个多分类问题。我的数据集(我们称数据为X
,标签为y
)包含640x480图像上的一些点,所以X
中的所有元素都是有效像素范围内的整数。我想用支持向量机(SVM)来解决这个问题。如果我直接用原始数据集来运行SVM,准确率是74%。但是,如果我把数据缩放到[0..1]
的范围,结果就变得很差,只有69%的正确率。
我仔细检查了X
中元素的直方图和它的缩放版本Xs
,发现它们是完全一样的。所以数据没有损坏,只是进行了归一化。根据我对SVM的理解,我以为缩放不会影响结果,但事实并非如此。那么这是为什么呢?
这是我的代码,以防我在其中犯了错误:
>>> from sklearn.cross_validation import cross_val_score
>>> from sklearn.svm import SVC
>>>
>>> X, y = ...
>>> Xs = X.astype(np.float32) / (X.max() - X.min())
>>> cross_val_score(SVC(kernel='linear'), X, y, cv=10).mean()
0.74531073446327667
>>> cross_val_score(SVC(kernel='linear'), Xs, y, cv=10).mean()
0.69485875706214695
1 个回答
1
缩放(Scaling)肯定会影响结果,但应该是让结果变得更好。不过,支持向量机(SVM)的表现非常依赖于它的C
设置,这个设置是在训练数据中错误分类的代价和模型的简单性之间进行权衡的。这个C
值应该通过一些方法来确定,比如说网格搜索和嵌套交叉验证。默认的设置很少能对任何特定问题达到最佳效果。