我正在尝试创建一个函数,该函数使用均方根误差为我的多项式回归模型找到最佳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 :(得分:2)
如果x是一维列向量,则np.polyfit()
和np.polyval()
将完成工作。 np.polyfit(x,y,order,full=True)
返回残差(我相信残差平方和)供您检查最佳顺序。您不需要第二次回归拟合就可以得到残差。
AFAIK您选择最小残差的逻辑在工程上可行,但在数学上不合理。这是因为平方误差之和(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()