Логистическая регрессия - это модель классификации машинного обучения с довольно запутанным названием!

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

Логистическая регрессия используется во многих областях науки. В Обработке естественного языка (НЛП) он используется для определения настроения обзоров фильмов, в то время как в медицине его можно использовать для определения вероятности развития у пациента определенного заболевания.

Классификация вашей ежедневной продуктивности

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

В конце каждого дня вы спрашивали себя, действительно ли день был продуктивным. Но это всего лишь потенциально необъективные качественные данные. Вы хотите найти более научный способ сделать это.

Вы наблюдали естественные приливы и отливы своего дня и поняли, что больше всего на них влияет:

  • Сон: вы знаете, что сон или его отсутствие сильно влияет на ваш день.
  • Кофе не начинается после кофе?
  • Время для сосредоточения не всегда возможно, но вы стараетесь выделить 3–4 часа целенаправленного времени, чтобы погрузиться в проекты.
  • Обед. Вы заметили, что день течет гладко, когда у вас есть время не только перекусить, но и хорошо пообедать.
  • Прогулки: вы совершали короткие прогулки, чтобы понять, что нужно, немного расслабиться и поразмышлять о своих проектах.

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

Обдумывая, какую модель использовать, вы понимаете, что эти действия линейно связаны с вашей общей производительностью.

Тогда ваш первый вопрос: Может ли Линейная регрессия быть самым простым и лучшим инструментом для работы?

Если это линейная модель, почему бы просто не использовать линейную регрессию?

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

Так почему бы не упростить задачу и не использовать модель линейной регрессии?

Чтобы классифицировать ваш день как продуктивный или нет с помощью модели линейной регрессии, первым делом нужно выбрать произвольный порог x и назначить наблюдения для каждого класса на основе простых критериев:

  • Класс непродуктивных, все результаты меньше или равны x.
  • Class Productive в противном случае, т. е. все результаты больше, чем x.

Это просто!

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

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

И вы можете делать это так, как вам нравится, при условии, что это целое число. В этом случае Нет становится 0, а Да становится 1.

Что касается произвольного порога, вы решили, что:

  • Результаты, меньшие или равные нулю, относятся к классу 0, то есть к непродуктивному дню.
  • Положительные результаты относятся к классу 1, то есть продуктивному дню.

Вы пропускаете данные через модель линейной регрессии с помощью Python SckitLearn и наносите на график результаты вместе с их соответствующим классом.

import numpy as np
import matplotlib.pyplot as plt
from sklearn import linear_model
from matplotlib.lines import Line2D
from sklearn.model_selection import train_test_split
def plot_results(train_targets, predictions):
    fig, ax = plt.subplots(figsize=(15, 10))
    # removing all borders except bottom
    ax.spines['top'].set_visible(False)
    ax.spines['right'].set_visible(False)
    ax.spines['left'].set_visible(False)
    # adding major gridlines
    ax.grid(color='grey', linestyle='-', linewidth=0.25, alpha=0.5)
    training_colors = ['#4786D1' if target <= 0 else '#F28627' for target in train_targets]
    prediction_colors = ['#4786D1' if target <= 0 else '#F28627' for target in predictions]
    train_set_len = len(train_targets)
    predictions_len = len(predictions)
    plt.scatter(np.arange(0, train_set_len), train_targets, color=training_colors, marker='o', s=[12 * train_set_len])
    plt.scatter(np.arange(0, predictions_len), predictions, color=prediction_colors, marker='^', s=[40 * predictions_len])
    ax.set_xlabel('Observation')
    ax.set_ylabel('Target value')
    # Customizing symbols in the legend
    legend_items = [Line2D([0], [0], color='#4786D1', markersize=15), 
        Line2D([0], [0], color='#F28627', markersize=15),
        Line2D([0], [0], color='w', marker='o', markerfacecolor='#979797', markeredgecolor='#979797', markersize=15),
        Line2D([0], [0], color='w', marker='^', markerfacecolor='#979797', markeredgecolor='#979797', markersize=15)]
    # Adding some spacing between each legend row and padding
    ax.legend(handles=legend_items,
    labels=['Class 0: Non Productive', 'Class 1: Productive', 'Training set', 'Predictions'],labelspacing=1.5, borderpad=1)
    
    plt.show()
def fit_linear_regression(features, targets):
    train_features, test_features, train_targets, test_targets = train_test_split(features, targets, test_size=0.25, random_state=123)
    model = linear_model.LinearRegression()
    fitted_model = model.fit(train_features, train_targets)
    predictions = fitted_model.predict(test_features)
    
    print('---Linear Regression')
    print('Coefficients: ' + str(fitted_model.coef_))
    print('Intercept: ' + str(fitted_model.intercept_))
    print('R-squared: ' + str(fitted_model.score(train_features, np.array(train_targets).reshape(-1, 1))))
    
    plot_results(train_targets, predictions)
productivity_features = [[8.0, 2, 4.5, 1, 0],
                         [7.5, 1, 5.0, 1, 0],
                         [9.0, 2, 3.0, 0, 0],
                         [6.0, 3, 2.5, 1, 0],
                         [8.5, 2, 3.5, 0, 1],
                         [10.0, 1, 2.0, 1, 1],
                         [7.5, 3, 2.5, 1, 0],
                         [8.5, 2, 3.5, 0, 1],
                         [6.0, 2, 1.5, 1, 1],
                         [7.0, 1.0, 3.0, 1, 0]]
productivity_targets = [1, 1, 0, 0, 1, 0, 1, 0, 0, 1]
fit_linear_regression(productivity_features, productivity_targets)

Линейная регрессия: не лучший инструмент для этой работы

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

В некоторых случаях модель не справлялась с предсказанием правильного класса.

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

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

0.7 неплохо. Конечно, эту модель можно улучшить, но это еще не полный провал!

Но даже с, казалось бы, обнадеживающими результатами, модель линейной регрессии имеет несколько ограничений, когда дело касается задач классификации:

  1. Подразумевается, что значения результатов имеют определенный порядок.
  2. Производит непрерывные, неограниченные результаты.
  3. Только объясняет, как отдельная функция влияет на цель.

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

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

Например, вы решили, что все результаты, меньшие или равные 0, принадлежат Классу 0, а все остальные результаты принадлежат Классу 1.

Таким образом, при таком подходе вы неявно предполагаете, что все наблюдения из класса 0 должны предшествовать всем наблюдениям для класса 1.

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

Как следствие, модель имеет тенденцию к снижению точности.

2. Обеспечивает непрерывные, неограниченные результаты

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

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

Тот факт, что результаты являются непрерывными, не является проблемой. Большим ограничением является то, что эти результаты не ограничиваются значениями от 0 до 1.

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

3. Только объясняет, как отдельная функция влияет на цель

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

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

Но в задаче классификации вы хотите измерить, как весь набор функций влияет на результат, потому что все функции существуют одновременно, а не изолированно [1].

На помощь приходит логистическая регрессия!

Зная эти ограничения, становится ясно, что линейная регрессия - не лучший инструмент для задачи классификации.

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

Но логистическая регрессия больше подходит для задачи двоичной классификации, потому что она:

  • Предсказывает вероятность события Бернулли, где исход может быть только да / нет или положительным / отрицательным.
  • Находит функцию g, также называемую функцией связи, которая принимает вероятность того, что наблюдение является частью класса, и моделирует ее результат как линейную комбинацию предикторов.
  • Предполагается, что результат модели не изменяется линейно по мере изменения характеристик. Это функция g, которая изменяется линейно при изменении функций.

Для модели, содержащей только одну функцию или предиктор, функцию связи g можно описать как:

Логистическая регрессия использует функцию связи, но ее результатом является вероятность, что означает, что она может прогнозировать только значения от 0 до 1.

Таким образом, возникает вопрос: как логистическая регрессия превращает неограниченные, непрерывные значения линейной комбинации в вероятность?

Функция logit

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

В этом случае логарифмические шансы продуктивного дня - это отношение вероятности продуктивного дня (p) к вероятности непродуктивного дня (1- p ).

Вот почему функция logit также известна как функция log-odds .

Но почему логит, а не какая-то другая функция?

Функция logit - это сигмоидальная функция. Он имеет асимптотические значения 0 и 1, поэтому по мере приближения результатов модели к -infinity результат logit приближается к 0. С другой стороны, по мере приближения результатов к -infinity em> + бесконечность, результат logit приближается к 1.

Функция logit великолепна, поскольку сохраняет значения от 0 до 1, но вас не интересуют логарифмические шансы.

В задаче бинарного класса вам нужны фактические вероятности.

Логистическая функция

На практике вы хотите извлечь вероятности из логарифма шансов.

Звучит как сложная задача, но хорошая новость в том, что она требует всего лишь пары математических преобразований!

Вот как можно извлечь вероятность успеха (p) из логарифма шансов.

Сначала вы удалите логарифм, а затем, после некоторой алгебраической обработки, вы сможете изолировать p.

В конце этого процесса вероятность p, вероятность успеха, является функцией линейной комбинации.

С математической точки зрения, вы достигли обратной функции логит-функции, функции, которая называется логистическая функция .

Функция линейной комбинации z в краткой форме.

Если вас интересует вероятность неудачи, вы можете произвести аналогичную манипуляцию и изолировать (1- p) вместо p.

Объединив все это вместе, теперь вы знаете, что логистическая регрессия использует логистическую функцию для прогнозирования вероятности того, что наблюдение принадлежит к положительному классу. Вероятность, которая также является функцией линейной комбинации, такой как та, которая используется в линейной регрессии.

Название «Логистическая регрессия» имеет гораздо больше смысла!

Есть только одна деталь, которую модель должна принять во внимание, прежде чем она сможет классифицировать ваш день как продуктивный или нет.

Определение границы решения

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

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

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

Граница решения - это воображаемая граница, которая отделяет наблюдения из класса положительного от наблюдений из класса отрицательного.

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

Итак, если модель предсказывает вероятность наблюдения:

  • Меньше или равно 0,5, наблюдение относится к отрицательному классу, например, непродуктивный день.
  • Больше 0,5, наблюдение относится к положительному классу, например, продуктивный день.

Ваш день (действительно) продуктивен?

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

from sklearn.linear_model import LogisticRegression
def fit_logistic_regression(features, targets):
    train_features, test_features, train_targets, test_targets = train_test_split(features, targets, test_size=0.25, random_state=123)
    model = LogisticRegression(random_state=0)
    fitted_model = model.fit(train_features, train_targets)
    predictions = fitted_model.predict(test_features)
    print('---Logistic Regression')
    print('Coefficients: ' + str(fitted_model.coef_))
    print('Intercept: ' + str(fitted_model.intercept_))
    print('Mean accuracy: ' + str(fitted_model.score(train_features, np.array(train_targets).reshape(-1, 1))))
    
    plot_results(train_targets, predictions)

fit_logistic_regression(productivity_features, productivity_targets)

Однако, просто взглянув на график результатов модели, трудно сказать, хорошо ли работает модель.

Чтобы измерить производительность, вам нужно посмотреть на точность модели.

Точность 85% означает, что ваша модель правильно предсказала 85% тестовых наблюдений.

Теперь вам не нужно полагаться только на качественную самооценку, чтобы определить, действительно ли ваш день был продуктивным!

Вы разработали количественный и воспроизводимый способ классификации дневной продуктивности.

В процессе вы также лучше поняли, почему линейная регрессия не лучшая модель для задачи классификации, даже если взаимосвязь между функциями и целями является линейной.

Надеюсь, вам понравилось узнавать о логистической регрессии.

Спасибо за внимание!

использованная литература

[1] Stoltzfus JC. Логистическая регрессия: краткий учебник. Acad Emerg Med. 2011 Октябрь; 18 (10): 1099–104.

Изображения автора, если не указано иное.