尝试为模型找到最佳多项式回归度时出现错误

时间:2020-10-23 18:31:15

标签: python matplotlib machine-learning scikit-learn

我正在尝试创建一个函数,该函数使用均方根误差为我的多项式回归模型找到最佳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()

1 个答案:

答案 0 :(得分:2)

如果x是一维列向量,则np.polyfit()np.polyval()将完成工作。 np.polyfit(x,y,order,full=True)返回残差(我相信残差平方和)供您检查最佳顺序。您不需要第二次回归拟合就可以得到残差。

AFAIK您选择最小残差的逻辑在工程上可行,但在数学上不合理。这是因为平方误差之和(SSE)始终会随着回归数的增加而减小,因此您总是会从最大多项式得到结果。您必须尝试使用​​带有惩罚性的公式来选择模型时添加更多的项(例如AICBIC标准)。但是,这部分完全由研究人员自由选择,当然超出了问题本身的范围。

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