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

如何从Sklearn的HuberRegressor鲁棒回归中获取r值与p值

如何从Sklearn的HuberRegressor鲁棒回归结果中获取r值和p值

首先明确:Sklearn内置的HuberRegressor接口没有直接输出r值、p值的参数,需要手动计算,且计算得到的指标统计含义和普通最小二乘(OLS)的对应指标存在差异,仅可作为显著性参考,不能完全套用OLS的显著性判断逻辑。

1. 计算r值

你之前通过stats.linregress得到的r_value为皮尔逊相关系数,要和该指标对齐,可直接计算Huber回归预测值与真实值的皮尔逊相关系数,也可根据需求计算衡量模型解释力的决定系数R²:

import numpy as np
from scipy import stats
from sklearn.metrics import r2_score

# 提取真实值,用训练好的Huber模型生成预测值
y_true = mn_all_df['Y'].to_numpy()
y_pred = huber.predict(mn_all_df['X'].to_numpy().reshape(-1, 1))

# 计算与linregress输出对齐的皮尔逊r值
r_value = np.corrcoef(y_true, y_pred)[0, 1]

# 可选:计算决定系数R²
r2 = r2_score(y_true, y_pred)

2. 计算p值

Huber回归没有标准的p值闭式解,工业界和学术界常用大样本下的Wald检验近似计算,实现逻辑如下:

# 获取模型拟合的核心参数
coef = huber.coef_[0]
epsilon = huber.epsilon
scale = huber.scale_
X_arr = mn_all_df['X'].to_numpy()
n_sample = len(X_arr)
n_param = 2 # 本场景为单变量回归,参数为截距+自变量系数两个

# 构造带截距项的自变量矩阵
X_mat = np.vstack([np.ones(n_sample), X_arr]).T
# 计算残差与Huber权重
residuals = y_true - y_pred
huber_weights = np.where(np.abs(residuals) < epsilon * scale,
                         1,
                         epsilon * scale / np.abs(residuals))
W = np.diag(huber_weights)

# 用三明治估计法计算系数的鲁棒协方差矩阵
bread = np.linalg.inv(X_mat.T @ W @ X_mat)
meat = X_mat.T @ np.diag(residuals ** 2) @ X_mat
cov_mat = bread @ meat @ bread

# 提取自变量系数的标准误,构造t统计量
coef_se = np.sqrt(np.diag(cov_mat))[1]
t_stat = coef / coef_se
# 计算双尾检验p值,自由度为样本量减参数个数
p_value = 2 * (1 - stats.t.cdf(np.abs(t_stat), df = n_sample - n_param))

注意事项

  • 上述p值为大样本下的近似结果,样本量过小时偏差会明显升高
  • 若对p值精度要求极高,可采用Bootstrap抽样法多次拟合Huber回归,基于系数的经验分布计算p值,仅计算成本会更高
  • 你之前拟合时传入的Y为二维数组,HuberRegressor的fit方法默认接收一维Y,可调整为huber.fit(X, y.ravel())避免接口警告

内容的提问来源于stack exchange,提问作者Dong-gyun Kim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 15:27:00