线性回归函数计算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
相关产品推荐
相关产品推荐

