【问题标题】:Scaling data in scikit-learn SVM在 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 的扩展过程?

【问题讨论】:

    标签: python svm libsvm scikit-learn


    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 2015-06-22
      • 1970-01-01
      • 2014-10-24
      • 2015-06-26
      • 1970-01-01
      • 1970-01-01
      • 2021-01-15
      • 2018-11-05
      • 2015-04-14
      相关资源
      最近更新 更多