【问题标题】:I get a linear regression using the SVR by python scikit-learn when the data is not linear当数据不是线性时,我通过 python scikit-learn 使用 SVR 得到线性回归
【发布时间】:2016-09-30 18:05:31
【问题描述】:
train.sort_values(by=['mass'], ascending=True, inplace=True)
x = train['mass']
y = train['pa']

# Fit regression model
svr_rbf = SVR(kernel='rbf', C=1e3, gamma=0.1)
svr_lin = SVR(kernel='linear', C=1e3)
svr_poly = SVR(kernel='poly', C=1e3, degree=2)
x_train = x.reshape(x.shape[0], 1)
x = x_train
y_rbf = svr_rbf.fit(x, y).predict(x)
y_lin = svr_lin.fit(x, y).predict(x)
y_poly = svr_poly.fit(x, y).predict(x)

# look at the results
plt.scatter(x, y, c='k', label='data')
plt.hold('on')
plt.plot(x, y_rbf, c='g', label='RBF model')
plt.plot(x, y_lin, c='r', label='Linear model')
plt.plot(x, y_poly, c='b', label='Polynomial model')
plt.xlabel('data')
plt.ylabel('target')
plt.title('Support Vector Regression')
plt.legend()
plt.show()

代码复制自http://scikit-learn.org/stable/auto_examples/svm/plot_svm_regression.html。 而我改变的只是数据集。不知道怎么回事。

【问题讨论】:

  • 请更好地格式化您问题中的代码。

标签: python machine-learning scikit-learn svm


【解决方案1】:

很可能与您的数据规模有关。您正在使用与示例中相同的惩罚超参数,但您的 y 值要大几个数量级。因此,SVR 算法将倾向于简单而不是准确性,因为与您的 y 值相比,您对错误的惩罚现在很小。您需要增加 C 来表示 1e6 (或标准化您的 y 值)。

如果您在他们的示例代码中使 C 非常小,例如 C=.00001,您会看到这种情况。然后,您将获得与您在代码中获得的相同类型的结果。

(更多关于算法here。)

顺便说一句,机器学习实践的很大一部分是超参数调优。这是一个很好的例子,说明如果提供错误的超参数,即使是好的基础模型也会产生不好的结果。

【讨论】:

  • 非常感谢。当我将 C 更改为 1e6 时,我真的得到了结果。超参数对结果的影响很大。我需要尽快学习超参数调优。再次感谢!
  • 加里,很高兴我能帮上忙。如果您认为答案成功回答了您的问题,请接受答案(通过单击复选标记)
  • 现在检查答案了吗?
猜你喜欢
  • 2018-07-31
  • 2016-05-10
  • 2021-04-01
  • 2016-07-24
  • 2019-05-14
  • 2017-12-25
  • 2015-12-14
  • 2020-04-07
  • 2017-12-31
相关资源
最近更新 更多