Алгоритм классификации

Логистическая регрессия — это фундаментальный статистический метод, используемый для бинарной классификации, цель которого — предсказать категориальный результат с двумя возможными классами на основе одной или нескольких переменных-предикторов. Несмотря на свое название, для классификации используется логистическая регрессия, а не регрессия.

Ключевые моменты:

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