在 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
,而不是独立函数scale
。 Scaler
可以插入 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 中拟合分类器之前进行特征缩放的必要性
如何在 scikit-learn 的 SVM 中使用非整数字符串标签? Python