如何解决从 Sklearn 中的 HuberRegressor 获取 p 值和 r 值
我的数据集有一些异常值。 从简单的线性回归,使用
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 回归量的结果是显着的。
如何从稳健回归中获得 r 值和 p 值(我的情况,使用 huber 回归器)
解决方法
对于 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)
。
您也可以使用 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 平方,因为您要避开朝向异常数据点的线。
查看@Josef(维护 statsmodels)在此 question、此 answer 中的评论。如果你想要一个有意义的 r 平方
,你可以试试 this calculationHow to get R-squared for robust regression (RLM) in Statsmodels?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。