Sklearn SVM:SVR和SVC,每个输入都得到相同的预测

11

这是代码的粘贴:SVM示例代码

我看了一些其他问题的答案...而且似乎这个问题的特定迭代有点不同。

首先,我的输入已经归一化,并且每个点都有五个输入。这些值都是适度大小的(例如健康的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 函数 spit 出相关的预测值?或者至少基于输入得到不同的预测结果...

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


您需要提供一个自包含的、可运行的示例,其中包含实际演示问题的样本数据。 - BrenBarn
好的。稍等一下(或者大约10分钟=) - Chris
@BrenBarn 这里有一个代码的 pastebin 链接。我已经包含了完整的数据... - Chris
@bordeo,你能帮我一下吗?这个问题是关于使用SVR模块进行时间序列预测的。https://dev59.com/3Zzha4cB1Zd3GeqPABxW - Mahsolid
3个回答

9

尝试将默认的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吗?运行它会改善情况吗?(我想我需要两倍的训练数据...而且那可能会把我推回太远的时间...) - Chris
刚刚为SVR案例添加了一个编辑。PCA可能对你没有帮助。首先尝试使用“GridSearchCV”调整参数,然后再决定是否需要更多数据。 - David Maust
实际上,判断更多数据是否有助于提高模型性能的好方法是绘制学习曲线,其中您可以改变数据量并测量训练和交叉验证误差。 - David Maust
1
哦,另外因为你正在使用内核,你可能还想要调整“gamma”。这个效果可能非常明显。 - David Maust

3

我之前也遇到了同样的问题,但是原因完全不同,因此需要在另外一个地方寻找解决方案。

如果你的预测输入由于任何原因被错误地缩放,你可能会遇到与这里相同的症状。这可能是因为在后续的预测中忘记(或误编码)输入值的缩放,或者是由于输入顺序不正确引起的。


0
在我的情况下,我需要使用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])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接