从 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?
我有一些异常值的数据集。 从简单的线性回归,使用
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?