【问题标题】:Sklearn SVM: SVR and SVC, getting the same prediction for every inputSklearn SVM:SVR 和 SVC,对每个输入获得相同的预测
【发布时间】:2016-04-01 05:22:37
【问题描述】:

这是代码的粘贴:SVM sample code

我检查了这个问题的其他几个答案......似乎这个问题的特定迭代有点不同。

首先,我的输入是标准化的,每个点有五个输入。这些值的大小都是合理的(健康的 0.5 秒和 0.7 秒等——很少接近零或接近 1 的数字)。

我有大约 70 x 输入对应于它们的 70 y 输入。 y 输入也被归一化(它们是我的函数在每个时间步之后的百分比变化)。

我初始化我的 SVR(和 SVC),训练它们,然后用 30 个样本外输入对其进行测试...并为每个输入获得完全相同的预测(并且输入的变化量合理—— 0.3、0.6、0.5 等)。我认为分类器(至少)会有一些差异化......

这是我得到的代码:

# train svr

my_svr = svm.SVR()
my_svr.fit(x_training,y_trainr)

# train svc

my_svc = svm.SVC()
my_svc.fit(x_training,y_trainc)


# predict regression

p_regression = my_svr.predict(x_test)
p_r_series = pd.Series(index=y_testing.index,data=p_regression)

# predict classification

p_classification = my_svc.predict(x_test)
p_c_series = pd.Series(index=y_testing_classification.index,data=p_classification)

以下是我的输入示例:

x_training = [[  1.52068627e-04   8.66880301e-01   5.08504362e-01   9.48082047e-01
7.01156322e-01],
              [  6.68130520e-01   9.07506250e-01   5.07182647e-01   8.11290634e-01
6.67756208e-01],
              ... x 70 ]

y_trainr = [-0.00723209 -0.01788079  0.00741741 -0.00200805 -0.00737761  0.00202704 ...]

y_trainc = [ 0.  0.  1.  0.  0.  1.  1.  0. ...]

x_test 矩阵 (5x30) 在输入的幅度和方差方面与x_training 矩阵相似...y_testry_testc 也是如此。

目前,所有测试的预测完全相同(回归为 0.00596,分类为 1...)

如何让 SVR 和 SVC 函数吐出相关预测?或者至少根据输入做出不同的预测......

至少,分类器应该能够做出选择。我的意思是,即使我没有为回归提供足够的维度......

【问题讨论】:

  • 您需要提供一个独立的、可运行的示例,其中包含实际演示问题的示例数据。
  • 好的。一秒(或大约 10 分钟 =)
  • @BrenBarn 有一个指向代码粘贴箱的链接。我包括了完整的数据...
  • @bordeo,你能帮我解决这个问题吗? stackoverflow.com/questions/40357805/…

标签: python scikit-learn sklearn-pandas


【解决方案1】:

尝试从默认值增加您的 C。看来你是欠拟合了。

my_svc = svm.SVC(probability=True, C=1000)
my_svc.fit(x_training,y_trainc)

p_classification = my_svc.predict(x_test)

p_classification 然后变成:

array([ 1.,  0.,  1.,  0.,  1.,  1.,  1.,  1.,  1.,  1.,  0.,  0.,  0.,
        1.,  0.,  0.,  0.,  0.,  0.,  1.,  1.,  0.,  1.,  1.,  1.,  1.,
        1.,  1.,  1.,  1.])

对于 SVR 的情况,您还需要减少您的 epsilon。

my_svr = svm.SVR(C=1000, epsilon=0.0001)
my_svr.fit(x_training,y_trainr)

p_regression = my_svr.predict(x_test)

p_regression 然后变成:

array([-0.00430622,  0.00022762,  0.00595002, -0.02037147, -0.0003767 ,
        0.00212401,  0.00018503, -0.00245148, -0.00109994, -0.00728342,
       -0.00603862, -0.00321413, -0.00922082, -0.00129351,  0.00086844,
        0.00380351, -0.0209799 ,  0.00495681,  0.0070937 ,  0.00525708,
       -0.00777854,  0.00346639,  0.0070703 , -0.00082952,  0.00246366,
        0.03007465,  0.01172834,  0.0135077 ,  0.00883518,  0.00399232])

您应该考虑使用交叉验证来调整您的 C 参数,以便它能够在对您最重要的任何指标上表现最佳。您可能需要查看GridSearchCV 来帮助您完成此操作。

【讨论】:

  • 好的...太棒了,谢谢——分类工作正常了。 SVR 仍在运行......但看起来我没有做错任何事,所以这应该让我走上正轨。你认为 scipy 的最小化可以解决问题吗?无论如何,你知道PCA吗?跑步会改善这种情况吗? (我想我需要两倍的训练数据……这可能会让我在时间上倒退太远……)
  • 刚刚为 SVR 案例添加了编辑。 PCA 可能不会帮助你。首先尝试使用GridSearchCV 调整参数,然后您可以决定是否需要更多数据。
  • 实际上,查看更多数据是否有帮助的一个好方法是绘制一条学习曲线,在该曲线中改变数据量并测量训练和 CV 损失。
  • 哦。此外,由于您使用的是内核,您可能还需要调整 gamma。这种效果可能非常显着。
【解决方案2】:

我遇到了同样的问题,但原因完全不同,因此寻找解决方案的地方完全不同。

如果您的预测输入因任何原因未正确缩放,您可能会遇到与此处相同的症状。这可能是因为在以后的预测中忘记(或错误编码)输入值的缩放,或者是由于输入的顺序错误。

【讨论】:

    【解决方案3】:

    在我的例子中,我需要使用 sklearn 包中的 StandardScaler 来缩放我的数据。

    在我的例子中,我还必须独立缩放每组特征,每种距离都单独缩放。

    from sklearn.preprocessing import StandardScaler
    ss = StandardScaler()
    ss.fit(X[:,0:10])
    X[:,0:10] = ss.transform(X[:,0:10])
    ss = StandardScaler()
    ss.fit(X[:,10:20])
    X[:,10:20] = ss.transform(X[:,10:20])
    

    【讨论】:

      猜你喜欢
      • 2021-10-06
      • 1970-01-01
      • 2017-07-23
      • 1970-01-01
      • 2014-04-03
      • 2017-12-03
      • 2017-03-10
      • 2016-01-06
      • 2020-06-01
      相关资源
      最近更新 更多