Обработка данных: логистическая регрессия на языке Python

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

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

Прежде всего – для кого предназначена эта статья ?

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

Что это значит? Представьте себе обычного программиста. Представьте, что вы – парень, плохо знающий математику, но не особо беспокоящийся об этом, ведь и так всё нормально. Вы просто хотите использовать модель машинного обучения и всё. Тогда эта статья  не для вас. Если в этом описании вы узнали себя, у нас есть предложение получше. Просто почитайте справочники по языку Python, и вы узнаете не только о логистической регрессии, но и о древах решений, методе случайного леса, методе k ближайших соседей, методе опорных векторов, AdaBoost и множестве других алгоритмов – и все это на одном интерфейсе, так что если вам понадобится перейти от одной модели к другой, достаточно будет переписать одну или несколько строк кода. Если это действительно то, что вам нужно, вам не нужны никакие занятия. Вам достаточно знать программирование в объёме, позволяющем использовать интерфейс, да читать и понимать документацию.

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

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

Итак, рассмотрим цикл образовательных статей по теме обработка данных с помощью логистической регрессии:

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

Обзор проблемы классификации логистической регрессии

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

Обработка данных: логистическая регрессия на языке Python

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

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

Обработка данных: логистическая регрессия на языке Python

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

Обработка данных: логистическая регрессия на языке Python

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

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

Введение в проект электронной коммерции

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

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

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

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

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

Очень важно уметь использовать реальные данные, которые могут быть в форме таблиц Excel, SQL-таблиц или просто log-файлами. Кроме того, важно уметь отформатировать их таким образом, чтобы они были пригодны для использования в вашем алгоритме глубокого обучения. Если вы не привыкли к таким вещам, этот проект определённо поможет вам.

Итак, перейдём к постановке задачи.

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

Первым идёт столбец Is_mobile. Этот столбец показывает, заходит ли пользователь на наш сайт с мобильного устройства или нет. Конечно же, он двоичный и принимает значения нуль, если пользователь заходит с мобильного устройства, и единица – если с мобильного.

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

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

Следующим столбцом идёт Is_returning_visitor. Это ещё одна двоичная переменная, принимающая значение нуль, если это новый посетитель, и единица, если пользователь уже бывал на сайте и возвращается.

Очередной столбец Time_of_day. Время – число, но мы его будем обрабатывать в качестве категории. В общем случае время обозначается числами по-разному, поскольку оно идёт по кругу. К примеру, 11 часов вечера наступают через 23 часа после предыдущей полуночи, но они же означают, что это час до следующей полуночи. Когда мы работаем с геометрическими понятиями, как в машинном обучении, это важно.

Есть простой способ обработки таких данных – разбить их по категориям. Так, мы используем значение 0 для обозначения времени от полуночи до 6 утра, значение 1 для времени от 6 утра до полудня, значение 2 для обозначения времени от полудня до 6 вечера, и значение 3 для обозначения времени от 6 вечера до полуночи.

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

Последний столбец User_action является меткой. Она принимает четыре значения – bounce, add_to_cart, begin_checkout и finish_checkout. Bounce означает, что пользователь просто покинул сайт, add_to_cart означает, что он добавил товар в корзину, но не начал оплату, begin_checkout означает ситуацию, когда пользователь уже начал процесс оплаты, но так его и не завершил, finish_checkout означает, что пользователь оплатил товар, а вы успешно получили заказ.

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

Это значит, что в данном случае мы отбросим два последних класса меток и будем учиться прогнозировать только данные с метками bounce и add_to_cart. Конечно же, вы можете читать сразу дальше или создать множественные двоичные классификаторы. Я всегда это только приветствую. Практика – это хорошо.

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

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

Обработка данных: логистическая регрессия на языке Python

Например, у нас есть четыре категории для времени: 0, 1, 2 и 3. Это значит, что у нас есть четыре столбца. Если значение категории равно 3, то пишем единицу в четвёртом столбце. Если значение категории равно 2, пишем единицу в третьем столбце и так далее. Естественно, что в любом наблюдении единица будет находиться лишь в одном из этих четырёх столбцов. Так что для показателя времени мы используем прямое кодирование.

А что с Is_mobile и Visit_duration? Разве это не такие же категории? Да, категории, и технически мы можем преобразовать их в два столбца, но это совершенно необязательно. Не забывайте, что каждый весовой коэффициент показывает нам эффект действия переменной. Если у нас есть столбец с нулевым значением переменной, то весовой коэффициент этой размерности указывает на влияние нулевого значения этой переменной. Если же у нас нет такого столбца, то мы просто вводим эффект нулевого значения переменной в член смещения.

И наконец, давайте поговорим о числовых столбцах – N_products_viewed и Visit_duration. Мы знаем, что в обоих столбцах числа должны быть равны нулю или больше. По сути, N_products_viewed имеет значения целых чисел, что значит, что технически мы можем обрабатывать его как категорию. Но это больше похоже на число на числовой шкале, имеющее собственное значение. Мы знаем, что 0 ближе к 1, чем 2, что имеет смысл. Мы можем ожидать, что 1,5 будет иметь значение между 1 и 2. Например, если все пользователи, которые просмотрели три и меньше товаров, не преобразуются, а все пользователи, просмотревшие более трёх товаров, преобразуются, то пользователь, просмотревший 2,5 или 0,1 товара, также не преобразуются. Пользуясь вышеприведенным правилом, пользователь, просмотревший 0,5 товара, внезапно преобразуется, потому что 0,5 – это особое значение величины. Поэтому очень важны масштаб и величина.

Одним из простейших способов обработки чисел – сначала их нормализовать. Это значит вычесть среднее значение и поделить на стандартное отклонение:

Z = \frac{X - \mu}{\sigma}.

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

σ(10) ≈ σ(11) ≈ σ(12).

Это не очень хорошо, поэтому лучше сначала нормализовать данные.

Какие задачи решается с помощью логистической регрессии в коммерческих проектах в  обработке данных ?

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

Сначала мы разберём прогнозирование, иначе говоря – как получить от модели значение исходящих данных. Поэтому как только мы изучим теорические основы этого, мы вернёмся к нашему проекту интернет-магазина, создадим модель и попробуем получить от неё прогноз.

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

Линейная классификация в логистической регрессии

В этом разделе мы поговорим о линейной классификации в целом. Итак, давайте рассмотрим простейший случай линейной классификации – двумерную классификацию:

Обработка данных: логистическая регрессия на языке Python

Пусть у нас есть группа точек Х слева и группа точек О справа, и мы хотим разделить их. Разделить их, конечно же, мы можем с помощью прямой. Уравнением прямой, как мы помним из школьного курса, является

y = mx + b,

где m характеризует наклон прямой, b – точку пересечения с осью y.

Но не забывайте, что в общем случае уравнение прямой записывается в виде

ax + by +c = 0,

который, конечно, легко преобразовывается в вид y = mx + b. Легко видеть, что если наши Х и О разделены прямой с наклоном в 45 градусов и точкой пересечения с осью y в нуле, то в этом случае a = 1, b = -1, c = 0 или, другими словами, наше уравнение прямой принимает вид

x – y = 0.

Пусть у нас есть появилась точка с координатами x = 2, y = 1.

Обработка данных: логистическая регрессия на языке Python

Подставим эти значения в полученное нами уравнение

h(x,y) = x – y,

получим, что

h(2,1) = 1 > 0.

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

Пусть теперь у нас появилась новая точка с координатами x = 1, y = 2, и вновь надо определить, принадлежит ли она группе Х или группе О.

Обработка данных: логистическая регрессия на языке Python

Вновь подставляем значения x и y в наше выражение для h:

h(x,y) = x – y,

получаем

h(1,2) = -1 < 0,

следовательно, мы определяем эту точку как принадлежащую группе Х.

Предположим теперь, что у нас появилась точка с координатами x = 1, y = 1.

Обработка данных: логистическая регрессия на языке Python

Получим:

h(x,y) = x – y,

h(1,1) = 0,

Эта точка лежит прямо на прямой, и мы не можем определить, принадлежит ли она группе Х или группе О.

В этом и состоит суть линейной классификации – нам даны все Х и О, и задача состоит в нахождении коэффициентов a, b и c, определяющих нужную нам прямую.

Переформулируем теперь задачу в терминах машинного обучения. 

 

Мы, как правило, обозначаем х через х1, а y через x2 и рассматриваем их просто как большой вектор x:

(x,y) = (х1, x2) = x.

Коэффициенты прямой a, b и c мы обозначаем через wi, причём коэффициент определяющий точку пересечения с осью y, он же член смещения, обозначается w0. Мы также обычно создаём фиктивную переменную x0, значение которой всегда устанавливаем равной единице. Тогда нашу гипотетическую функцию h мы можем переписать в терминах векторов x и w:

h(x) = w0 + w1x1 + w2x2.

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

h(x) = wTx,

что является скалярным произведением векторов w и x.

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

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

До скорой встречи!

Понравилась статья? Поделить с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: