"Начиная"

Понять логистическую регрессию

Введение на основе тематического исследования, которое проведет вас от интуиции до реализации с нуля

Table of Contents
· Purpose
· Why Should You Read On?
· Logistic Regression in the Big Picture
· Why Logistic Regression?
· The Case Study
· Logistic Regression Under the HoodThe Classification TaskThe Rationale for Using Multiple FeaturesData VisualizationThe Linear EquationThe Logistic FunctionThe Cost Function The OptimizationThe PredictionImplementation from Scratch
· Summary

Цель

Эта статья поможет вам понять логистическую регрессию на интуитивном уровне с помощью тематического исследования, вдохновленного реальным примером. Вы также сможете реализовать собственную версию логистической регрессии с нуля (при желании). Этот пост не предполагает никаких предварительных знаний о машинном обучении и проведет вас от основ (с упором на интуицию) до того, как помочь вам реализовать его самостоятельно на языке программирования по вашему выбору. Соответствующий код предоставляется (в моем репозитории GitHub), так что любой желающий может загрузить код и использовать этот пример, чтобы узнать, как реализовать логистическую регрессию, и действительно понять, что происходит внутри. Как только вы закончите читать эту статью, вы, надеюсь, начнете видеть и визуализировать математику, лежащую в основе использования логистической регрессии для задач классификации (почему вы называете ее регрессией, если она предназначена для помощи в классификации? Продолжайте читать), и будете достаточно уверены, чтобы применять ее. в вашей собственной работе.

Почему вам следует продолжить чтение?

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

Логистическая регрессия в общей картине

Давайте начнем с самого начала, с большой картины Data Science. Машинное обучение (ML) - это подмножество науки о данных, на пересечении компьютерных наук и математики, где сердце и душа области учатся на данных.

Более философский и несколько более подробный обзор можно найти в другой моей статье:



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

Почему логистическая регрессия?

Как я уже упоминал, в рамках машинного обучения наиболее распространенным типом обучения является обучение с учителем, а наиболее распространенная и хорошо известная проблема, решаемая в этой области, - это классификация (Кошка против собаки, Спам против ветчины, Больной против Здоровой и т. Д.). Вы можете задаться вопросом, почему из множества техник стоит потрудиться изучить логистическую регрессию. Есть две основные причины, по которым вам следует потратить свое время на изучение логистической регрессии, прежде чем идти дальше.

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

Во-вторых, и вы можете найти это удивительным, если вы новичок в этой области, это не обязательно тот случай, когда более продвинутые алгоритмы, такие как Support Vector Machines (SVM), всегда будут работать лучше, чем логистическая регрессия (LR ) в вашем наборе данных. Фактически, в некоторых приложениях LR работает достаточно хорошо, и никаких улучшений не достигается при использовании SVM или любого другого алгоритма. Суть в том, что, по всей вероятности, вы должны использовать LR в качестве алгоритма классификации, когда вы начинаете решать проблему, и ее важность для классификации невозможно переоценить. Поэтому неудивительно, что подавляющее большинство курсов по машинному обучению преподают LR на раннем этапе. Читая дальше, вы скоро поймете, что LR очень интуитивно понятен и прост в реализации.

Пример из практики

Вы можете узнать больше об этом в нашей статье, опубликованной в Journal of Medical Internet Research (JMIR, один из широко известных исследовательских журналов в области медицинской информатики).



Вкратце, хроническая обструктивная болезнь легких (ХОБЛ) - это хроническое заболевание, при котором у пациентов возникают необратимые повреждения легких, настолько сильные, что повседневная деятельность может вызвать у них одышку. От этой болезни нет лекарства, и люди с ХОБЛ остаются в таком состоянии на всю оставшуюся жизнь. Тем не менее, пациенты с ХОБЛ могут по-прежнему жить хорошо и достичь высокого качества жизни, если они могут самостоятельно управлять своим состоянием, отслеживая свои симптомы и быстро принимая лекарства, когда и когда это необходимо. Хотя симптомы ХОБЛ являются обычным явлением, необходимо незамедлительно контролировать стойкое ухудшение симптомов, прежде чем ситуация ухудшится до такой степени, что пациент попадет в больницу. Как пациенту определить, ухудшается ли его состояние? Один из подходов - использовать маленький датчик на пальце (называемый пульсоксиметром), который может измерять частоту сердечных сокращений, уровень кислорода в крови (называемый насыщением кислородом) и частоту дыхания. Наша задача - заблаговременно предупредить пациентов об ухудшении их состояния, используя только пульсоксиметр.

Заявление об ограничении ответственности: во-первых, набор данных (который вы можете найти на github) представляет собой смоделированные данные, а не фактические данные нашего исследования. Однако он был получен с использованием аналогичных средних значений, опубликованных в документе (и общедоступных). Во-вторых, в этом посте я свел задачу к двумерной задаче, сосредоточившись только на частоте сердечных сокращений и частоте дыхания, потому что легче визуализировать точки данных в двухмерном пространстве. Однако, как только вы поймете концепции в двух измерениях, вы можете легко масштабировать это до трех или более измерений, и основные принципы не изменятся.

Логистическая регрессия под капотом

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

Задача классификации

Перед нами стоит задача заблаговременно предупредить пациентов до того, как их состояние ухудшится, объединив две части информации: частоту сердечных сокращений и частоту дыхания. Мы хотели бы объединить эти два измерения наилучшим образом, чтобы определить, ухудшается ли состояние пациента. Для простоты мы будем называть такие ситуации «ненормальными». (в исходной статье они были названы «продромальными»). Периоды, когда состояние пациента стабильное и нет риска его ухудшения, будут называться нормальными. Таким образом, проблема, которая у нас есть сейчас, сводится к выяснению того, является ли пациент нормальным или ненормальным, на основе двух измерений: частоты сердечных сокращений (ЧСС) и частоты дыхания (ЧД).

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

Обоснование использования нескольких функций

Первый вопрос, который следует задать: зачем нам вообще нужны два разных измерения? Разве мы не можем просто использовать BR и HR и принять решение? Зачем усложнять себе жизнь использованием нескольких измерений? Если у вас есть ситуация, когда одно измерение приводит к идеальному разделению между нормальным и ненормальным, вам не нужно второе измерение. Графически это выглядело бы так:

На самом деле для этого даже не требуется машинное обучение. Вы можете просто нанести на график данные и визуально увидеть, что простое правило, разделяющее эти два случая, будет работать. Это простое правило в случае единичного измерения графически представляет собой вертикальную линию. На рисунке выше это соответствует ЧСС 78. Если ЧСС пациента выше 78, пациент будет считаться ненормальным, а если ЧСС пациента ниже 78, пациент будет считаться нормальным. Эта вертикальная линия, которую вы видите на рисунке, называется «границей решения». В случае, когда у вас есть одно измерение и такое четкое разделение, подойдет любая вертикальная линия, которая может идеально разделить их (граница принятия решения на 77, 78 или 79 будет одинаково идеальной). Однако реальные проблемы сложны (и являются проблемами), потому что такое разделение непросто и есть много совпадений. Поскольку перекрытие является значительным для одного измерения, мы, следовательно, проводим разные типы измерений для одного и того же пациента, которые, хотя и имеют много перекрытий, мы надеемся, что существует независимая информация, полученная из каждого измерения и путем объединения разных измерений. , мы надеемся найти лучшую границу принятия решения, которая может привести к меньшему количеству ошибок по сравнению с использованием только одного измерения. В качестве примера проверьте наличие совпадения в частоте дыхания, частоте сердечных сокращений и насыщении кислородом в тематическом исследовании (эти данные доступны в моем репозитории на github, если кто-то заинтересован в их использовании. Он моделируется с использованием того же распределения данных, которое может быть видели в исходной статье, упомянутой ранее в этом сообщении).

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

Визуализация данных

Как видите, существует перекрытие, и единый порог для HR или BR приведет к значительным ошибкам. Давайте нарисуем HR и BR на одном графике, чтобы вы могли визуализировать проблему.

Линейное уравнение

Если бы мы объединили HR и BR вместе, чтобы помочь нам найти «оптимальную» границу принятия решения, что было бы самым простым делом, которое мы могли бы сделать? Проще всего было бы линейно объединить частоту дыхания и частоту сердечных сокращений. Математически это было бы эквивалентно нахождению взвешенной суммы, как показано в уравнении ниже:

Графически это было бы эквивалентно нахождению прямой линии на двумерном графике. Таким образом, проблема сводится к поиску правильных значений A и B, которые могут соответствовать линии (границе решения), которая может помочь нам отделить нормальные случаи от аномальных.

Небольшое предостережение: если нам нужно свести эту проблему только к поиску A и B, тогда результирующая линия всегда будет проходить через начало координат. Чтобы снять это ограничение, мы можем добавить член «смещения», и поэтому результирующее уравнение станет следующим:

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

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

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

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

Разве не было бы удобно, если бы результат уравнения можно было преобразовать в вероятность?

Оказывается, есть способ принудительно ограничить выходной сигнал линейной комбинации частоты сердечных сокращений и частоты дыхания от 0 до 1 (что затем можно интерпретировать как вероятность). Для достижения этой цели все, что нам нужно сделать, это взять выходные данные линейной комбинации в качестве входных данных для новой функции, которая может принимать любое значение от -infinity до + infinity в качестве входных данных, а затем вывести значение от 0 до 1. Одна функция которая делает это и используется в «логистической» регрессии - это «логистическая» функция (эта функция также называется сигмоидной функцией).

Вы можете думать об этой процедуре как о создании пакета линейной комбинации функций и последующей передаче этого пакета логистической функции, которая преобразует выходные данные в значения от 0 до 1. Однако это преобразование не является случайным. Если вы внимательно посмотрите на логистическую функцию, вы заметите, что она выдает значение ›0,5 для любого положительного ввода и значение ‹ 0,5 для любого отрицательного ввода. Итак, все, что нам нужно сделать, это найти значения A, B, C (из уравнения, определенного ранее), чтобы линейное уравнение выводило очень большое отрицательное значение для случаев, когда действительное значение равно 0 ( чтобы следовать соглашению, мы присваиваем 0 нормальным случаям), и он выдает очень большое положительное значение, когда реальное значение равно 1 (1 соответствует случаям, когда пациент ненормален). Или, чтобы перефразировать это более простыми словами: нам нужно найти такие значения A, B, C, чтобы результат логистической функции был близок к фактическому значению.

Функция стоимости

Один из способов сделать это - определить функцию «стоимости». И эта функция затрат должна гарантировать, что она выводит большое значение, когда вывод логистической функции сильно отличается от фактического значения (скажем, реальное значение равно 1, а логистическая функция выводит очень маленькое значение, близкое к 0 или если реальное значение равно 0, а логистическая функция выводит большое значение, близкое к 1). И наоборот, эта функция стоимости должна выводить очень маленькое значение и, в идеале, 0, когда вывод соответствует фактическому значению. Если у нас есть такая функция стоимости, то все, что нам нужно сделать, это найти значения параметров A, B, C, которые приводят к наименьшей (минимальной) функции затрат.

Оптимизация

Процедура нахождения минимального значения функции стоимости называется «оптимизацией». Как мы собираемся это сделать? Мы можем использовать исчисление (точнее, алгоритм градиентного спуска, который помогает нам найти минимум функции). Хотя теоретически мы могли бы использовать несколько математических функций, которые могут иметь эту характеристику (высокая стоимость, когда разница большая, и низкая стоимость, когда разница низкая), мы также должны убедиться, что функция является «выпуклой». Это затем помогает нам использовать исчисление, чтобы легко находить значения параметров, при которых стоимость минимальна. Если у нас нет выпуклой функции, мы не обязательно найдем глобальный минимум, и это не будет оптимальным решением. К счастью, требование функции затрат для логистической регрессии уже хорошо изучено и проработано, и графически это выглядит следующим образом, когда фактический результат равен 1. Чтобы подкрепить концепцию, я пометил цифру. Функция стоимости зависит от прогнозируемого значения, и из рисунка мы можем видеть, что стоимость равна 0, когда есть полное соответствие между фактическим и прогнозируемым выходом, а стоимость постепенно увеличивается по мере разницы между прогнозируемым и фактическим значением. увеличивать.

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

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

Предсказание

Наконец, если нам нужно сделать прогноз для нового набора данных, все, что нам нужно сделать, это получить их HR и BR и использовать значения параметров, найденные (A, B и C) во время обучения, чтобы найти прогнозируемый результат y. Графически это было бы эквивалентно определению, на какой стороне границы принятия решения находится новая точка данных. Если она находится выше линии, пациента можно считать нормальным. Если он ниже линии, пациента можно считать ненормальным.

Реализация с нуля

Чтобы статья оставалась краткой, я поделюсь ключевыми моментами, как реализовать логистическую регрессию с нуля. Тем не менее, вы можете проверить мой репозиторий на github, чтобы получить доступ к коду, который создал цифры в этом посте (реализован в Matlab). Если есть интерес, я впоследствии также поделюсь кодом Python и R в репозитории. Ключевые шаги реализации:

(i) Получить данные в матричной форме

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

(iii) Добавьте член перехвата (смещения)

(iv) Инициализировать неизвестные параметры (в этом случае подойдут любые случайные числа)

(v) Определите функцию стоимости и запустите процедуру оптимизации (для этого вы найдете встроенные подпрограммы на любом языке программирования по вашему выбору)

(vi) Постройте границу решения

(vii) Делайте прогнозы

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

Резюме

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