sklearn中SVR的多项式拟合极差

机器算法验证 回归 非线性回归 scikit-学习 岭回归
2022-03-26 16:34:51

我尝试拟合一个明显的 5 次多项式函数。令我绝望sklearn的是,直接拒绝匹配多项式,而是输出一个类似 0 度的函数。

这是代码。您只需要知道这sp_tr是一个m特征n矩阵n,我将第一列 ( i_x) 作为输入数据,将第二列 ( )i_y作为输出数据。

    x_min = sp_tr[:,i_x].min()
    x_max = sp_tr[:,i_x].max()
    xs = numpy.arange( x_min, x_max, (x_max - x_min)/100 )

    sp_clf = SVR( degree=5 )
    sp_clf.fit( sp_tr[:,[i_x]], sp_tr[:,i_y] )
    ys = sp_clf.predict( numpy.transpose([xs]) )

然后我将 xs、ys 绘制为红线,并将从蓝点 ( sp_tr[:,i_x]to sp_tr[:,i_y]) 中学到的数据绘制出来。这是我得到的结果,首先是核脊方法,其次是 SVR。

带核脊的多项式拟合 使用 SVR 进行多项式拟合

发生了什么 ?SVR 和 Kernel Ridge 怎么会如此错误地相信这种关系是恒定的?可以做些什么来获得更令人满意的东西?谢谢你的帮助。

2个回答

简而言之,您需要调整参数。这是sklearn 文档

模型中的自由参数是 C 和 epsilon。

及其描述:

C:浮动,可选(默认=1.0)

误差项的惩罚参数 C。

epsilon:浮动,可选(默认=0.1)

epsilon-SVR 模型中的 Epsilon。它指定了 epsilon-tube,在该 epsilon-tube 中,训练损失函数中没有与预测点在距离实际值 epsilon 内的点相关联。

看起来你有一个惩罚不足的模型,它没有因为偏离数据而受到严厉的惩罚。让我们检查。

我生成了一些与您的规模大致相同的多项式数据:

xs = np.linspace(0, 1, 100)
ys = 400*(xs - 2*xs*xs + xs*xs*xs) - 20
scatter(xs, ys, alpha=.25)

立方SVR

然后用默认参数拟合 SVR:

clf = SVR(degree=3)
clf.fit(np.transpose([xs]), ys)
yf = clf.predict(numpy.transpose([xs]))

这给了我与您基本相同的问题:

欠罚SVR

使用参数对拟合的惩罚不足的直觉,我调整了它们:

clf = SVR(degree=3, C=100, epsilon=.01)

这让我非常适合:

GoodFitSVM

一般来说,只要你的模型有这样的自由参数,仔细调整它们是非常重要的。 sklearn为了尽可能方便,它提供了grid_search模块,该模块将使用不同的调整参数并行尝试许多模型,并选择最适合您的数据的模型。同样重要的是正确测量最适合您的数据的测量,因为使用训练数据测量的模型拟合并不能很好地表示模型拟合看不见的数据。使用交叉验证或保留数据样本来检查模型的拟合程度。在你的情况下,我建议使用交叉验证GridSearchCV

对于多项式内核,指定 kernel='poly' 并尝试重新调整数据,以及调整参数 C 和 epsilon,如 Matthew 所述。

>>> 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...]])

“然后数据将具有零均值和单位方差”。

逐字复制自:https ://stackoverflow.com/questions/13324071/scaling-data-in-scikit-learn-svm