«Игра, множество и математика», Наивный Байес

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

1-Наивная теория Байеса

Наивный байесовский классификатор — это вероятностный алгоритм обучения с учителем, основанный на теореме Байеса:

где А и В — случайные события.

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

где:

  • «n» — количество признаков.
  • «y» — переменная класса (целевая переменная).
  • «x_1,…,x_n» — это функции.

Используя наивную теорему Байеса, мы получаем следующий результат:

где:

  • P(y|x_1,…,x_n) — апостериорная вероятность класса.
  • P(x_1,…,x_n|y) — вероятность.
  • P (y) - вероятность класса (частота класса y)
  • P(x_1,…,x_n) — априорная вероятность предиктора.

Используя условное отношение наивной независимости, мы получаем:

где:

  • P(x_i|y) следует определенному распределению в зависимости от типа наивного байесовского классификатора, например. если мы имеем дело с гауссовым наивным байесовским классификатором, то:

После того, как P(y) и P(x_i|y) оценены, мы можем оценить переменную класса y, используя Максимум Апостериори:

Плюсы и минусы наивного Байеса:

  • (+): По сравнению со сложными алгоритмами обучения с учителем Наивный байесовский алгоритм работает быстрее благодаря допущению условной независимости характеристик данных. Последнее условие обеспечивает одномерную оценку распределения каждого параметра, что устраняет потенциальные проблемы, связанные с «проклятием размерности».
  • (-): Допущение условной независимости редко выполняется в реальной жизни, потому что функции обычно в некоторой степени коррелируют друг с другом. Но эту проблему можно решить, например, используя структуру Augmented Naive Bayes [2]. Кроме того, в [2] было доказано, что, несмотря на сильные зависимости между прогностическими переменными, наивный байесовский алгоритм все же может показывать высокую точность классификации при условии, что эти зависимости компенсируют друг друга.

2- Простая реализация Наивного Байеса

Я хочу сыграть в теннис с моим любимым игроком Роджером Федерером на открытом теннисном корте, но погода позволит нам сыграть?

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

Исследование данных

Начинаем импорт необходимых библиотек:

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

Мы читаем наш набор данных с помощью pandas.

Первые строки набора данных выглядят следующим образом:

Набор данных содержит 14 строк и 5 категориальных столбцов. Точно у нас есть 4 переменные-предикторы:

  • прогноз: описывает состояние погоды. Он имеет 3 разные категории: дождливая, солнечная, пасмурная.
  • temp: описывает температурный режим: горячий, умеренный или прохладный.
  • влажность: говорит нам, является ли влажность высокой или нормальной.
  • windy: логическая переменная, которая сообщает нам, ветреная погода или нет.

И наша целевая переменная — это «play»: логическая переменная, которая представляет решение, которое нужно принять: играть в теннис («да») или оставаться дома («нет» ).

Набор данных очень маленький!

Можно задать вопрос: «Можем ли мы получить эффективный классификатор, имея всего 14 выборок данных?»

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

Горячее кодирование

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

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

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

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

Точно так же мы применяем однократное кодирование к столбцу «температура», так как он содержит 3 отдельные категории. Для остальных переменных «влажность», «ветрено» и «игра» мы просто бинаризуем их, потому что каждый столбец содержит два отдельных класса.

Для горячего кодирования мы используем функцию «get_dummies» от pandas, а для бинаризации мы используем функцию «preprocessing.LabelEncoder()» от sklearn, как показано в коде ниже.

Мы объединяем новые числовые столбцы и отмечаем, что все результирующие столбцы являются двоичными.

Обучение нашей модели

Мы определяем нашу входную матрицу X и нашу цель y.

Мы решили обучить наш наивный байесовский классификатор на 60% данных. Остальные 40% для теста.

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

где: n — количество функций.

Таким образом, y оценивается следующим образом:

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

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

  • Точность модели = (TP+TN) /(TP+FP+FN+TN) = 0,66, что означает, что 4 наблюдения из 6 классифицируются правильно.
  • Точность модели = 0,8. Это означает, что если наша модель предсказывает класс 1 («мы можем играть в теннис!»), то мы на 80 % уверены в правильности решения модели.
  • Полнота модели = 0,8, что означает, что 80% реальных положительных классов предсказаны правильно.

Таким образом, наш наивный байесовский классификатор Бернулли показывает хорошие результаты в классификации положительных меток. Мы не можем судить о его эффективности при классификации отрицательных меток, потому что тестовые данные содержат одну отрицательную метку из 6 меток. Но при наличии большего набора данных мы должны проверить эффективность классификатора в предсказании отрицательного класса («мы не можем играть в теннис!»), чтобы не пропустить ни одной теннисной игры ;)

Наконец, я был вдохновлен реализовать алгоритм на наборе теннисных данных после того, как услышал о завершении карьеры моего любимого игрока Роджера Федерера. Карьера заканчивается, но наследие остается. Спасибо за долгие годы чистого волшебства! ❤

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

[1]: https://scikit-learn.org/stable/modules/naive_bayes.html

[2]: Х. Чжан, Оптимальность наивного байесовского метода (2004 г.), Материалы семнадцатой Международной конференции Флоридского общества исследований искусственного интеллекта, FLAIRS, 2004 г. 2.

[3]: А. Нг и М. Джордан, О дискриминационных и генеративных классификаторах: сравнение логистической регрессии и наивного Байеса (2001), Достижения в системах обработки нейронной информации 14 (NIPS 2001).