Классификация продуктов питания с помощью наивного Байеса

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

Для построения алгоритма мы выполним три основных шага.

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

Секретные данные человека

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

Оценка вероятностей

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

Теорема говорит нам, что вероятность A при данном B равна вероятности B при заданном A, умноженной на вероятность A, деленную на вероятность B.

Для нашего нового блюда первая вероятность, которую нам нужно обнаружить, — это вероятность вегетарианства при данном новом блюде (курица, картофель, горох, капуста).

Разберем каждую часть.

  1. P(Vegetarian|«cкурица, картошка, горох, капуста») — вот что нам нужно решить. Синтаксис читается как «Вероятность вегетарианца при условии « курицы, картофеля, гороха, капусты». Думайте об этом как о вопросе: «Какова вероятность того, что наше блюдо будет вегетарианским, если мы знаем, что в нем есть курица, картофель, горох и капуста?».
  2. P («курица, картофель, горох, капуста» | Вегетарианец) — синтаксис для этого гласит: «Вероятность «курица, картофель, горох, капуста» для вегетарианца. Мы будем использовать наши человеческие секретные данные, чтобы найти эту вероятность. Для всех блюд, уже классифицированных как вегетарианские, нам нужно подсчитать, сколько раз эти элементы встречаются. Затем мы находим их вероятность на основе общего количества предметов, уже классифицированных как вегетарианские. Нахождение этой вероятности заставило нас предположить, что все эти элементы независимы. Вот что делает его наивным. Мы рассмотрим это ниже.
  3. P (вегетарианец) — синтаксис для этого гласит: «Вероятность вегетарианца. Чтобы определить это, нам нужно будет подсчитать, сколько блюд из нашего обучающего набора являются вегетарианскими, и разделить его на общее количество блюд.
  4. P («курица, картофель, горох, капуста») — синтаксис для этого гласит: «Вероятность курицы, картофеля, гороха, капусты». Это похоже на шаг 2, но вместо того, чтобы подсчитывать, сколько раз эти элементы встречаются только в вегетарианских блюдах, нам нужно подсчитать, сколько раз эти слова встречаются в обоих блюдах, и рассчитать вероятность на основе элементов во всех блюдах. Этот шаг будет исключен с использованием концепции пропорциональной вероятности и будет обсуждаться ниже.

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

Сначала простой пример

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

Какова вероятность того, что выпадет число 2, если оно четное?

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

  1. P(even|2) — Какова вероятность того, что число будет четным, учитывая, что число равно 2? Поскольку 2 всегда будет четным, вероятность равна 1. P(even|2) = 1

2. P(2) — Какова вероятность того, что выпадет 2? Поскольку у нас есть шесть возможных исходов на кубике, но только одно число даст нам желаемый результат{2}, эта вероятность равна 1/6.P(2) = 1/6

3. P(четное) — какова вероятность того, что выпадет четное число? Из набора шести чисел {1,2,3,4,5,6} три из этих чисел четные. P(четное) = 3/6 = 1/2

Давайте подставим эти числа и получим окончательную вероятность.

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

Когда мы знаем, что число четное, у нас есть только 3 возможных результата{2,4,6}, и только один из этих результатов является нашим желаемым результатом{2}. Еще раз, это вероятность 1/3.

Теперь вернемся к нахождению наших вероятностей.

Назад к оценке вероятностей

Делаем теорему наивной

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

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

Отбросив знаменатель P(B)

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

Например, если мы посмотрим на две дроби, 5/6 и 2/6. Мы знаем, что 5/6 › 2/6. Если мы опустим знаменатель для обоих, сравнение останется верным как 5 > 2.

Мы опустим знаменатель P(B) для обоих наших уравнений. Это приведет к пропорционально эквивалентной вероятности.

Приступаем к решению!

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

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

Нахождение вероятности вегетарианца по данному блюду

Сначала найдем P(Vegetarian|"cкурица, картошка, горох, капуста").

Теперь давайте будем наивными и сначала решим P(«cкурица, картофель, горох, капуста» | Вегетарианец).

1. Рассчитаем P(курица|Вегетарианская). Если мы подсчитаем, сколько раз курица появляется в вегетарианских блюдах, получится 0. Общее количество вегетарианских блюд равно 14. P("chicken| Vegetarian") = 0/14

2. Повторение того же процесса для P(картофель|Вегетарианство), P(горох|Вегетарианство) и P(капуста|Вегетарианство) даст нам P(картофель|Вегетарианство) = 1/14, >P(горох|Вегетарианство) = 1/14 и P(капуста|Вегетарианство) = 1/14

3. Теперь умножаем их все вместе 0/14 * 1/14 * 1/14 * 1/14= 0. P("cкурица, картошка, горох, капуста" | Вегетарианская "") = 0

Наша вероятность равна нулю. Это имеет смысл, и в данной конкретной ситуации это правильно. Каждый раз, когда есть блюдо с мясом, оно больше не является вегетарианским, что дает нулевую вероятность блюда. Давайте посмотрим, что произойдет, если мы повторим процесс для Not Vegetarian.

Нахождение вероятности того, что блюдо не является вегетарианцем

Давайте повторим предыдущий процесс, найдя первую вероятность в теореме, P("cкурица, картофель, горох, капуста" | Вегетарианец^C).

  1. Во-первых, нам нужно найти P(курица|Вегетарианец^C). Нам нужно подсчитать, сколько раз курица появляется в невегетарианских блюдах, это 2. Нам также нужно знать, сколько всего блюд появляется в невегетарианских блюдах. Это 15. P(cкурица | Вегетарианец^C) = 2/15
  2. Теперь мы можем повторить процесс для P(картофель|вегетарианец^C), P(горох|вегетарианец^C) и P(капуста|вегетарианец^C). Это дает нам P(картофель|Вегетарианство^C) = 1/15, P(Горох|Вегетарианство^C) = 1/15, и P(капуста|Вегетарианская^C) = 0/15

3. Как и прежде, мы умножим их все вместе.2/15 * 1/15 * 1/15 * 1/15 = 0

Угу, это не так. Как может блюдо с мясом иметь нулевую вероятность того, что оно не вегетарианское? Что ж, нужно исправить это, иначе наш алгоритм не будет очень эффективным.

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

Аддитивное сглаживание

Аддитивное сглаживание — это когда мы добавляем параметр сглаживания α. Мы будем использовать α=1, но это значение может быть любым числом, если оно непротиворечиво. Это будет наше новое уравнение с аддитивным сглаживанием для элемента с заданным вегетарианством.

Давайте разберем это уравнение и решим его для первого продукта в нашем блюде.

  1. Сначала числитель просит нас найти «количество предметов | вегетарианец» и добавьте α. Для этого нам нужно найти, сколько раз элемент «курица» появляется в блюдах, уже классифицированных как вегетарианские, и добавить 1.
  2. Знаменатель сначала просит нас найти общее количество предметов, классифицированных как вегетарианские. Важно отметить, что это общее количество всех вегетарианских продуктов. Например, «тофу» появляется в двух блюдах, поэтому мы будем учитывать этот элемент дважды, по одному разу для каждого появления. Это дает нам 14 блюд в вегетарианской классификации.
  3. Вторая часть знаменателя просит нас умножить α на общее количество уникальных элементов. Это каждый элемент, будь то вегетарианец или не вегетарианец, но мы учитываем каждое появление элемента только один раз.

Наше окончательное уравнение с аддитивным сглаживанием для нахождения P(курица|вегетарианец) выглядит следующим образом:

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

Если мы повторим аддитивное сглаживание для всех элементов в нашем новом блюде, мы сможем, наконец, решить наше исходное уравнение и найти P(Vegetarian | "cкурица, картофель, горох, капуста"). Напоминаем, что мы умножим каждый элемент, скорректированный с помощью аддитивного сглаживания, на нашу вероятность вегетарианства (1/2). Наш окончательный результат с использованием пропорционального эквивалента теоремы Байеса: .000004.

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

Проделаем то же самое для P(Vegetarian^C| «курица, картошка, горох, капуста»)

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

Классифицировать блюдо

Наш последний шаг — классифицировать блюдо как вегетарианское или невегетарианское. Если P(вегетарианское | «курица, картофель, горох, капуста») больше, чем P(вегетарианское^C | «курица, картофель, горох, капуста»), то блюдо будет классифицироваться как вегетарианское. Если P(вегетарианец | «курица, картофель, горох, капуста») меньше, чем P(вегетарианец^C | «курица, картофель, горох, капуста»), он будет классифицирован как не вегетарианец. Начиная с .000004 ‹ .000006 алгоритм успешно классифицировал блюдо как Не вегетарианское.

Эврика, все сработало, как и ожидалось! Новое блюдо на самом деле не вегетарианское.

Компьютеры облегчают жизнь

Фу, это было много работы! Теперь, когда мы понимаем, как работает этот алгоритм, давайте повторим шаги, описанные выше, и напишем базовый код Python.

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

Вывод

С некоторыми классифицированными данными человека, немного математики и наивности, а также немного Python, мы создали программу, в которой компьютер может что-то классифицировать для нас. Довольно круто!