scikit Learn: как проверить значимость коэффициентов

я попытался выполнить LR с помощью SKLearn для довольно большого набора данных с ~ 600 фиктивными и всего несколькими интервальными переменными (и 300 тыс. строк в моем наборе данных), и полученная матрица путаницы выглядит подозрительно. Я хотел проверить значимость возвращаемых коэффициентов и ANOVA, но не могу найти, как получить к ним доступ. Это вообще возможно? И какова наилучшая стратегия для данных, содержащих множество фиктивных переменных? Большое спасибо!


person dadam    schedule 04.08.2014    source источник
comment
Если ваш объект логистической регрессии называется lr, попробуйте взглянуть на lr.coef_. Это то, что вы ищите?   -  person eickenberg    schedule 04.08.2014
comment
нет, ну, coef_ — это значение коэффициентов, и я хочу узнать значение этого значения: z-оценка и p-значение. это когда вы принимаете тестовую гипотезу о том, что коэффициент равен 0 (нулевая гипотеза H_0 = 0), и альтернативную гипотезу H_1! = 0, а затем p-значение говорит вам в основном, можете ли вы отклонить H_0 (когда H_0 крошечный) или нет (когда H_0->1)   -  person dadam    schedule 05.08.2014
comment
С логистической регрессией у меня такое ощущение, что вы можете получить только те, которые используют повторную выборку и построение эмпирических распределений на coef_ каждой выборки.   -  person eickenberg    schedule 05.08.2014
comment
ну да, но мне было интересно, есть ли встроенный метод с sklearn, например сводка для объекта класса glm в R...   -  person dadam    schedule 05.08.2014
comment
Извините, нет ни одного. Если эта функция существует в R, почему вы не используете R? В любом случае, этот тип классической статистики, например, для линейная регрессия работает только в настройке n_samples <= n_features.   -  person eickenberg    schedule 05.08.2014
comment
Я действительно сделал то, что вы предложили, с построением эмпирических распределений для подвыборок - сработало хорошо! Благодарю вас!   -  person dadam    schedule 06.08.2014
comment
Если это было полезно, вы также можете проверить выбор стабильности и реализации рандомизированной логистической регрессии sklearn. Они могут предоставить вам стабильный выбор функций.   -  person eickenberg    schedule 06.08.2014


Ответы (1)


Scikit-learn намеренно не поддерживает статистические выводы. Если вам нужны готовые тесты значимости коэффициентов (и многое другое), вы можете использовать Logit оценщик из Statsmodels. Этот пакет имитирует модели интерфейса glm в R, поэтому он может показаться вам знакомым.

Если вы все еще хотите придерживаться логистической регрессии scikit-learn, вы можете использовать асимтотическое приближение к распределению оценок максимального правдоподобия. А именно, для вектора оценок максимального правдоподобия theta его матрица дисперсии-ковариации может быть оценена как inverse(H), где H — матрица Гессе логарифмического правдоподобия при theta. Это именно то, что делает функция ниже:

import numpy as np
from scipy.stats import norm
from sklearn.linear_model import LogisticRegression

def logit_pvalue(model, x):
    """ Calculate z-scores for scikit-learn LogisticRegression.
    parameters:
        model: fitted sklearn.linear_model.LogisticRegression with intercept and large C
        x:     matrix on which the model was fit
    This function uses asymtptics for maximum likelihood estimates.
    """
    p = model.predict_proba(x)
    n = len(p)
    m = len(model.coef_[0]) + 1
    coefs = np.concatenate([model.intercept_, model.coef_[0]])
    x_full = np.matrix(np.insert(np.array(x), 0, 1, axis = 1))
    ans = np.zeros((m, m))
    for i in range(n):
        ans = ans + np.dot(np.transpose(x_full[i, :]), x_full[i, :]) * p[i,1] * p[i, 0]
    vcov = np.linalg.inv(np.matrix(ans))
    se = np.sqrt(np.diag(vcov))
    t =  coefs/se  
    p = (1 - norm.cdf(abs(t))) * 2
    return p

# test p-values
x = np.arange(10)[:, np.newaxis]
y = np.array([0,0,0,1,0,0,1,1,1,1])
model = LogisticRegression(C=1e30).fit(x, y)
print(logit_pvalue(model, x))

# compare with statsmodels
import statsmodels.api as sm
sm_model = sm.Logit(y, sm.add_constant(x)).fit(disp=0)
print(sm_model.pvalues)
sm_model.summary()

Выходы print() идентичны, и они являются p-значениями коэффициентов.

[ 0.11413093  0.08779978]
[ 0.11413093  0.08779979]

sm_model.summary() также печатает хорошо отформатированную сводку в формате HTML.

person David Dale    schedule 02.11.2017
comment
Большое спасибо за ваш ответ, насколько надежен p_value и используют ли statsmodel и spss один и тот же подход? - person Rocketq; 11.01.2018
comment
@Rocketq 1) Не могли бы вы определить, что вы подразумеваете под надежным p-значением? Это частный случай p-значения MLE. Поэтому я предлагаю искать теорию асимптотических свойств оценок максимального правдоподобия, чтобы получить общее представление о ее надежности. - person David Dale; 11.01.2018
comment
@Rocketq 2) Да, статистические модели точно так же рассчитывают p-значения для логистической регрессии. Ковариационная матрица параметров (атрибут statsmodels.base.model.LikelihoodModelResults.normalized_cov_params) рассчитывается как обратный гессиан в методе statsmodels.base.model.LikelihoodModel.fit и в дальнейшем используется для оценки p-значения и других целей. Насколько я знаю, SPSS делает то же самое. - person David Dale; 11.01.2018
comment
Это выглядит великолепно. Еще один вопрос, этот метод очень похож на статистику Вальда или нет? - person Rocketq; 11.01.2018
comment
Да, это p-значение в точности соответствует критерию Вальда. Оба основаны на предположении, что значение(estimate-hypothesis) / std.dev(estimate) является асимтотически стандартной нормой, если гипотеза верна. См. en.wikipedia.org/wiki/Wald_test#Test_on_a_single_parameter. - person David Dale; 11.01.2018
comment
@DavidDale, у вас есть ссылка на то, почему sklearn не поддерживает статистический вывод? - person kand; 13.04.2019
comment
@kand из-за фокуса. Они просто не могут поддерживать все (с очень ограниченными ресурсами), и они предпочитают более полно охватывать различные алгоритмы машинного обучения, вместо того, чтобы заниматься другими вещами. - person David Dale; 14.04.2019
comment
@David Dale Вы делаете акцент на термине C, потому что вам не нужна модель, которая будет соответствовать, или C оказывает сильное влияние на p_value? - person aerijman; 03.06.2019
comment
C оказывает сильное влияние на сами коэффициенты (и, конечно, через них на p-значение). Scikit-learn по умолчанию использует C=1; Статистические модели вообще не регуляризируются (что эквивалентно C=бесконечности). Поэтому, если мы хотим, чтобы scikit-learn и statsmodels имели одинаковые коэффициенты, нам нужно установить C очень высоко в scikit-learn. - person David Dale; 03.06.2019