在scikit中学习数据 - 学习SVM

luk*_*ree 11 python svm libsvm scikit-learn

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

基本上我想使用4个功能,其中3个范围从0到1,最后一个是"大"高度可变数字.

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

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

Mae*_*ler 8

您具有以下功能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...]])
Run Code Online (Sandbox Code Playgroud)

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

  • 你应该使用`Scaler`,而不是独立的函数`scale`.可以将`Scaler`插入`Pipeline`,例如`scaling_svm = Pipeline([("scaler",Scaler()),("svm",SVC(C = 1000))])`. (8认同)
  • 这在[文档]中提到(http://scikit-learn.org/stable/modules/preprocessing.html#standardization-or-mean-removal-and-variance-scaling).我猜你应该单独做,否则训练数据会受到测试样本的影响.使用"Scaler"类,您可以计算训练数据的平均值和标准差,然后将相同的变换应用于测试数据. (3认同)