在scikit-learn SVM中缩放数据

13

虽然libsvm提供了数据缩放的工具,但是在Scikit-Learn中(它应该基于SVC分类器使用libSVM),我找不到缩放数据的方法。

基本上,我想使用4个特征,其中3个特征的取值范围从0到1,而最后一个特征是一个"大"且高度变化的数字。

如果我在libSVM中包含第四个特征(使用easy.py脚本,它会自动缩放我的数据),我会得到一些非常好的结果(96%的准确率)。 如果我在Scikit-Learn中包含第四个变量,则准确率将下降到约78% - 但是如果我排除它,则会得到与排除该特征时在libSVM中获得的相同结果。因此,我相当确定这是一个缺少缩放的问题。

如何在程序中复制(即不调用svm-scale)SVM的缩放过程?

2个回答

10

您可以在sklearn.preprocessing中找到此功能:

这个功能可以对数据进行标准化或均值移除和方差缩放。
>>> from sklearn import preprocessing
>>> X = [[ 1., -1.,  2.],
...      [ 2.,  0.,  0.],
...      [ 0.,  1., -1.]]
>>> X_scaled = preprocessing.scale(X)

>>> X_scaled                                          
array([[ 0.  ..., -1.22...,  1.33...],
       [ 1.22...,  0.  ..., -0.26...],
       [-1.22...,  1.22..., -1.06...]])

数据将具有零均值和单位方差。

好的,谢谢。我是应该将测试数据与训练数据一起标准化,然后再将它们分开,还是只需对测试数据进行处理? - luke14free
3
这在文档中有提到。我想你应该要单独进行,否则训练数据会受到测试样本的影响。使用Scaler类,你可以计算出训练数据的均值和标准差,然后将相同的转换应用到测试数据。 - Maehler
8
针对此问题,您应该使用 Scaler 而不是独立函数 scale。可以将 Scaler 插入到管道中,例如:scaling_svm = Pipeline([("scaler", Scaler()), ("svm", SVC(C=1000))]) - Fred Foo
1
Pipeline 中,Scaler 是否会将标准化应用于训练和测试数据?或者它是先对整个数据集进行标准化,然后再输入到 svm 中? - Francis

0

您也可以尝试使用StandardScaler进行数据缩放:

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(Xtrain) # where X is your data to be scaled
Xtrain = scaler.transform(Xtrain)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接