Наивный байесовский алгоритм - это алгоритмы, которые необходимо знать в машинном обучении - Изучение: GaussianNB, КатегориальныйNB, BernoulliNB, MultinomialNB, ComplementNB | версия sklearn: 0.23.2

Оглавление

  1. Зачем использовать наивный байесовский классификатор
  2. Используемые данные
  3. Как работает наивный байесовский метод для непрерывных функций - GaussianNB
  4. Как работает наивный байесовский метод для категориальных функций - КатегориальныйNB
  5. Как наивный байесовский метод работает с двоичными функциями - BernoulliNB
  6. Как работает наивный байесовский метод для полиномиальных функций - MultinomialNB
  7. Как наивный байесовский метод работает с полиномиальными функциями - ComplementNB
  8. Заключение
  9. Ссылки

Зачем использовать наивный байесовский классификатор

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

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

Это очень быстро из-за расчетов, чтобы достичь вероятности решения для того или иного класса. Мы подробно рассмотрим разделы «Как…», но простыми словами, это получено из теоремы Байеса, чтобы получить вероятность для каждого класса. Тогда предсказанный класс - это тот, у которого самая высокая вероятность (максимум апостериори).

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

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

В некоторых отраслях невозможно использовать сложные и продвинутые алгоритмы машинного обучения из-за нормативных ограничений. Действительно, расчет / результаты / решение должны быть объяснимыми, и именно этим мы и займемся в этой статье. Sklearn предоставляет 5 типов наивных байесовских алгоритмов:
- GaussianNB
- КатегориальныйNB
- BernoulliNB
- MultinomialNB
- ComplementNB

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

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

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

Используемые данные

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

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

Набор данных поезда содержит 2.720 наблюдений, а тестовый набор - 1.340 наблюдений. Цель = 1 (купить более X долларов) для 50,3% поезда и 51% для теста, чтобы он был хорошо сбалансирован. Более того, в следующих примерах мы построим вероятности sklearn для этих двух наблюдений с именем two_obs_test.

Исходные функции - это X15, X16 и X18, но их необходимо кодировать по-разному с учетом выбранного алгоритма.

Как работает наивный байесовский метод для непрерывных функций - GaussianNB

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

Прежде всего, исчисление апостериорной вероятности Наивного Байеса определяется как:

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

Давайте рассчитаем апостериорную вероятность для «купить больше X $» и «купить меньше X $» для наблюдения 0 и 1 из two_obs_test с помощью переменных X15, X16 и X18.

В нашем примере числитель имеет следующий вид:

Оценка предшествующего [например, P (buymore $ X)] очень прост, потому что это целевая ставка:

Теперь цель состоит в том, чтобы оценить условные вероятности [например, p (X15 | buy more than $ X)] и воспользуемся уравнением нормального распределения:

Поэтому нам нужно вычислить для каждого класса среднее и дисперсию (в Википедии дисперсия оценивается по дисперсии с поправкой на Бесселя. Она имеет тенденцию к быть равным дисперсии, когда количество наблюдений увеличивается, потому что дисперсия умножается на n / (n-1), где n - количество наблюдений). NB: реализация Sklearn не выполняет эту исправленную по Бесселю дисперсию.

Вот оценка среднего и дисперсии для каждой переменной и для каждого класса. Здесь ddof (Delta Degree Of Freedom) = 0, потому что sklearn не реализует дисперсию с поправкой на Бесселя. Если вам нужна такая же реализация, как в Википедии, вам просто нужно заменить ddof = 0 на ddof = 1.

Мы получаем условные вероятности, заменяя эти предыдущие значения нормальным распределением на рисунке 7. Для наблюдения 0 two_obs_test (см. two_obs_test [continuous_list] .iloc [0, i] в коде, где i - позиция особенность) код условных вероятностей:

Теперь у нас есть все параметры, чтобы получить вероятность для двух классов + свидетельство, и мы можем вычислить апостериорные вероятности:

В результате апостериорные вероятности для «купить больше X долларов» (gssnPbuymore в приведенном выше коде) & «купить меньше X долларов» (gssnPbuyless в приведенном выше коде) для наблюдения 0 из two_obs_test составляют соответственно 0,9945371191553004 и 0,005462880844699651. Итак, учитывая, что мы берем argmax, 0,995 ›0,005 → gssnPbuymore› gssnPbuyless →, мы можем рассматривать наблюдение 0 как «купите больше X долларов», что является хорошим прогнозом. как мы видим на рисунке 4!

Если мы сделаем такое же вычисление для значений наблюдения 1 (см. Рисунок 4), мы получим соответственно для «купить больше, чем $ X» (gssnPbuymore) & «Купите меньше X долларов» (gssnPbuyless), значения 0,008104869133118996 и 0,9918951308668811. Итак, учитывая, что мы берем argmax, 0,008 ‹0,992 → gssnPbuymore‹ gssnPbuyless →, мы можем рассматривать наблюдение 1 как «купите меньше X долларов», что также является хорошим прогнозом, как мы видим на рисунке 4. !

Отлично, теперь давайте посмотрим, как получить точно такие же результаты с помощью трех строк кода с помощью scikit-learn:

Как наивный байесовский метод работает с категориальными функциями - КатегориальныйNB

В этой части мы шаг за шагом увидим, как выполняется оценка апостериорной вероятности, когда мы используем категориальный наивный байесовский метод. Чтобы правильно использовать алгоритм, вы должны дискретизировать ваши непрерывные функции, и существует несколько методов от самого простого до самого экзотического. Кроме того, категории должны быть закодированы числами от 0 до ni-1, где ni - количество доступных категорий для функции i. После такого преобразования набор данных выглядит так:

Формула для оценки условных вероятностей:

Где Ntic - это количество раз, когда категория t появляется в функции i в классе c. Nc - размер выборки для каждого класса c. ni - количество категорий в функции i. Тогда альфа является параметром сглаживания (сглаживание Лапласа, если 1, или Лидстоуна, если] 0; 1 [). Альфа позволяет не иметь проблем в исчислении, если у вас есть категория без наблюдения в классе. Лично я сохраняю альфа = 1, и настройка параметра может привести к очень незначительному улучшению.

Давайте рассчитаем апостериорную вероятность для «купить больше X долларов» и «купить меньше X долларов» для наблюдений 0 и 1 из two_obs_test с использованием переменных discret_X15, discret_X16 и discret_X18. Условную вероятность наблюдения 0 можно оценить с помощью следующего кода:

Позвольте мне пояснить, на рисунке 3 мы знаем, что значение наблюдения 0 для discret_X16 равно 3. Вот почему я выбрал для строк 5–6 количество значений, равное 3 для каждого класса, а +1 для альфа. Затем этот числитель делится на количество наблюдений в каждом классе + (альфа {= 1} умножается на количество категорий в discret_X16 {= 5}).

В результате для каждой условной вероятности имеем:

Теперь у нас есть все параметры, чтобы получить вероятность для двух классов + свидетельство, и мы можем вычислить апостериорные вероятности (примечание: априорные значения такие же, как на рисунке 6):

В результате апостериорные вероятности для «купить больше X долларов» (ctgrclPbuymore) и «купить меньше X долларов» ( ctgrclPbuyless) для наблюдения 0 из two_obs_test составляют соответственно 0,9886380451862543 и 0,01136195481374564. Итак, учитывая, что мы берем argmax, 0,989 ›0,011 → ctgrclPbuymore› ctgrclPbuyless → мы можем рассматривать наблюдение 0 как «купите больше, чем $ X», что является хорошим прогнозом, как мы видим на рисунке 4!

Если мы сделаем такое же вычисление для значений наблюдения 1 (см. Рисунок 4), мы получим соответственно для «купите больше, чем $ X» (ctgrclPbuymore) & «Купите меньше X долларов» (ctgrclPbuyless), значения 0,020992001868815332 и 0,9790079981311848. Итак, учитывая, что мы берем argmax, 0,021 ‹0,979 → ctgrclPbuymore‹ ctgrclPbuyless →, мы можем рассматривать наблюдение 1 как «купите меньше X долларов», что также является хорошим прогнозом, как мы видим на рисунке 4. !

Отлично, теперь давайте посмотрим, как получить точно такие же результаты с помощью трех строк кода с помощью scikit-learn:

Как наивный байесовский метод работает с двоичными функциями - BernoulliNB

В этой части мы шаг за шагом увидим, как выполняется оценка апостериорной вероятности, когда мы используем наивный байесовский метод Бернулли. Чтобы правильно использовать алгоритм, вы должны имитировать категориальные функции (например, с помощью pandas.get_dummies (drop_first = False)). В конце ваша база данных должна состоять только из 0–1.

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

Формула для оценки условных вероятностей:

Если вы хотите пойти дальше, исчисление хорошо объяснено в статье [1]

Давайте рассчитаем апостериорную вероятность для «купить больше X $» и «купить меньше X $» для наблюдения 0 и 1 из two_obs_test используя переменные discret_X15_…, discret_X16_… и discret_X18_…. Условную вероятность discret_X15_A можно оценить с помощью следующего кода:

Для условной вероятности, зная, что Y = 0, мы имеем в числителе количество наблюдений, следующих за условием, где discret_X15_A = 1 и Y = 0. Затем мы добавляем значение 1, представляющее сглаживание Лапласа. В качестве знаменателя мы подсчитываем количество наблюдений класса, которое составляет длину Y = 0, и у нас есть +2, потому что у нас есть два класса в цели. Если бы это была полиномиальная цель со значениями 0–1–2–3–4, то у нас было бы +5.

В результате для каждой условной вероятности имеем:

Теперь у нас есть все параметры, чтобы получить вероятность для двух классов + свидетельство, и мы можем вычислить апостериорные вероятности (примечание: априорные значения такие же, как на рисунке 6):

Мы видели на Рисунке 3. что наблюдение 0 имеет значение, равное 1 для discret_X15_B, discret_X16_D, discret_X18_D, а значение равно 0 для всех остальных discret_ особенности. Чтобы вычислить вероятность, мы сохраняем условную вероятность, когда значение равно 1, и умножаем их на 1-conditionalProbability, когда значение равно 0.

В результате апостериорные вероятности для «купить больше X $» (brnllPbuymore) и «купить меньше X $» (brnllPbuyless) для наблюдения 0 two_obs_test равны соответственно 0,99586305749289 и 0,0041369425071100955. Итак, учитывая, что мы берем argmax, 0,996 ›0,004 → brnllPbuymore› brnllPbuyless → мы можем рассматривать наблюдение 0 как «купите больше X $», что является хорошим прогнозом, как мы видим на рисунке 4!

Если мы сделаем такое же вычисление для значений наблюдения 1 (см. Рисунок 4), мы получим соответственно для «купить больше, чем $ X» (brnllPbuymore) и «купить меньше, чем $ X» (brnllPbuyless) значения 0,0075457709306252525 и 0,9924542290693747. Итак, учитывая, что мы берем argmax, 0,021 ‹0,979 → brnllPbuymore‹ brnllPbuyless →, мы можем рассматривать наблюдение 1 как «купите меньше X долларов», что также является хорошим прогнозом, как мы видим на рисунке 4. !

Отлично, теперь давайте посмотрим, как получить точно такие же результаты с помощью трех строк кода с помощью scikit-learn:

Как наивный байесовский метод работает для полиномиальных функций - MultinomialNB

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

Nyi представляет собой сумму значений для класса y и признака i + параметр Лапласа. В качестве знаменателя Ny представляет собой общую сумму всех значений в базе данных для класса y + alpha, которая должна быть умножена на n, которое представляет количество используемых функций (без цели).

Мы ясно видим что-то странное, если хотим применить эту формулу к нашей дискретной базе данных, подобной той, которая используется для категориальногоNB. Странная вещь исходит от Nyi & Ni, потому что они представляют собой сумму значений, а не длину. Это означает, что то, как мы даем значение категории (например, 0–1–2-… или 1–3–5-…), будет влиять как на суммы в числителе, так и в знаменателе, что повлияет на общий расчет и сделать его неоптимальным. В результате полиномиальный наивный байесовский метод широко используется для классификации текста, когда у нас есть счетные данные, такие как мешок слов или TFIDF. В нашем случае и с нашим типом данных было бы разумнее одним горячим кодированием наших дискретизированных данных, а затем применить полиномиальный наивный байесовский метод. Предупреждение о спойлере: как мы увидим чуть позже, выполнение полиномиального наивного байесовского метода для одних горячо закодированных данных дает те же результаты, что и категориальный наивный байесовский метод.

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

Первая строка направлена ​​на получение условной вероятности discret_X15 для класса 0. Слияние и сумма позволяют получить сумму всех значений discret_X15, которые находятся в классе 0, а +1 - это альфа. В качестве знаменателя слияние, за которым следует сумма суммы, позволяет получить сумму всех элементов в базе данных для класса 0; +3 (на самом деле + 3 * альфа) представляет 3 функции, которые мы используем (discret_X15, discret_X16 и discret_X18). Результатами каждой условной вероятности являются:

Теперь у нас есть все параметры, чтобы получить вероятность для двух классов + свидетельство, и мы можем вычислить апостериорные вероятности (NB: априорные значения такие же, как на рисунке 6):

Мы видели на Рисунке 3. что наблюдение 0 имеет значение 1 для discret_X15, значение 3 для discret_X16 и значение 3 для discret_X18. В самом деле, именно поэтому у нас есть вероятность, равная условной вероятности discret_X15 к первому, умноженной на условную вероятность в кубе discret_X16, умноженную на условную вероятность в кубе discret_X18.

В результате апостериорная вероятность для «купить больше X долларов» (mltnmPbuymore) & «купить меньше X долларов» (mltnmPbuyless) для наблюдения 0 two_obs_test равны соответственно 0,9208203346956907 и 0,0791796653043093. Следовательно, учитывая, что мы берем argmax, 0,921 ›0,079 → mltnmPbuymore› mltnmPbuyless → мы можем рассматривать наблюдение 0 как «купите больше X $», что является хорошим прогнозом, как мы видим на рисунке 4!

Если мы сделаем то же самое для значений наблюдения 1 (см. Рисунок 4), мы получим соответственно для «купить больше, чем X долларов» (mltnmPbuymore) и «купить меньше, чем X долларов». (mltnmPbuyless) значения 0,14128331134420608 и 0,8587166886557939. Итак, учитывая, что мы берем argmax, 0,141 ‹0,859 → mltnmPbuymore‹ mltnmPbuyless →, мы можем рассматривать наблюдение 1 как «купите меньше X долларов», что также является хорошим прогнозом, как мы видим на рисунке 4. !

Отлично, теперь давайте посмотрим, как получить точно такие же результаты с помощью трех строк кода с помощью scikit-learn:

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

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

Как наивный байесовский метод работает для полиномиальных функций - ComplementNB

Дополнение Наивный Байес [2] - последний алгоритм, реализованный в scikit-learn. Он очень похож на полиномиальный наивный байесовский алгоритм из-за параметров, но кажется более эффективным в случае несбалансированного набора данных. Как и полиномиальный наивный байесовский метод, комплементарный наивный байесовский метод хорошо подходит для классификации текста, где у нас есть данные подсчета, TFIDF,… Как и в предыдущей части, мы шаг за шагом увидим, как оценивается апостериорные вероятности получаются, когда мы используем наивный байесовский метод дополнения. Чтобы правильно использовать алгоритм, вам необходимо преобразовать вашу базу данных, как вы это делали для MultinomialNB. Оценка условных вероятностей получается с помощью следующего исчисления:

Где Nc̃i представляет собой сумму значений для других классов c в признаке i + параметр Лапласа. В качестве знаменателя Nc̃ представляет собой общую сумму всех значений в базе данных для других классов c + alpha, которая представляет количество используемых функций (без цели). Чтобы проиллюстрировать, что означают «другие классы», представьте (в бинарной классификации), что вам нужна условная вероятность признака, зная класс 0, чтобы вы суммировали значения, когда цель = 1. В результате условные вероятности являются «противоположностью» полиномиальной наивной байесовской теории в случае бинарной классификации. В статье авторы рекомендуют нормализовать условные вероятности, поскольку предположение о независимости повлияет на окончательные результаты, особенно при классификации текста. Sklearn реализует нормализацию с параметром True / False.

Код показывает, что исчисление «то же самое», что и полиномиальное наивное байесовское исчисление, и на этот раз я умножил условные вероятности на -np.log, чтобы предоставить другой способ получить окончательные апостериорные вероятности. :

NB: Если вы установите параметр нормализации как True в sklearn (norm = True), значение условных вероятностей будет:

Когда у нас есть условные вероятности, я объединяю их в матрицу (2D-массив):

В результате апостериорные вероятности для «купить больше X долларов» (cmplmntPbuymore) и «купить меньше X долларов» (cmplmntPbuyless) для наблюдения 0 из two_obs_test равны соответственно 0,9200665225520197 и 0,07993347744798047. Следовательно, учитывая, что мы берем argmax, 0,920 ›0,080 → cmplmntPbuymore› cmplmntPbuyless → мы можем рассматривать наблюдение 0 как «купите больше, чем $ X», что является хорошим прогнозом, как мы видим на рисунке 4!

Если мы сделаем такое же вычисление для значений наблюдения 1 (см. Рисунок 4), мы получим соответственно для «купить больше, чем $ X» (cmplmntPbuymore) и «купить меньше, чем $ X» (cmplmntPbuyless) значения 0,14003899976530304 и 0,8599610002346968. Итак, учитывая, что мы берем argmax, 0,140 ‹0,960 → cmplmntPbuymore‹ cmplmntPbuyless →, мы можем рассматривать наблюдение 1 как «купите меньше X долларов», что также является хорошим прогнозом, как мы видим на рисунке 4. !

Отлично, теперь давайте посмотрим, как получить точно такие же результаты с помощью трех строк кода с помощью scikit-learn:

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

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

Заключение

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

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

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

[1]: Эндрю МакКаллум, Камаль Нигам (1998). Сравнение моделей событий для классификации наивного байесовского текста.

[2]: Ренни, Дж. Д., Ши, Л., Тиван, Дж., И Каргер, Д. Р. (2003). Борьба с ошибочными предположениями наивных байесовских классификаторов текста. В ICML (том 3, стр. 616–623).