【问题标题】:Pipeline with PolynomialFeatures and LinearRegression - unexpected result具有多项式特征和线性回归的管道 - 意外结果
【发布时间】:2017-12-19 06:38:18
【问题描述】:

使用以下代码,我只想拟合一条回归曲线来拟合未按预期工作的样本数据。

X = 10*np.random.rand(100)
y= 2*X**2+3*X-5+3*np.random.rand(100)
xfit=np.linspace(0,10,100)


poly_model=make_pipeline(PolynomialFeatures(2),LinearRegression())
poly_model.fit(X[:,np.newaxis],y)


y_pred=poly_model.predict(X[:,np.newaxis])


plt.scatter(X,y)
plt.plot(X[:,np.newaxis],y_pred,color="red")

plt.show()

难道不应该有一条完全适合数据点的曲线吗?因为训练数据(X[:,np.newaxis])和用来预测y_pred的数据是一样的(也是(X[:,np.newaxis])。

如果我改为使用 xfit 数据来预测模型,则结果符合预期...

...

y_pred=poly_model.predict(xfit[:,np.newaxis])

plt.scatter(X,y)
plt.plot(xfit[:,np.newaxis],y_pred,color="red")

plt.show()

那么这种行为的问题和解释是什么?

【问题讨论】:

    标签: python scikit-learn linear-regression pipeline


    【解决方案1】:

    这两个地块的区别在于行内

    plt.plot(X[:,np.newaxis],y_pred,color="red")
    

    X[:,np.newaxis] 中的值没有排序,而在

    plt.plot(xfit[:,np.newaxis],y_pred,color="red")
    

    xfit[:,np.newaxis] 的值已排序。

    现在,plt.plot 将数组中的任意两个连续值逐行连接起来,由于它们未排序,因此您在第一个图中会看到这串行。

    替换

    plt.plot(X[:,np.newaxis],y_pred,color="red")
    

    plt.scatter(X[:,np.newaxis],y_pred,color="red")
    

    你会得到这个漂亮的人物:

    【讨论】:

      【解决方案2】:

      根据 Miriam Farber 的回答,我想出了另一种方法。由于 X 值未排序,我可以通过简单地对值进行排序来解决问题:

      X=np.sort(X)
      

      现在剩余的代码可以保持静止,并将提供所需的结果。

      【讨论】:

        猜你喜欢
        • 2019-11-26
        • 2018-01-02
        • 2021-05-14
        • 2020-05-19
        • 2020-01-14
        • 2020-03-09
        • 2016-06-22
        • 2019-07-18
        • 2017-10-24
        相关资源
        最近更新 更多