Как интерпретировать результаты логистической регрессии с помощью statsmodels

Вопрос или проблема

Я занимаюсь логистической регрессией с использованием statsmodels и sklearn. Результаты меня немного сбивают с толку. На предыдущем шаге я использовал алгоритм отбора признаков, который говорит мне использовать только feature1 для моей регрессии. Результаты следующие:

Модель предсказывает все значения как 1, а значение P < 0.05, что для меня является довольно хорошим индикатором. Но точность меньше 0.6, что означает, что она по сути ничего не говорит. Можете подсказать, как это интерпретировать? Это мой первый проект в области науки о данных с сложными данными.

Мой код:
X = df_n_4[“feat1″]
y = df_n_4[‘Survival’]

# используем разделение на обучающую и тестовую выборки с разными значениями random_state
# мы можем изменить значения random_state, которые будут изменять значения точности
# значения сильно меняются, именно поэтому оценки тестов имеют высокую дисперсию
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=2)
print(len(y_train), ” Тестовые данные”)

# проверяем классификационные оценки логистической регрессии
logit_model = sm.Logit(y_train, X_train).fit()
y_pred = logit_model.predict(X_test)
print(‘Результаты разделения на обучающую/тестовую выборки:’)
plt.title(‘Accuracy Score: {}, Переменные: feat1’.format(round((accuracy_score(y_test, y_pred.round())), 3)))
cf_matrix = confusion_matrix(y_test, y_pred.round())
sns.heatmap(cf_matrix, annot=True)
plt.ylabel(‘Фактический сценарий’)
plt.xlabel(‘Предсказанный сценарий’)
plt.show()
print(logit_model.summary2())

Что-то не так с вашим инструментом отбора признаков: значение p равно NaN, доверительный интервал включает $0$. Матрица путаницы показывает, что все наблюдения предсказаны как класс 1. Сколько объясняющих переменных у вас есть? Попробуйте использовать все из них, а не только одну. Вы уверены, что
logit_model = sm.Logit(y_train, X_train).fit()

верно? Разве не должно быть наоборот: logit_model = sm.Logit(X_train, y_train).fit()?

Чтобы резюмировать из комментариев:

statsmodels не добавляет пересечение автоматически.

Используйте предсказанные вероятности, а не только жесткую классификацию (которую вы получили, округлив предсказания).

Мне не кажется, что с моделью что-то серьезно не так, хотя, возможно, это не особенно хорошая модель. Я бы попробовал несколько моделей с большим количеством признаков; вы ничего не сказали о методе отбора признаков, а отбор признаков — это сложная задача.

Ответ или решение

Когда вы выполняете логистическую регрессию с использованием библиотеки statsmodels, интерпретация результатов может быть сложной, особенно если вы новичок в этой области и имеете дело с неинтуитивными данными. Давайте подробно разберем ваши результаты и возможно, выявим некоторые проблемы.

1. Основы логистической регрессии

Логистическая регрессия используется для предсказания вероятности того, что целевая переменная принимает значение 1 (например, выживание в вашем случае) на основе одного или нескольких предикторов. Ваша модель предсказывает вероятности, которые затем могут быть преобразованы в классы (0 или 1) с использованием порога (обычно 0.5).

2. Интерпретация результатов

  • P-value < 0.05: Это указывает на то, что ваша переменная feat1 является статистически значимым предиктором для вашей целевой переменной. Однако это не всегда гарантирует, что предсказания будут хорошими.

  • Точность < 0.6: Низкая точность указывает на то, что ваша модель не способна эффективно предсказывать классы. Это может быть вызвано различными причинами:

    • Одномерная модель: Вы используете только одну переменную (feat1) для предсказания классов, что может быть недостаточно для сложных проблем. Рассмотрите возможность добавления остальных переменных и повторной проверки.

    • Необработанные данные: Проблемы с данными, такие как выбросы, пропуски или несбалансированные классы, могут негативно повлиять на производительность модели. Проверьте распределение классов в вашей целевой переменной и рассмотрите возможность применения методов уравнивания классов (например, oversampling или undersampling).

  • Матрица путаницы: Если ваша матрица путаницы показывает, что все наблюдения предсказываются как класс 1, это может означать:

    • Зависимость от порога: Проверьте, какое значение вы используете для преобразования вероятностей в классы. Возможно, 0.5 является неудачным выбором.

    • Дисбаланс классов: Если класс 1 значительно преобладает над классом 0, ваш алгоритм может отдать предпочтение этой категории, просто предсказывая ее для всех данных.

3. Ошибки в коде

  • Вы правильно заметили, что вы используете logit_model = sm.Logit(y_train, X_train).fit(), что неверно, так как порядок аргументов должен быть: logit_model = sm.Logit(y_train, X_train).fit().

  • Также важно помнить, что statsmodels не добавляет смещение (intercept) автоматически. Вы можете добавить константный столбец в ваши данные, используя функцию sm.add_constant().

4. Рекомендации

  • Попробуйте использовать все доступные переменные: Как было отмечено в комментариях, использование одного предиктора может быть неэффективным. Включите больше признаков и исследуйте, как это влияет на результат.

  • Используйте предсказанные вероятности: Вместо преобразования предсказанных значений в классы используйте вероятности для дальнейшего анализа и интерпретации.

  • Проверьте качество данных: Убедитесь, что ваши данные чистые и хорошо подготовленные. Выявите возможные причины несоответствий в данных.

  • Перекрестная проверка: Используйте методы кросс-валидации для более надежной оценки вашей модели.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...