«Игра, множество и математика», Наивный Байес
Изучение математики, лежащей в основе волшебного Наивного Байеса, и применение ее к небольшому набору теннисных данных.
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).