在 scikit-learn SVM 中缩放数据

Posted

技术标签:

【中文标题】在 scikit-learn SVM 中缩放数据【英文标题】:Scaling data in scikit-learn SVM 【发布时间】:2012-10-30 17:12:50 【问题描述】:

虽然 libsvm 提供了用于缩放数据的工具,但使用 Scikit-Learn(它应该基于用于 SVC 分类器的 libSVM)我发现无法缩放我的数据。

基本上我想使用 4 个特性,其中 3 个范围从 0 到 1,最后一个是一个“大”的高度可变的数字。

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

如何以编程方式(即不调用 svm-scale)复制 SVM 的扩展过程?

【问题讨论】:

【参考方案1】:

您在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...]])

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

【讨论】:

很高兴知道,谢谢。我应该将测试数据与训练数据一起标准化,然后再对它们进行切片,还是应该只单独执行测试数据? documentation 中提到了这一点。我想你应该分开做,否则训练数据会受到测试样本的影响。使用Scaler 类,您可以计算训练数据的均值和标准差,然后将相同的转换应用于测试数据。 您应该为此使用Scaler,而不是独立函数scaleScaler 可以插入 Pipeline,例如scaling_svm = Pipeline([("scaler", Scaler()), ("svm", SVC(C=1000))]). Scaler 是否对Pipeline 中的训练和测试数据分别进行标准化?还是先标准化整个数据集,然后再喂给svm【参考方案2】:

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

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

【讨论】:

以上是关于在 scikit-learn SVM 中缩放数据的主要内容,如果未能解决你的问题,请参考以下文章

在 scikit-learn 中拟合分类器之前进行特征缩放的必要性

为啥缩放训练和测试数据后我的 SVM 的性能会下降?

scikit-learn 在管道中使用多个类预处理 SVM

如何在 scikit-learn 的 SVM 中使用非整数字符串标签? Python

使用 scikit-learn 训练数据时,SVM 多类分类停止

如何让 SVM 很好地处理 scikit-learn 中的缺失数据?