получить значение p и значение r от HuberRegressor в Sklearn

У меня есть наборы данных с некоторыми выбросами. Из простой линейной регрессии, используя

stat_lin = stats.linregress(X, Y)

Я могу получить коэффициент, перехват, r_value, p_value, std_err

Но я хочу применить надежный метод регрессии, так как не хочу включать выбросы.

Поэтому я применил регрессор Хубера от Sklearn,

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, чтобы сказать, что результаты регрессора Хубера значительны.

Как я могу получить значение r и значение p из надежной регрессии (мой случай, используя регрессор Хубера)


person Dong-gyun Kim    schedule 26.07.2021    source источник


Ответы (2)


Вы также можете использовать надежные линейные модели в статистических моделях. Например:

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()

Значение p, которое вы получаете от scipy.lingress, представляет собой значение 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
==============================================================================

Теперь r_value из lingress — это коэффициент корреляции, и он остается таким. С надежной линейной моделью вы по-разному взвешиваете свои наблюдения, что делает их менее чувствительными к выбросам, поэтому расчет r в квадрате здесь не имеет смысла. Вы можете получить более низкий r в квадрате, поскольку вы избегаете линии, направленной к точкам выбросов.

См. комментарии @Josef (который поддерживает статистические модели) из этого вопрос, этот ответить. Вы можете попробовать этот расчет, если вы хотите иметь осмысленный r-квадрат

Как получить R-квадрат для надежной регрессии ( RLM) в статистических моделях?

person StupidWolf    schedule 27.07.2021
comment
Это совершенно гениальный метод - person Dong-gyun Kim; 27.07.2021

С HuberRegressor вы используете sklearn, который не предлагает методы для r_value и p_value в их модуле linear_model. Есть и другие ответы, которые рассчитывают эти значения по результатам регрессии.

В этом ответе кто-то показывает, как можно рассчитать p_values ​​линейной регрессии. Я думаю, что это также может быть применено к вашей модели.

Редактировать: я изучил значение r, которое используется для вычисления значения r в квадрате путем его возведения в квадрат. Ниже приведен фрагмент из документации scipy. :

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

Если у вас есть собственная регрессия, вы можете использовать этот метод sklearn для расчета значения r в квадрате: sklearn.metrics.r2score(y_true, y_pred).

person JANO    schedule 26.07.2021