Почему MNLo git возвращает параметры `classes_num - 1` и как их все получить? - PullRequest
0 голосов
/ 07 мая 2020

Если у меня есть несколько классов, т.е. 3. Я ожидаю получить 3 массива коэффициентов обобщенной линейной регрессии, как в sklearn.linear_model.LogisticRegression, но statsmodels.discrete.discrete_model.MNLogit предоставляет коэффициенты classes_num - 1 (в данном случае - 2).

Пример:

import statsmodels.api as st
from sklearn.linear_model import LogisticRegression


iris = st.datasets.get_rdataset('iris','datasets')

y = iris.data.Species
x = iris.data.iloc[:, :-1]
mdl = st.MNLogit(y, x)
# mdl_fit = mdl.fit()
mdl_fit = mdl.fit(method='bfgs' , maxiter=1000)
print(mdl_fit.params.shape)  # (4, 2)

model = LogisticRegression(fit_intercept = False, C = 1e9)
mdl = model.fit(x, y)
print(model.coef_.shape)  # (3, 4)

Как я должен получить коэффициенты регрессии для всех 3 классов, используя MNLo git?

Ответы [ 2 ]

1 голос
/ 07 мая 2020

Эти коэффициенты не вычисляются для обеспечения идентифицируемости модели. Другими словами, их не вычисление гарантирует, что коэффициенты для других классов будут уникальными . Если у вас есть три набора коэффициентов, существует бесконечное количество моделей, которые дают одинаковые прогнозы, но имеют разные значения коэффициентов. И это плохо, если вы хотите знать стандартные ошибки, p-значения и т. Д.

lo git отсутствующего класса предполагается равным нулю. Демо:

mm = st.MNLogit(
    np.random.randint(1, 5, size=(100,)),
    np.random.normal(size=(100, 3))
)

res = mm.fit()
xt = np.random.normal(size=(2, 3))
res.predict(xt)

Результаты в:

array([[0.19918096, 0.34265719, 0.21307297, 0.24508888],
       [0.33974178, 0.21649687, 0.20971884, 0.23404251]])

Теперь это логиты плюс нули для первого класса

logits = np.hstack([np.zeros((xt.shape[0], 1)), xt.dot(res.params)])

array([[ 0.        ,  0.54251673,  0.06742093,  0.20740715],
       [ 0.        , -0.45060978, -0.4824181 , -0.37268309]])

И прогнозы через softmax:

np.exp(logits) / (np.sum(np.exp(logits), axis=1, keepdims=1))

array([[0.19918096, 0.34265719, 0.21307297, 0.24508888],
       [0.33974178, 0.21649687, 0.20971884, 0.23404251]])

, которые соответствуют предсказаниям модели.

Повторяю: вы не можете найти эти коэффициенты. Для первого класса используйте константу lo git, равную нулю. И вы не можете понять, насколько важны функции для первого класса. На самом деле это некорректный вопрос: функции не могут влиять на ссылочный класс, потому что ссылочный класс никогда не прогнозируется напрямую. Коэффициенты говорят вам о том, насколько логарифмические шансы для данного класса по сравнению с эталонным классом изменяются в результате увеличения единицы для конкретной характеристики.

0 голосов
/ 07 мая 2020

Прогнозируемые вероятности должны быть в сумме до 1 по классам. Итак, мы теряем один свободный параметр в полной модели, чтобы наложить это ограничение.

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

...