Как корректно сделать полиномиальную регрессию в 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, но из-за преобразования данных эта задача усложнилась.


Ответы (0 шт):