Логистическая регрессия традиционно использовалась в качестве линейного классификатора, то есть когда классы могут быть разделены в пространстве признаков линейными границами. Однако это можно исправить, если мы получим лучшее представление о форме границы принятия решения…
Логистическая регрессия известна и используется как линейный классификатор. Он используется для создания гипер плоскости в пространстве признаков, чтобы отделить наблюдения, принадлежащие к классу, от всех других наблюдений, которые не принадлежат этому классу. Таким образом, граница принятия решения является линейной. Легко доступны надежные и эффективные реализации (например, scikit-learn) для использования логистической регрессии в качестве линейного классификатора.
Хотя логистическая регрессия делает основные предположения о наблюдениях, таких как IID (каждое наблюдение не зависит от других, и все они имеют одинаковое распределение вероятностей), использование линейной границы решения не является одним из них. Линейная граница принятия решения используется для простоты после мантры Дзэн - в случае сомнений упрощайте. В тех случаях, когда мы подозреваем, что граница принятия решения является нелинейной, может иметь смысл сформулировать логистическую регрессию с помощью нелинейной модели и оценить, насколько лучше мы можем сделать это. Вот о чем этот пост. Вот схема. Здесь мы рассмотрим некоторые фрагменты кода, но полный код для воспроизведения результатов можно скачать с github.
- Кратко рассмотрите формулировку функции правдоподобия и ее максимизацию. Чтобы держать алгебру в узде, мы придерживаемся двух классов в двухмерном пространстве функций. Точка [x, y] в пространстве признаков может принадлежать только одному из классов, а функция f (x, y; c) = 0 определяет границу решения, как показано на рисунке 1 ниже.
- Рассмотрим границу решения, которая может быть выражена как полином от переменных характеристик, но линейна по весам / коэффициентам. Этот случай можно смоделировать в (линейной) структуре с использованием API из scikit-learn.
- Рассмотрим общую нелинейную границу решения, которая не может быть выражена в виде полинома. Здесь мы сами должны найти параметры модели, которые максимизируют функцию правдоподобия. В модуле scipy.optimize есть отличный API, который нам здесь помогает.
1. Логистическая регрессия
Логистическая регрессия - это упражнение в прогнозировании (можно сказать, регрессии) дискретных результатов из непрерывного и / или категориального набора наблюдений. Каждое наблюдение является независимым, и вероятность p того, что наблюдение принадлежит классу, является некоторой (и такой же!) Функцией характеристик, описывающих это наблюдение. Рассмотрим набор из n наблюдений [x_i, y_i; Z_i], где x_i, y_i - значения признаков для i-го наблюдения. Z_i равно 1, если ith наблюдение принадлежит классу, и равно 0 в противном случае. Вероятность получения n таких наблюдений - это просто произведение вероятности p (x_i, y_i) получения каждого из них по отдельности.
Отношение p / (1-p) (известное как отношение шансов) будет равно единице вдоль границы принятия решения как p = 1-p = 0,5. Если мы определим функцию f (x, y; c) как:
тогда f (x, y; c) = 0 будет границей решения. c - параметры m в функции f. И логарифмическая вероятность с точки зрения f будет:
Все, что осталось сделать сейчас, это найти набор значений для параметров c, которые максимизируют log (L) в уравнении 3. Мы можем либо применить метод оптимизации. или решите связанный набор m нелинейных уравнений d log (L) / dc = 0 для c.
В любом случае наличие c в руке завершает определение f и позволяет нам узнать класс любой точки в пространстве функций. Это логистическая регрессия в ореховой скорлупе.
2. Функция f (x, y; c)
Будет ли какая-либо функция для f работать в уравнении 2? Конечно, нет. Поскольку p изменяется от 0 до 1, log (p / (1-p)) изменяется от -inf до + inf . Итак, нам нужно, чтобы f был неограниченным в обоих направлениях. Возможности для f безграничны, если мы убедимся, что f имеет диапазон от -inf до + inf em. >.
2.1 Линейная форма для f (x, y; c)
Выбор линейной формы, такой как
будет работать наверняка, и это приведет к традиционной логистической регрессии, доступной для использования в scikit-learn, и поэтому логистическая регрессия известна как линейный классификатор.
2.2 Полином высшего порядка для f (x, y; c)
Простое расширение уравнения 5 состояло бы в использовании полинома более высокой степени. Второй порядок будет просто:
Обратите внимание, что приведенная выше формулировка идентична линейному случаю, если мы рассматриваем x², xy и y² как три дополнительных независимых элемента проблемы. . Стимулом для этого будет то, что мы сможем напрямую применить API из scikit-learn, чтобы получить оценку для c. Однако в разделе результатов мы видим, что c, полученный таким образом, не так хорош, как прямое решение уравнения 4 для c. Это немного загадка, почему. Но в любом случае решить уравнение 4 достаточно просто с модулями от scipy. Производные, которые нам нужны для уравнения 4, выпадают просто как
2.3 Другие общие формы для f (x, y; C)
Периодическая форма типа f (x, y; c) = sin (c_0x + c_2y) = 0 не будет работать, поскольку ее диапазон ограничен. Но следующее будет.
Мы снова можем оценить производные и найти корни уравнения 4, но иногда проще напрямую максимизировать log (L) в уравнении 3, и это то, что мы будем делать в последующих моделированиях. .
3. Моделирование
Мы генерируем равное количество точек в пространстве признаков x, y, которые принадлежат классу (Z = 0, когда f (x, y; c) › small_value) и те, которые не принадлежат (Z = 1 при f (x, y; c) ‹small_value), поскольку мы знаем явную функциональную форму f (x, y; c)..
Данные разделены на соотношение 80/20 для поезда и теста. Мы используем API из scikit-learn для линейного случая, с которым хотим сравнить.
Мы используем модуль scipy.optimize, когда решаем уравнения в 4 для c или для максимизации правдоподобия в уравнении 3. LL и dLLbydc в приведенном ниже фрагменте кода просто реализуются уравнения 3 и 4 соответственно. Scipy процедуры предназначены для минимизации, поэтому мы отменяем знак в каждом случае, поскольку мы хотим максимизировать вероятность.
Наконец, мы решаем для c, начиная с небольшого начального предположения, близкого к 0.
4. Результаты
Мы рассмотрим полином и другой общий случай отдельно.
4.1 f(x,y; c) = c_0 + c_1 x + c_2 y + c_3 x² + c_4 x y + c_5 y²
Мы получаем эллипс в качестве границы решения для следующих значений c
Мы генерируем 1000 точек данных для каждого класса на основе вышеуказанной функции и применяем логистическую регрессию к этим данным, чтобы увидеть, что он предсказывает для границы решения.
pipenv run python ./polynomial.py 1000 2.25 -3.0 -18.0 35.0 -64.0 50.0
На рисунке 2 ниже показано распределение данных и границы принятия решений, полученные с помощью различных подходов. Контур, обведенный зелеными треугольниками, идеально разделяет данные, т.е. получает оценку F1, равную 1. Он получается путем решения уравнения 4 для c. Красная линия получена с помощью традиционного подхода логистической регрессии - явно прямая линия. Он пытается сделать все, что в его силах, учитывая нелинейность, и получает оценку F1 хорошо 0,5 ... Интересен контур, очерченный синими треугольниками. Он получается путем применения традиционной логистической регрессии к расширенному пространству признаков. То есть «x²», «x * y» и «y²» рассматриваются как три дополнительных функции, тем самым линеаризуя f для использования с scikit-learn. Он получил оценку F1 0,89, что неплохо. Но не совсем понятно, почему это должно быть хуже, чем решение dlog (LL) / dc = 0.
Фактические значения коэффициентов показаны в таблице 1 ниже. c_0 масштабируется до единицы, чтобы мы могли сравнивать. Очевидно, коэффициенты, полученные при решении dlog (LL) / dc = 0, наиболее близки к фактическим значениям, используемым при генерации данных.
4.2 f (x, y; c) = c_0 + c_1 sin (c_2 x²) + c_3 y = 0
На рисунке 3 показано распределение данных и предсказанные границы после запуска моделирования с
pipenv run python ./generic.py 1000 1.0 -1.0 1.0 -1.0
Прямая линия традиционной логистической регрессии дает оценку F1, равную 0,675, тогда как прямая минимизация журнала (LL) дает идеальную оценку.
В таблице 2 ниже сравниваются значения коэффициентов, полученных при моделировании. Интересно отметить, что знаки c_1 и c_2 противоположны между фактическим и предсказанным путем минимизации. Это нормально, потому что sin (-k) = -sin (k).
5. Выводы
Логистическая регрессия традиционно использовалась для создания гиперплоскости, разделяющей пространство функций на классы. Но если мы подозреваем, что граница решения является нелинейной, мы можем получить лучшие результаты, попробовав некоторые нелинейные функциональные формы для функции logit. Решение для параметров модели может быть более сложным, но модули оптимизации в scipy могут помочь.
Первоначально опубликовано на xplordat.com 13 марта 2019 г.