Нет, вы не должны преобразовывать ваши y_true
значения. Что делает полиномиальный признак, так это то, что он принимает x_1, x_2, ..., x_p
предикторов и применяет полиномиальное преобразование выбранной степени к каждому из них.
Если у вас есть 2 предиктора x_1 and x_2
и вы применяете полиномиальное преобразование 3-й степени, вы сталкиваетесь с проблемой формы:
y = b_0 + b_1 * x_1 + b_2 * x_1^2 + b_3 * x_1^3 + b_4 * x_2 + b_5 * x_2^2 + b_6 * x_2^3
Вы хотите сделать это когда существует нелинейная связь между предикторами и ответом, и вы хотите использовать линейную модель для подгонки данных. y_true
остается неизменным, используете ли вы полиномиальные признаки или нет (или большинство других регрессионных моделей).
Ваш код почти в порядке, за исключением одной проблемы - вы звоните fit_transform
с тестовыми данными, что вы никогда не захотите делать. Вы уже поместили объект полиномиальных признаков на тренировочные данные, все, что вам нужно сделать, это вызвать метод transform
для преобразования ваших тестовых данных.
test_x_poly = poly.transform(test_x)
Вот пример того, как это выглядит, когда вы используете полиномиальные особенности, когда между предиктором и ответом есть полиномиальная связь.
- получить данные (I будет просто генерировать некоторые)
X = np.random.randint(-100, 100, (100, 1))
y = X ** 2 + np.random.normal(size=(100, 1))
поезд / тестовый сплит
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
соответствует полиномиальным характеристикам данных поезда
poly_features = PolynomialFeatures(degree=2)
X_train_poly = poly_features.fit_transform(X_train) # transform the data as well
соответствует модели линейной регрессии на данных поезда
reg = LinearRegression()
reg.fit(X_train_poly, y_train)
(только для иллюстрации - визуализировать линию регрессии - применимо только при наличии только одного предиктора)
reg_line_x = poly_features.transform(np.linspace(-100, 100, 1000).reshape((-1, 1)))
reg_line_y = reg.predict(reg_line_x)
plt.scatter(X_train_poly[:, 1].ravel(), y_train)
plt.plot(reg_line_x[:, 1].ravel(), reg_line_y, c="red", label="regression line")
plt.legend()
plt.show()
преобразовать данные
X_test
и сделать прогноз
# do NOT call fit_transform here
X_test_poly = poly_features.transform(X_test)
y_pred = reg.predict(X_test_poly)
Существует также более удобный способ сделать это, построив конвейер, который обрабатывает все (то есть полиномиальное преобразование и регрессия в вашем случае), чтобы вам не приходилось вручную выполнять каждый отдельный шаг.
from sklearn.pipeline import Pipeline
pipe = Pipeline([
("poly_features", poly_features),
("regression", reg)
])
y_pred = pipe.predict(X_test)
print(f"r2 : {r2_score(y_test, y_pred)}")
print(f"mse: {mean_squared_error(y_test, y_pred)}")
r2: 0.9999997923643911
mse: 1.4848830127345198
Обратите внимание, что тот факт, что r в квадрате или MSE показывает плохие значения в вашем случае, не означает, что ваш код неверен. Может случиться так, что ваши данные не подходят для этой задачи, или вам нужно использовать различную степень полиномиального преобразования - вы можете либо подгонять, либо подгонять тренировочные данные и т. Д. c.