Как корректно сделать полиномиальную регрессию в sklearn?
Мне нужно сделать определенный прогноз (количество mentor при увеличении количества mentee).
Для этого я использую полиномиальную регрессию из scikit-learn.
Данные не соответствуют нормальному распределению. Для модели большее значение имеют более поздние значения (поэтому важно, чтобы модель не давала большие ошибки при больших значениях).
График с показателями.
В данных есть выбросы (выбросы оставляю, так как это более поздние показатели).

Это моя первая попытка построить модель провалилась. Все модели выглядят переобученными. При этом я не понимаю, что пошло не так.
x = df_for_pred['mentee_cnt'].to_numpy().reshape(-1, 1)
y = df_for_pred['mentor_cnt'].to_numpy()
# Разбивка на тренировочную и тестовую выборки
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42)
degrees = [1, 2, 3, 4, 5]
plt.figure(figsize=(20, 5))
for i in range(len(degrees)):
ax = plt.subplot(1, len(degrees), i+1)
polynomial_features = PolynomialFeatures(degree=degrees[i])
linear_regression = LinearRegression()
pipeline = Pipeline(
[
("polynomial_features", polynomial_features),
("linear_regression", linear_regression)
]
)
pipeline.fit(x_train, y_train)
scores = cross_val_score(
pipeline, x_train, y_train, scoring="neg_root_mean_squared_error", cv=10
)
plt.plot(x_test, pipeline.predict(x_test), label="Model", color="r")
plt.scatter(x_test, y_test, label="Test values")
plt.xlabel("mentee")
plt.ylabel("mentor")
plt.legend(loc="best")
plt.title(
"Degree{}\nRMSE = {:.3f}(+/- {:.3f})".format(
degrees[i], -scores.mean(), scores.std()
)
)
plt.show()
Это вторая попытка. Судя по всему, одну из этих моделей можно использовать.
x = df_for_pred['mentee_cnt'].to_numpy().reshape(-1, 1)
y = df_for_pred['mentor_cnt'].to_numpy()
# Разбивка на тренировочную и тестовую выборки
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42)
degrees = [2, 3, 4, 5]
plt.figure(figsize=(20, 5))
for i in range(len(degrees)):
ax = plt.subplot(1, len(degrees), i+1)
polynomial_features = PolynomialFeatures(degree=degrees[i])
linear_regression = LinearRegression()
# преобразование x_train
x_degree = polynomial_features.fit_transform(x_train)
# обучение модели
linear_regression = linear_regression.fit(x_degree, y_train)
# изменение x_test
x_fit = np.arange(x_test.min(), x_test.max(), 1)[:, np.newaxis]
y_pred = linear_regression.predict(polynomial_features.fit_transform(x_fit))
x_test_degree = polynomial_features.fit_transform(x_train)
# r2 = r2_score()
# rmse = mean_squared_error(, squared=False)
# mse = mean_squared_error()
plt.scatter(x_test, y_test, label="Values")
plt.plot(x_fit, y_pred, label='model', color='r')
plt.title(f"Model degree ={i+1}")
plt.xlabel("mentee")
plt.ylabel("mentor")
plt.xticks()
plt.yticks()
plt.legend(loc="best")
plt.grid(False)
plt.show()
Что пошло не так в первом случае? Как рассчитать R2, RMSE, MSE во втором случае? По идее нужно рассчитать эти показатели для y_test и y_pred, но из-за преобразования данных эта задача усложнилась.

