如何获取可用于手动计算的多项式回归模型系数?
问题描述
拥有大量数据点,希望提取多项式回归的系数后手动计算预测值(而非直接调用model.predict),但发现手动计算结果与模型预测结果不匹配,如何获取适合手动计算的系数?
对应的代码如下:
import numpy as np from sklearn.model_selection import train_test_split from sklearn.pipeline import make_pipeline from sklearn.preprocessing import PolynomialFeatures from sklearn.linear_model import LinearRegression x=np.array([[0.25],[0.35],[0.45],[0.55],[0.65],[0.75],[0.85],[0.95]]) y=np.array([[81.2198],[77.882 ],[74.5442],[72.319],[70.6501],[67.8686],[67.3123],[65.6434]]) x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.125, random_state=42) degree = 3 # 创建包含多项式特征转换和线性回归的管道 model = make_pipeline( PolynomialFeatures(degree=degree, include_bias=False), LinearRegression() ) # 拟合训练数据 model.fit(x_train, y_train) # 测试集预测 y_pred = model.predict(x_test) # 计算绝对误差 abs_error_array = np.array(np.abs((y_test - y_pred))) # 获取线性回归系数 linreg_coef = model.named_steps['linearregression'].coef_ print(linreg_coef)
解决方案
问题出在两个关键点:遗漏了截距项,以及未匹配多项式特征的生成顺序,按以下步骤修正即可:
获取完整的模型参数
线性回归模型除了coef_(多项式各项的系数),还有intercept_(截距项)——因为你使用的LinearRegression默认开启fit_intercept=True,会单独计算截距。明确多项式特征的顺序
当PolynomialFeatures(degree=3, include_bias=False)时,生成的特征顺序是:x^1, x^2, x^3,对应linreg_coef中的系数顺序。手动计算的公式
对于输入值x_val,手动计算预测值的公式为:y_manual = intercept + coef1 * x_val + coef2 * x_val**2 + coef3 * x_val**3验证代码示例
加入以下代码验证手动计算与模型预测的一致性:# 获取截距项 linreg_intercept = model.named_steps['linearregression'].intercept_ # 取测试集中的一个样本 x_val = x_test[0][0] # 手动计算预测值 y_manual = linreg_intercept + linreg_coef[0][0]*x_val + linreg_coef[0][1]*x_val**2 + linreg_coef[0][2]*x_val**3 # 模型预测值 y_model = model.predict([[x_val]])[0][0] print(f"手动计算值: {y_manual:.5f}") print(f"模型预测值: {y_model:.5f}")运行后会发现两者结果完全一致。
额外说明
如果你的多项式特征包含偏置项(即include_bias=True),那么LinearRegression会自动关闭截距计算(fit_intercept被设为False),此时coef_的第一个元素就是偏置项,手动计算时直接按coef0 + coef1*x + coef2*x² + coef3*x³即可。
内容的提问来源于stack exchange,提问作者Anton
相关产品推荐
相关产品推荐

