使用多项式特征和线性回归绘制n度的预测线无法正常工作,因为n> 1

问题描述 投票:1回答:2

对于MRE:

m = 100
X = 6*np.random.rand(m,1)-3
y = 0.5*X**2 + X+2 + np.random.randn(m,1)

lin_reg = LinearRegression()
lin_reg.fit(X,y)
y_pred_1 = lin_reg.predict(X)
y_pred_1 = [_[0] for _ in y_pred_1]

在图形上绘制(X,y)可以正常工作。绘制(X,y_pred_1)给了我一条最合适的线。现在,由于上面的y值是使用X乘以2的幂创建的,因此它看起来像抛物线。

因此,最佳拟合线在这种情况下将不是线性的,而是2级的多项式。

我照做:

poly_features = PolynomialFeatures(degree=2, include_bias=False)
X_poly_2 = poly_features.fit_transform(X)

poly_reg_2 = LinearRegression()
poly_reg_2.fit(X_poly_2, y)

y_pred_2 = poly_reg_2.predict(X_poly_2)
y_pred_2 = [_[0] for _ in y_pred_2]

并将其绘制在我的图形上,这给了我类似抛物线的效果,但是包含了太多的线条。这是绘制点,1度的预测线,2度的预测线时得到的结果。

使用绘图]:>

import plotly.graph_objects as go
plot_X = [_[0] for _ in X.tolist()]
plot_y = [_[0] for _ in y.tolist()]

fig = go.Figure()
fig.add_trace(
    go.Scatter(
        x = plot_X,
        y = plot_y,
        mode="markers"
    )
)

fig.add_trace(
    go.Scatter(
        x = plot_X,
        y = y_pred_1,
        name="degree = 1"
    )
)

fig.add_trace(
    go.Scatter(
        x = plot_X,
        y = y_pred_2,
        name="degree = 2"
    )
)

fig.show()

输出enter image description here

我在做什么错?

出于好奇,为什么在我的情况下,sklearn为什么使用线性回归来预测诸如抛物线之类的非线性事物?

如果我也跑poly_reg_2.coef_它给了我array([[0.99366804, 0.45225746]])我将如何解释?

y = 0.99366804x + 0.45225746x是我所想的,但随后它不会画出抛物线,您如何知道将哪个系数提高到2的幂,以及将哪个系数保持在= 1的度?

编辑:当我使用]绘图时>

fig.add_trace(
    go.Scatter(
        x = plot_X,
        y = y_pred_2,
        name="degree = 2",
        mode="markers"
    )
)

添加模式参数并将其设置为创建散点图的标记,它似乎可以正常工作,但在散点图中。

对于MRE:m = 100 X = 6 * np.random.rand(m,1)-3 y = 0.5 * X ** 2 + X + 2 + np.random.randn(m,1)lin_reg =线性回归()lin_reg.fit(X,y)y_pred_1 = lin_reg.predict(X)y_pred_1 = [_ [0] for _ in y_pred_1] ...

python scikit-learn linear-regression
2个回答
1
投票

似乎您在进入LR之前在X_poly_2中有错误。似乎X_poly_2应该更改为

X_poly_2=X_poly_2[:,0].reshape(100,1)

1
投票

我有同样的问题。这是我解决的方法。

© www.soinside.com 2019 - 2024. All rights reserved.