Использование PolynomialFeatures и LinearRegression для построения линии прогнозирования n-степени не работает должным образом при n> 1 - PullRequest
1 голос
/ 13 февраля 2020

Для 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 градуса.

Используя ploty:

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

, добавив параметр режима и установив его в маркер, который создает график рассеяния, он, кажется, показывает работу хорошо, но на графике рассеяния.

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

У меня была такая же проблема. Это мой способ ее решить.

x_predict = np.linspace(-3, 3, 100)
y_predict = lin_reg.predict(poly_features.transform(x_predict .reshape(-1, 1)))
plt.plot(x_predict , y_predict)
plt.plot(X, y, 'bo')
plt.show()
1 голос
/ 13 февраля 2020

Кажется, у вас есть ошибка в X_poly_2 перед входом в LR. Кажется, X_poly_2 должен быть изменен на

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