多项式回归线无法显示求助:基于抛物线拟合优化回归模型
多项式回归拟合线不显示及R²值偏低问题解决
一、拟合回归线不显示的原因及修复
- 核心问题在
x_line = arange(min(x), max(x), 1)这行代码:你的x变量是小数(如0.35、0.455),步长设为1时,arange生成的数组是空的(因为x的取值区间远小于1),自然画不出拟合线。 - 修复方案:
- 把步长改成极小值(如0.01);
- 更推荐用
linspace生成均匀采样点,确保覆盖x的全部取值范围。
二、R²值偏低的可能原因及优化方向
- 拟合初始值问题:
curve_fit默认初始参数为1,若与数据最优解差距大,会导致拟合结果偏离。可手动指定初始参数p0,引导算法收敛到更优解。 - 特征未归一化:若x和y的取值范围差异较大,先对x做标准化/归一化,能提升拟合稳定性。
- 模型复杂度不足:可尝试三次多项式,或检查是否遗漏其他关联特征,增强模型解释力。
- 评估方式验证:用
sklearn.metrics.r2_score计算真实值与拟合值的R²,确保评估逻辑正确。
修改后的完整代码
from numpy import linspace from scipy.optimize import curve_fit import matplotlib.pyplot as plt from sklearn.metrics import r2_score # 定义二次多项式模型 def objective(x, a, b, c): return a * x + b * x**2 + c # 加载数据集 data = abalone_df.values # 选择输入输出变量 x, y = data[:, 1], data[:, 4] # 曲线拟合,指定初始参数引导收敛 popt, _ = curve_fit(objective, x, y, p0=[0.5, 0.5, 0.1]) a, b, c = popt print(f"参数值:a={a:.5f}, b={b:.5f}, c={c:.5f}") print(f'y = {a:.5f} * x + {b:.5f} * x^2 + {c:.5f}') # 计算并输出R²值 y_pred = objective(x, a, b, c) print(f"R²值:{r2_score(y, y_pred):.5f}") # 绘制可视化图 plt.scatter(x, y, alpha=0.3, label='原始数据') # 生成100个均匀采样点,确保拟合线完整显示 x_line = linspace(min(x), max(x), 100) y_line = objective(x_line, a, b, c) plt.plot(x_line, y_line, 'r-', label='拟合曲线') plt.xlabel('x') plt.ylabel('y') plt.legend() plt.show()
内容的提问来源于stack exchange,提问作者João Ribeiro
相关产品推荐
相关产品推荐

