【问题标题】:get p value and r value from HuberRegressor in Sklearn从 Sklearn 中的 HuberRegressor 获取 p 值和 r 值
【发布时间】:2026-01-05 22:50:01
【问题描述】:

我有一些异常值的数据集。 从简单的线性回归,使用

stat_lin = stats.linregress(X, Y)

可以得到系数、截距、r_value、p_value、std_err

但我想应用稳健的回归方法,因为我不想包含异常值。

所以我应用了来自 Sklearn 的 Huber 回归器,

huber = linear_model.HuberRegressor(alpha=0.0, epsilon=1.35)
huber.fit(mn_all_df['X'].to_numpy().reshape(-1, 1), mn_all_df['Y'].to_numpy().reshape(-1, 1))

从中,我可以得到系数、截距、尺度、异常值。

我对结果感到满意,因为系数值更高,并且回归线与大多数数据点拟合。

但是,我需要一个诸如 r 值和 p 值之类的值来说明 huber regressor 的结果是显着的。

如何从稳健回归中获得 r 值和 p 值(我的案例,使用 huber 回归器)

【问题讨论】:

    标签: python regression robust


    【解决方案1】:

    您也可以使用robust linear models in statsmodels。例如:

    import statsmodels.api as sm
    from sklearn import datasets
    
    x = iris.data[:,0]
    y = iris.data[:,2]
    rlm_model = sm.RLM(y, sm.add_constant(x),
    M=sm.robust.norms.HuberT())
    rlm_results = rlm_model.fit()
    

    你从 scipy.lingress 得到的 p 值是斜率不为零的 p 值,你可以这样做:

    rlm_results.summary()
                         
    ==============================================================================
                     coef    std err          z      P>|z|      [0.025      0.975]
    ------------------------------------------------------------------------------
    const         -7.1311      0.539    -13.241      0.000      -8.187      -6.076
    x1             1.8648      0.091     20.434      0.000       1.686       2.044
    ==============================================================================
    

    现在来自 lingress 的 r_value 是一个相关系数,并且保持不变。使用稳健的线性模型,您可以对观察结果进行不同的权衡,从而使其对异常值不那么敏感,因此,r 平方计算在这里没有意义。您可能会得到较低的 r 平方,因为您要避开指向异常数据点的线。

    questionanswer 中查看 @Josef(维护 statsmodels)的 cmets。如果你想要一个有意义的 r-squared,你可以试试this calculation

    How to get R-squared for robust regression (RLM) in Statsmodels?

    【讨论】:

    • 这绝对是绝妙的方法
    【解决方案2】:

    对于HuberRegressor,您使用sklearn,它在linear_model 模块中不提供r_value 和p_value 的方法。还有其他答案可以根据回归结果计算这些值。

    this answer 中,有人展示了如何计算线性回归的 p_values。我认为这也可以应用于您的模型。

    编辑:我查看了 r 值,该值用于通过平方来计算 r 平方值。以下截图来自documentation of scipy

    print(f"R-squared: {res.rvalue**2:.6f}")
    R-squared: 0.717533
    

    如果你有自己的回归,可以使用sklearn的这个方法计算r平方值:sklearn.metrics.r2score(y_true, y_pred)

    【讨论】: