具有 PolynomialFeatures 和 LinearRegression 的管道 - 意外结果

Pipeline with PolynomialFeatures and LinearRegression - unexpected result

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

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()

那么问题是什么以及对这种行为的解释是什么?

两幅图的区别在于线

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")

你会得到这个漂亮的身材:

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

X=np.sort(X)

现在,剩下的代码可以保持静止,并将交付所需的结果。