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

Введение

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

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

Это связано с тем, что выбросы могут сильно повлиять на линию регрессии. Возьмем пример. На приведенном ниже изображении без выбросов линия регрессии вполне приемлема. Если мы возьмем пороговое значение, такое как y = 0,5, и если мы получим значение y ≥0,5, тогда он будет классифицирован в группе «Злокачественные», иначе он будет классифицирован как «Доброкачественный».

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

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

Как работает логистическая регрессия?

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

где z = θᵀx.

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

Итак, гипотеза логистической регрессии (hθ (x)) равна σ (z), которая дает вероятность принадлежности нашей точки данных к определенному классу.

После вычисления вероятности из σ (z) мы используем пороговое значение (обычно = 0,5), чтобы в конечном итоге предсказать, где находится наша точка данных. Таким образом, для σ (z) ≥ 0,5 точка данных принадлежит классу y = 1. В противном случае он принадлежит y = 0.

Отсюда также следует, что σ (z) ≥ 0,5 = ›z (= θᵀx) ≥ 0 и аналогично σ (z)‹ 0,5, если z ‹0.

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

Стоимость = -y * log (hθ (x)) - (1-y) * log (1-hθ (x))

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

Для каждой правильной классификационной стоимости = 0, в то время как для неправильных она штрафует стоимостью стремится к ∞. Это происходит, поскольку для y = 1 и hθ (x) очень близко к 0, тогда log (0) - ›∞. Аналогично, для y = 0 и hθ (x), очень близкого к 1, тогда log (1-hθ (x)) ≈log (0) - ›∞.

Применение градиентного спуска

  • Частичное дифференцирование функции стоимости относительно t θ приведет к

∂ (стоимость) / ∂θ = [hθ (x) -y] * x

  • Обновите θ для всех функций из 1≤j≤n (α - скорость обучения), пока мы не достигнем сходимости:

Внедрение набора данных по раку груди

Вы можете найти набор данных здесь.

  • Импортируйте библиотеки numpy, matplotlib.pyplot, pandas.
  • Преобразуйте фрейм данных в массив numpy. Я сделал это, чтобы перетасовать строки набора данных с помощью np.random.shuffle (набор данных).
  • Я разделил свой набор данных в соотношении 75: 25 для поездов и тестов. Только после разделения мы должны нормализовать наши данные. Это связано с тем, что, если мы найдем минимальные и максимальные значения всего набора данных и будем использовать их для нормализации набора данных, мы можем передать некоторые тестовые данные в данные нашего поезда, когда мы их разделим. Кроме того, не забудьте использовать одно и то же минимальное и максимальное значение обучающих данных для нормализации данных тестирования.

  • Я объединяю столбец единиц (в качестве первого столбца) с нашим набором для обучения и тестирования для значения точки пересечения в линейном уравнении y = θ₁ + θ₂ * x +… + θₙ * x.

  • Функция градиентного спуска приведена ниже.

альфа и эпоха - это скорость обучения и количество итераций соответственно.

r и c хранят количество строк и столбцов для набора данных X соответственно.

theta (или вектор параметров) инициализируется единицами и имеет форму (c, 1).

Я инициализировал min_cost пустым списком, а min_theta значением None. Эти переменные хранят минимально возможную стоимость во время итераций, а min_theta хранит параметры, соответствующие минимальной стоимости.

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

  • градиент или частная производная находится путем нахождения скалярного произведения между транспонированием набора данных (X) и (h-y), где h - гипотеза, а y - переменная ответа (для нашего набора данных это «диагноз»). Затем скалярное произведение делится на количество строк.
  • Затем мы обновляем каждую тэту, вычитая альфа * градиент.
  • Я нахожу значение функции стоимости на каждой итерации для сравнения и нахожу тета, имеющую минимальную стоимость, используя функцию ниже:

Чтобы предсказать значения в нашем тестовом наборе:

Сначала найдите гипотезу, используя тета, найденную с помощью набора обучающих данных и набора тестовых данных. Это даст вам вероятность для каждой строки в наших данных тестирования. Затем для каждой строки проверьте, больше ли оно или равно нашему пороговому значению (т.е. 0,5). Если это так, то прогнозируемое значение равно 1, иначе это 0.

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

Итак, на этом блог завершен. Надеюсь, вы что-то узнали из этого.

Спасибо, что нашли немного свободного времени, чтобы прочитать этот блог. Удачного дня 😄 !!!