Алгоритм классификации
Логистическая регрессия — это фундаментальный статистический метод, используемый для бинарной классификации, цель которого — предсказать категориальный результат с двумя возможными классами на основе одной или нескольких переменных-предикторов. Несмотря на свое название, для классификации используется логистическая регрессия, а не регрессия.
Ключевые моменты:
1. Двоичная классификация. Логистическая регрессия используется, когда зависимая переменная является категориальной и имеет два класса, часто обозначаемых как 0 и 1. Она определяет вероятность принадлежности входных данных к определенному классу.
2. Логистическая функция (сигмовидная). Модель логистической регрессии использует логистическую функцию (также известную как сигмовидная функция) для преобразования линейной комбинации входных признаков в значение от 0 до 1. Сигмоидальная функция выход представляет собой вероятность того, что вход принадлежит одному из классов.
3. Представление модели. Математически модель логистической регрессии можно представить как:
где , z = b0 + b1 * x1 + b2 * x2 + … + bn * xn
4. Обучение. Модель обучается с использованием функции потерь, часто двоичной кросс-энтропийной потери, которая измеряет разницу между прогнозируемыми вероятностями и фактическими метками классов. Градиентный спуск используется для оптимизации коэффициентов (весов) модели и минимизации потерь.
5. Граница решения. Модель генерирует границу решения, разделяющую два класса. Порог предсказанных вероятностей используется для классификации точек данных в соответствующий класс.
6. Оценка. Эффективность модели оценивается с использованием таких показателей, как точность, прецизионность, полнота, показатель F1 и кривые ROC. Эти метрики помогают оценить эффективность модели при классификации данных.
7. Регуляризация. Такие методы регуляризации, как L1 (Лассо) и L2 (Ридж), можно применять к логистической регрессии, чтобы предотвратить переобучение и улучшить обобщение на новые данные.
8. Приложения. Логистическая регрессия широко используется в различных областях, включая здравоохранение (прогнозирование заболеваний), финансы (оценка кредитного риска), маркетинг (прогнозирование оттока клиентов) и обработку естественного языка (анализ настроений).
9. Многоклассовое расширение. Хотя логистическая регрессия изначально была разработана для бинарной классификации, ее можно расширить для решения многоклассовых задач с помощью таких методов, как «один против остальных» (OvR) или регрессия Softmax (мультиномиальная логистическая регрессия).
Логистическая регрессия обеспечивает простой, но мощный подход к решению проблем двоичной классификации. Это основополагающая концепция машинного обучения, часто служащая отправной точкой для новичков в этой области. Важно отметить, что, хотя логистическая регрессия полезна во многих случаях, она может работать неэффективно, когда данные сильно нелинейны или когда между функциями существуют сложные взаимодействия. В таких случаях могут потребоваться более совершенные алгоритмы.
Мы проверим эту концепцию на наборе данных Титаника.
Начнем с импорта базовых библиотек и импорта данных обучения и испытаний.
Проверка атрибутов поезда и тестовых данных.
<class 'pandas.core.frame.DataFrame'> RangeIndex: 891 entries, 0 to 890 Data columns (total 12 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 PassengerId 891 non-null int64 1 Survived 891 non-null int64 2 Pclass 891 non-null int64 3 Name 891 non-null object 4 Sex 891 non-null object 5 Age 714 non-null float64 6 SibSp 891 non-null int64 7 Parch 891 non-null int64 8 Ticket 891 non-null object 9 Fare 891 non-null float64 10 Cabin 204 non-null object 11 Embarked 889 non-null object dtypes: float64(2), int64(5), object(5) memory usage: 83.7+ KB
<class 'pandas.core.frame.DataFrame'> RangeIndex: 891 entries, 0 to 890 Data columns (total 12 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 PassengerId 891 non-null int64 1 Survived 891 non-null int64 2 Pclass 891 non-null int64 3 Name 891 non-null object 4 Sex 891 non-null object 5 Age 714 non-null float64 6 SibSp 891 non-null int64 7 Parch 891 non-null int64 8 Ticket 891 non-null object 9 Fare 891 non-null float64 10 Cabin 204 non-null object 11 Embarked 889 non-null object dtypes: float64(2), int64(5), object(5) memory usage: 83.7+ KB
Мы объединим данные поезда и тестирования в один кадр данных, чтобы одновременно выполнить предварительную обработку данных.
<class 'pandas.core.frame.DataFrame'> Int64Index: 1309 entries, 0 to 417 Data columns (total 13 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 PassengerId 1309 non-null int64 1 Survived 891 non-null float64 2 Pclass 1309 non-null int64 3 Name 1309 non-null object 4 Sex 1309 non-null object 5 Age 1046 non-null float64 6 SibSp 1309 non-null int64 7 Parch 1309 non-null int64 8 Ticket 1309 non-null object 9 Fare 1308 non-null float64 10 Cabin 295 non-null object 11 Embarked 1307 non-null object 12 data 1309 non-null object dtypes: float64(3), int64(4), object(6) memory usage: 143.2+ KB
Проверка новых строк данных с помощью функции .sample().
Проверяем наличие дубликатов в данных, обнаруживаем, что дубликатов нет.
Number of duplicate Values : 0
После этого проверяем наличие пропущенных значений по столбцам.
PassengerId 0.000000 Survived 31.932773 Pclass 0.000000 Name 0.000000 Sex 0.000000 Age 20.091673 SibSp 0.000000 Parch 0.000000 Ticket 0.000000 Fare 0.076394 Cabin 77.463713 Embarked 0.152788 data 0.000000 dtype: float64
В столбце «Кабина» более 25% нулевых значений, поэтому их необходимо удалить. Наряду со столбцами PassengerId, Name и Ticket.
В столбце «Выжившие» отсутствуют значения из набора тестовых данных, поэтому мы пока его проигнорируем.
Survived 31.932773 Pclass 0.000000 Sex 0.000000 Age 20.091673 SibSp 0.000000 Parch 0.000000 Fare 0.076394 Embarked 0.152788 data 0.000000 dtype: float64
Мы начнем вменять недостающие значения, так как недостающие значения составляют менее 25%.
Мы взглянем на распределение, так как нам нужно проверить, искажены ли данные или нет.
Поскольку это проблема классификации, нам не нужно исправлять выбросы, если значения находятся в допустимом диапазоне. Здесь мы видим, что максимальное значение выброса всего на 10 пунктов выше максимума.
Поскольку в столбце «Возраст» есть выбросы, мы будем вменять значения медианным значением.
Мы также видим распределение значений в столбце «На борту».
S 914 C 270 Q 123 Name: Embarked, dtype: int64
Поскольку «S» имеет самую высокую частоту, мы заполняем недостающие значения одинаковыми.
Survived 418 Pclass 0 Sex 0 Age 0 SibSp 0 Parch 0 Fare 1 Embarked 0 data 0 dtype: int64
Проверка столбца «Тариф».
Поскольку столбец «Тариф» сильно искажен, мы исправим выбросы в этом столбце с помощью метода IQR.
Затем мы заполняем пропущенные значения средним значением, поскольку выбросов больше нет.
После исправления пропущенных значений перейдем к кодированию категориальных значений.
Мы проверяем количество значений каждого категориального столбца, чтобы увидеть количество и тип значений в нем.
3 709 1 323 2 277 Name: Pclass, dtype: int64
S 916 C 270 Q 123 Name: Embarked, dtype: int64
male 843 female 466 Name: Sex, dtype: int64
Мы видим, что столбец «Пол» имеет 2 значения, поэтому мы используем Label Encoder для этого столбца.
Поскольку между ними нет установленной связи, мы используем One Hot Encoder, чтобы закодировать их в числовые столбцы и просмотреть окончательный обработанный кадр данных.
<class 'pandas.core.frame.DataFrame'> Int64Index: 1309 entries, 0 to 417 Data columns (total 11 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Survived 891 non-null float64 1 Sex 1309 non-null int8 2 Age 1309 non-null float64 3 SibSp 1309 non-null int64 4 Parch 1309 non-null int64 5 Fare 1309 non-null float64 6 data 1309 non-null object 7 Pclass_2 1309 non-null uint8 8 Pclass_3 1309 non-null uint8 9 Embarked_Q 1309 non-null uint8 10 Embarked_S 1309 non-null uint8 dtypes: float64(3), int64(2), int8(1), object(1), uint8(4) memory usage: 78.0+ KB
Давайте визуализируем все столбцы, чтобы лучше видеть все числовые столбцы.
Давайте проверим, сбалансирован ли набор данных для всех целевых значений.
0.0 549 1.0 342 Name: Survived, dtype: int64
Поскольку класс «1» для живого пассажира составляет более 50% от класса «0», что означает мертвого пассажира. Следовательно, мы можем сказать, что набор данных сбалансирован.
Давайте посмотрим тепловую карту набора данных, чтобы получить больше значений.
Мы видим некоторую корреляцию между «Тарифом» и выживаемостью, «Сексом» и выживаемостью.
Теперь нам нужно разделить обучение и тестирование отдельно для построения модели и прогнозирования.
((891, 11), (418, 11))
Давайте проверим характеристики набора обучающих данных.
Мы также можем использовать парный график, чтобы увидеть распределение между различными атрибутами.
Survived 418 Sex 0 Age 0 SibSp 0 Parch 0 Fare 0 data 0 Pclass_2 0 Pclass_3 0 Embarked_Q 0 Embarked_S 0 dtype: int64
Удаление дополнительных столбцов «Выжившие» и «данные» (которые были добавлены для объединения набора данных теста и обучения)
Мы удаляем одни и те же столбцы из данных поезда и назначаем их данным обучения и целевым столбцам.
Survived 0.0 549 1.0 342 dtype: int64
Теперь мы обучаем модель логистической регрессии из SkLearn на данных поезда. Мы также будем использовать метрики sklearn, такие как матрица путаницы, отчет о классификации и показатель точности.
[[359 53] [ 76 180]] ********************************************* [[118 19] [ 28 58]]
Матрица путаницы
Матрица путаницы — это таблица, которая используется для определения производительности алгоритма классификации. Матрица путаницы визуализирует и суммирует эффективность алгоритма классификации.
Отчет о классификации
Отчет о классификации — это показатель оценки производительности в машинном обучении. Он используется для демонстрации точности, отзыва, оценки F1 и поддержки вашей обученной модели классификации.
- Точность: фокусируется на точности положительных прогнозов.
- Вспоминание: фокусируется на умении правильно идентифицировать все положительные случаи.
- Оценка F1: балансирует точность и полноту, что особенно полезно в несбалансированных наборах данных.
Эти метрики часто используются вместе, чтобы обеспечить полное понимание производительности модели. Выбор приоритетной метрики зависит от конкретной проблемы и относительной важности ложноположительных и ложноотрицательных результатов в данном контексте.
precision recall f1-score support 0.0 0.83 0.87 0.85 412 1.0 0.77 0.70 0.74 256 accuracy 0.81 668 macro avg 0.80 0.79 0.79 668 weighted avg 0.81 0.81 0.80 668 ********************************************* precision recall f1-score support 0.0 0.81 0.86 0.83 137 1.0 0.75 0.67 0.71 86 accuracy 0.79 223 macro avg 0.78 0.77 0.77 223 weighted avg 0.79 0.79 0.79 223
Оценка точности:
Точность — еще один часто используемый показатель для оценки эффективности моделей классификации. Он измеряет общую правильность прогнозов модели для всех классов. В частности, точность — это отношение правильно предсказанных экземпляров к общему количеству экземпляров в наборе данных.
Точность = (Правильные прогнозы) / (Общее количество прогнозов)
0.8068862275449101 ********************************************* 0.7892376681614349
Train Accuracy [0.86567164 0.76119403 0.76119403 0.76119403 0.82089552 0.8358209 0.8358209 0.80597015 0.84848485 0.78787879] Train Mean Accuracy 0.8084124830393487 Train Max Accuracy 0.8656716417910447 Test Accuracy [0.73913043 0.86956522 0.47826087 0.72727273 0.90909091 0.68181818 0.90909091 0.81818182 0.86363636 0.77272727] Test Mean Accuracy 0.7768774703557312 Test Max Accuracy 0.9090909090909091
РПЦ и АУК
- Кривая ROC: графическое представление производительности модели при различных пороговых значениях классификации, показывающее компромисс между TPR и FPR.
- AUC. Скалярное значение, представляющее площадь под кривой ROC и суммирующее общую производительность модели. Более высокий AUC указывает на лучшую способность к распознаванию.
0.7678662366321507