Я пытаюсь создать функцию, которая находит наилучшую степень n для моей модели полиномиальной регрессии, используя среднеквадратичную ошибку, поэтому мне не нужно снова и снова пытаться подогнать модель вручную, а затем построить график результата, но я получил ' x и y должны иметь одно и то же первое измерение, но иметь формы (10, 1) и (1,) », ошибка при попытке создания графика.

Вот мой код:

from sklearn.preprocessing import PolynomialFeatures
from sklearn.metrics import mean_squared_error
from sklearn.linear_model import LinearRegression
from math import sqrt
def poly_fit(n):
  s=[]
  for i in range(2,n):
    poly_reg = PolynomialFeatures(degree=i)
    x_poly = poly_reg.fit_transform(x)
    linreg2 = LinearRegression()
    linreg2.fit(x_poly,y)
    s.append(sqrt(mean_squared_error(y, linreg2.predict(x_poly))))
  return min(s)

plt.scatter(x, y, color='red')
plt.plot(x, poly_fit(6), color='blue')
plt.title('Polynomial Regression results')
plt.xlabel('Position/level')
plt.ylabel('Salary')
plt.show()
0
i'mgnome 23 Окт 2020 в 21:31

1 ответ

Лучший ответ

Если ваш x - одномерный вектор-столбец, np.polyfit() и np.polyval() выполнят свою работу. np.polyfit(x,y,order,full=True) возвращает остаток (я полагаю, сумму квадратов остатков), чтобы вы могли проверить оптимальный порядок. Чтобы получить остаток, вам не нужна вторая регрессия.

N.B. НАСКОЛЬКО ваша логика выбора минимального остатка технически осуществима, но не является математически разумной . Это связано с тем, что сумма квадратичных ошибок (SSE) всегда будет уменьшаться с увеличением количества регрессоров, поэтому вы всегда будете получать результат с наибольшим полиномиальным порядком. Вы должны попытаться использовать формулу со штрафом за добавление дополнительных терминов при выборе модели (например, AIC или критерии BIC). Однако эта часть полностью зависит от свободного выбора исследователя и, конечно же, выходит за рамки самого вопроса.

import numpy as np
import matplotlib.pyplot as plt

# get your x and y as np array
x = np.random.uniform(-1,1, 100)
y = x - x**2 + x**3 - x**4 + np.random.normal(0, 0.1, 100)

def poly_fit(n):
  ls_res=[]
  ls_coeff = []
  for i in range(2, n):
    coeff, res, _, _, _ = np.polyfit(x, y, i, full=True)
    ls_res.append(res)
    ls_coeff.append(coeff)

  # argmin should be taken from a penalized loss function
  # add it here
  return ls_coeff[np.argmin(ls_res)]

plt.scatter(x, y, color='red')
coeff = poly_fit(6)
plt.plot(np.sort(x), np.polyval(coeff, np.sort(x)), color='blue')
plt.title('Polynomial Regression results')
plt.xlabel('Position/level')
plt.ylabel('Salary')
plt.show()

polyfit

2
Bill Huang 23 Окт 2020 в 19:27