Вопрос или проблема
Я занимаюсь логистической регрессией с использованием 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. Рекомендации
-
Попробуйте использовать все доступные переменные: Как было отмечено в комментариях, использование одного предиктора может быть неэффективным. Включите больше признаков и исследуйте, как это влияет на результат.
-
Используйте предсказанные вероятности: Вместо преобразования предсказанных значений в классы используйте вероятности для дальнейшего анализа и интерпретации.
-
Проверьте качество данных: Убедитесь, что ваши данные чистые и хорошо подготовленные. Выявите возможные причины несоответствий в данных.
-
Перекрестная проверка: Используйте методы кросс-валидации для более надежной оценки вашей модели.
Заключение
Ваша текущая логистическая регрессия может быть полезным шагом, но есть еще много аспектов, которые стоит рассмотреть. Включите больше признаков, проверьте качество данных и пересмотрите способ получения итоговых предсказаний. Эти изменения помогут вам получить более точные и значимые результаты в вашем проекте по анализу данных.