使用sklearn实现多项式回归返回结果与预期不符问题咨询
sklearn多项式回归与Excel结果差异问题
问题描述
使用Python sklearn库进行三次多项式回归计算时,得到的拟合结果与Excel输出的计算结果存在极大差异。
现有实现代码
import numpy as np import matplotlib.pyplot as plt from sklearn.preprocessing import PolynomialFeatures from sklearn.linear_model import LinearRegression def polynomial_regression(x_param, y_param): print(x_param) print(y_param) """create a polynomial regression graph""" # 将输入x转换为numpy数组 x_param = np.array(x_param) # 初始化3次多项式特征生成器,关闭偏置项 poly = PolynomialFeatures(degree=3, include_bias=False) # 对原始x做多项式特征转换 poly_features = poly.fit_transform(x_param.reshape(-1, 1)) # 初始化线性回归模型 poly_reg_model = LinearRegression() # 传入多项式特征和真实y值训练模型 poly_reg_model.fit(poly_features, y_param) # 基于训练好的模型生成预测值 y_predicted = poly_reg_model.predict(poly_features) # 可视化结果 plt.figure(figsize=(10, 6)) plt.title(f"Polynomial regression, coef={poly_reg_model.coef_}", size=16) plt.scatter(x_param, y_param) plt.plot(x_param, y_predicted, c="red") plt.show()
结果对比
- 现有代码运行输出结果:

- 预期Excel计算输出结果:

待确认问题
- 当前代码输出的结果是否为正常情况?
- 如果结果正常,造成其与Excel计算结果差异的原因是什么?
- 如果结果不正常,代码编写存在什么问题?
解答
你的回归模型计算逻辑本身没有问题,输出的杂乱折线属于不正常的可视化结果,和模型拟合精度无关。
差异原因
问题出在绘图环节:调用plt.plot()绘制连线时,matplotlib会严格按照传入数组的元素顺序,依次连接相邻两个坐标点,不会自动按x轴数值大小排序后连线。你传入的x_param是原始乱序的采样数据,因此连线会在不同x值之间来回折返,最终呈现出杂乱的锯齿状红线,完全掩盖了三次多项式的平滑曲线形态。
Excel绘制趋势线时会自动对x轴采样点做升序排列后再连线,因此能输出平滑的拟合曲线。你可以打印sklearn模型输出的系数、截距,和Excel趋势线的公式参数做对比,二者仅会存在浮点计算带来的极小精度误差,不存在本质差异。
修复方案
绘图前先将x值与对应的预测值按x升序排序,再传入绘图函数即可,修复后的绘图段代码如下:
# 提取排序索引,按x值从小到大重排数据 sorted_indices = x_param.argsort() x_plot = x_param[sorted_indices] y_pred_plot = y_predicted[sorted_indices] plt.figure(figsize=(10, 6)) plt.title(f"Polynomial regression, coef={poly_reg_model.coef_}", size=16) plt.scatter(x_param, y_param) # 传入排序后的数据绘制平滑拟合线 plt.plot(x_plot, y_pred_plot, c="red") plt.show()
内容的提问来源于stack exchange,提问作者Adam Demo_Fighter
相关产品推荐
相关产品推荐

