具有 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)
现在,剩下的代码可以保持静止,并将交付所需的结果。
使用以下代码,我只想将回归曲线拟合到未按预期工作的样本数据。
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)
现在,剩下的代码可以保持静止,并将交付所需的结果。