You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

线性与非线性回归问题咨询:多项式拟合异常及R平方计算

解决多项式回归拟合异常与R平方值计算问题

看起来你在做可再生能源发电量的年度趋势多项式回归分析时遇到了两个问题,我来帮你一步步拆解解决:


一、多项式回归拟合异常的原因与修复

你的红线拟合效果异常,最核心的问题是年份数值过大导致的数值不稳定。比如1965这样的大整数,当生成二次多项式特征时(比如$x2$),数值会达到$19652=3,861,225$,这种量级差异会让模型训练时的权重计算出现偏差,最终拟合出不符合预期的曲线。

修复步骤:

  1. 对年份数据做中心化处理:把年份减去一个基准值(比如你的起始年份1965),让x的取值范围缩小到0、1、2...这样的小数值,避免高次项数值爆炸。
  2. 优化循环逻辑:你的代码里每次循环都重复执行数据集导入、模型初始化等冗余操作,我帮你整理了更简洁的逻辑。

修改后的关键代码片段:

# 对年份做中心化处理,将原始年份转为相对于起始年的偏移量
x = (df.index.values - df.index.min()).reshape(-1,1)  # 比如1965→0,1966→1...
y = df.iloc[:, int(n)].values.reshape(-1,1)

# 线性回归拟合
lin = LinearRegression()
lin.fit(x, y)

# 循环拟合不同degree的多项式模型
for poly_degree in range(1,3):
    poly = PolynomialFeatures(degree=poly_degree, include_bias=False)  # 关闭默认偏置项,避免冗余
    x_poly = poly.fit_transform(x)
    lin2 = LinearRegression()
    lin2.fit(x_poly, y)

    # 绘图:用原始年份做x轴显示,拟合值用中心化后的x计算
    plt.scatter(df.index, y, color='blue')
    plt.plot(df.index, lin2.predict(x_poly), color='red')
    plt.title(f'Polynomial Regression degree {poly_degree}')
    plt.xlabel('Year')
    plt.ylabel('Renewable Generation (TWh)')
    plt.show()

    # 预测2019、2020年数据时,记得先对年份做中心化转换
    year_2019 = [[2019 - df.index.min()]]
    year_2020 = [[2020 - df.index.min()]]
    print(f'2019预测值: {lin2.predict(poly.fit_transform(year_2019))}')
    print(f'2020预测值: {lin2.predict(poly.fit_transform(year_2020))}')

另外,你原来的循环里degree=1其实就是线性回归,这样整理后能更清晰对比不同degree的拟合效果。


二、计算回归模型的R平方值

在scikit-learn里,有两种简单实用的方式计算R²:

方法1:用模型自带的score()方法

对于训练好的回归模型,直接调用score()方法,传入特征和标签即可得到R²:

# 线性回归的R²
lin_r2 = lin.score(x, y)
print(f'Linear Regression R²: {lin_r2:.4f}')

# 多项式回归的R²(以degree=2为例)
poly_r2 = lin2.score(x_poly, y)
print(f'Polynomial Regression (degree=2) R²: {poly_r2:.4f}')

方法2:用sklearn.metrics.r2_score函数

如果需要更灵活地对比预测值与真实值,可以用这个函数:

from sklearn.metrics import r2_score

# 线性回归预测值与R²
y_pred_lin = lin.predict(x)
lin_r2 = r2_score(y, y_pred_lin)

# 多项式回归预测值与R²
y_pred_poly = lin2.predict(x_poly)
poly_r2 = r2_score(y, y_pred_poly)

print(f'Linear Regression R²: {lin_r2:.4f}')
print(f'Polynomial Regression R²: {poly_r2:.4f}')

R²的取值范围是[0,1],越接近1说明模型对数据的拟合效果越好。


额外优化建议

  • 你的数据里前7年的y值都是0,若这部分是真实数据而非缺失值,可以考虑从有非零值的年份开始拟合,避免初始零值干扰模型趋势判断。
  • 可以把不同degree的拟合曲线画在同一张图里,更直观地对比不同模型的拟合效果。

内容的提问来源于stack exchange,提问作者Tayzer Damasceno

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 15:52:52