从 Sklearn 中的 HuberRegressor 获取 p 值和 r 值

get p value and r value from HuberRegressor in Sklearn

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

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 回归器)

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

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

编辑:我查看了 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).

您也可以使用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 平方,因为您正在避开指向离群数据点的线。

如果您想要有意义的 r 平方

,请参阅来自此 question, this answer. You can try this calculation 的@Josef(他维护统计模型)的评论

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