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

线性回归函数计算RMSE结果异常(约170),求问题排查帮助

问题排查与修复
  • 截距项未生效:你给dataset添加了'intercept'字段,但根本没把它合并到特征矩阵x中。糖尿病数据集的特征是标准化后的,没有常数项,缺少截距会导致拟合结果偏移,是RMSE偏高的核心原因之一。
    修复:把截距列添加到x中,比如用x = np.hstack([dataset.data, np.ones((dataset.data.shape[0], 1))])。

  • 预测计算维度错误+语法错误:y_pred = w@(np.transpose(x_test)有两个问题:一是括号未闭合,二是矩阵乘法维度不匹配。x_test的形状是(测试样本数, 特征数),w是(特征数,),正确的预测计算应该是x_test @ w,转置后相乘会得到错误维度的结果,导致MSE计算异常。

  • 手动覆盖RMSE结果:代码最后一行rmse = None直接把计算好的RMSE值覆盖成None,这会导致函数返回空值,如果你实际运行得到了170的RMSE,应该是测试时去掉了这行,但原代码存在这个bug。

  • 数值稳定性问题:直接用np.linalg.inv计算矩阵逆可能存在数值不稳定的情况,尤其是当特征矩阵存在共线性时。更稳妥的方式是用np.linalg.lstsq或者np.linalg.solve来求解最小二乘问题。


修正后的代码

import numpy as np
from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import argparse

def main(args: argparse.Namespace) -> float:
    dataset = load_diabetes()
    # 添加截距项到特征矩阵
    x = np.hstack([dataset.data, np.ones((dataset.data.shape[0], 1))])
    y = dataset.target
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42)
    
    # 用更稳定的方式求解权重,替代直接求逆
    w = np.linalg.lstsq(x_train, y_train, rcond=None)[0]
    
    # 正确计算预测值
    y_pred = x_test @ w
    
    MSE = mean_squared_error(y_pred, y_test)
    rmse = np.sqrt(MSE)
    return rmse

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    args = parser.parse_args()
    print(main(args))

运行修正后的代码,RMSE会降到约50左右,符合糖尿病数据集线性回归的预期结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 09:36:22