наивный байесовский классификатор в 25 строк кода
Наивный Байесовский классификатор в 25 строк кода
Наивный Байесовский классификатор один из самых простых из алгоритмов классификации. Тем не менее, очень часто он работает не хуже, а то и лучше более сложных алгоритмов. Здесь я хочу поделиться кодом и описанием того, как это все работает.
Немного теории
Пусть у нас есть строка текста O. Кроме того, имеются классы С, к одному из которых мы должны отнести строку. Нам необходимо найти такой класс с, при котором его вероятность для данной строки была бы максимальна. Математически это записывается так:
Вычислить P(C|O) сложно. Но можно воспользоваться теоремой Байеса и перейти к косвенным вероятностям:
Так как мы ищем максимум от функции, то знаменатель нас не интересует (он в данном случае константа). Кроме того, нужно взглянуть на строку O. Обычно, нет смысла работать со всей строкой. Намного эффективней выделить из нее определенные признаки (features). Таким образом формула примет вид:
Знаменатель нас не интересует. Числитель же можно переписать так.
Но это опять сложно. Здесь включаем «наивное» предположение о том, что переменные O зависят только от класса C, и не зависят друг от друга. Это сильно упрощение, но зачастую это работает. Числитель примет вид:
Финальная формула примет вид:
(1)
Т.е. все что нужно сделать, это вычислить вероятности P( C ) и P(O|C). Вычисление этих параметров и называется тренировкой классификатора.
Ниже — код на питоне. Содержит всего две функции: одна для тренировки (подсчета параметров формулы), другая для классификации (непосредственный расчет формулы).
В функции train первые пять строк производят подсчет количества классов C, а также частоту появления фич O и С в одном семпле. Вторая часть метода просто нормирует эти частоты. Таким образом на выходе получаются вероятности P© и P(O|C).
В функции classify происходит поиск наиболее вероятного класса. Единственное отличие от формулы (1) в том, что я заменяю произведение вероятностей на сумму логарифмов, взятых с отрицательным знаком, и вычисляю не argmax, а argmin. Переход к логарифмам — распространненный прием чтобы избежать слишком маленьких чисел, которые могли бы получится при произведении вероятностей.
Число 10(^-7), которое подставляется в логарифм, это способ избежать нуля в аргументе логарифма (т.к. он будет иначе он будет неопределен).
Чтобы натренировать классификатор возьмем размеченный список мужских и женских имен и воспользуемся этим кодом:
Файл ‘names.txt’ можно скачать здесь.
В качестве фич я выбрал последнюю букву имени (см функцию get_features). Работает неплохо, но для рабочего варианта лучше использовать схему посложнее. К примеру, выбрать первую букву имени и две последних. К примеру, вот так:
Алгоритм можно использовать для произвольного числа классов. К примеру, можно попробовать построить классификатор текстов по эмоциональной окраске.
Девятый алгоритм из цикла «Топ-10 data mining адгоритмов» — Naive Bayes.
Наивный байесовский классификатор – это семейство алгоритмов классификации, которые принимают одно допущение: Каждый параметр классифицируемых данных рассматривается независимо от других параметров класса.
Что означает слово «независимо»? 2 параметра называются независимыми, когда значение одного параметра не оказывает влияния на второй.
Скажем, у вас есть набор данных о пациенте: пульс, уровень холестерина, вес, рост и почтовый индекс. Все параметры будут независимыми, если значения всех параметров не оказывают эффекта друг на друга. Для этого набора данных разумно предположить, что рост пациента и почтовый индекс независимы, поскольку рост человека и его почтовый индекс никак не связаны.
Но давайте посмотрим дальше, все ли параметры независимы?
К сожалению, ответ – нет. Есть 3 соотношения, которые зависимы:
Обычно параметры набора данных не являются полностью независимыми.
Почему метод называется наивным? Предположение, что все параметры набора данных независимы – это довольно наивное предположение. Обычно так не бывает.
Кто такой Байес? Томас Байес был английским математиком-статистиком, в честь которого была названа теорема Байеса.
По сути, теорема позволяет нам предсказать класс на основании набора параметров, используя вероятность.
Упрощенное уравнение для классификации выглядит так:
Давайте взглянем на него поподробнее.
Что означает это уравнение? Уравнение находит вероятность класса А, на основании параметров 1 и 2. Другими словами, если вы видите параметры 1 и 2, то, вероятно, это данные класса А.
Уравнение читается следующим образом: Вероятность [выявления] класса А на основании параметров 1 и 2 – это дробь.
Числитель дроби – это вероятность параметра 1, принадлежащего классу А, умноженная на вероятность параметра 2, принадлежащего классу А, умноженная на вероятность класса А.
Знаменатель – это вероятность параметра 1 умноженная на вероятность параметра 2.
Есть какой-нибудь пример реализации наивного байесовского классификатора? Ниже представлен отличный пример, взятый из треда Stack Overflow.
Что мы видим в этом тренировочном наборе данных?
Если мы получим только параметры – длину, сладость и цвет фрукта (не зная его класса), то сможем вычислить вероятность того, что фрукт окажется бананом, апельсином или чем-то другим.
Предположим, что неизвестный фрукт длинный, сладкий и желтый.
Для вычисления вероятности нужно проделать 4 простых шага:
Шаг 1: Чтобы вычислить вероятность того, что неизвестный фрукт – это банан, давайте сначала решим, похож ли этот фрукт на банан. Вот как вычисляется вероятность класса «Банан» на основании параметров «длинный», «сладкий», «желтый»:
P(Banana|Long, Sweet, Yellow)
Выглядит точно так же как уравнение, описанное выше.
Шаг 2: Начнем с числителя и подставим все значения в уравнение:
P(Long|Banana) = 400/500 = 0.8
P(Sweet|Banana) = 350/500 = 0.7
P(Yellow|Banana) = 450/500 = 0.9
P(Banana) = 500/1000 = 0.5
Перемножив значения (согласно уравнению), мы получим:
0.8 x 0.7 x 0.9 x 0.5 = 0.252
Шаг 3: Проигнорируем знаменатель, поскольку он будет одинаковым для всех последующих вычислений.
Шаг 4: Проделаем те же вычисления для других классов:
P(Orange|Long, Sweet, Yellow) = 0
P(Other|Long, Sweet, Yellow) = 0.01875
Поскольку 0,252 больше, чем 0,01875, то наивный байесовский алгоритм классифицирует этот длинный, сладкий и желтый фрукт как банан.
Требует ли этот метод обучения или он самообучающийся? Этот метод требует обучения, поскольку алгоритм использует размеченный набор данных для построения таблицы.
Почему стоит использовать наивный байесовский классификатор? Как вы можете заметить в примере выше, алгоритм состоит из простой арифметики. Это простые вычисления: умножение и деление.
Когда частотные таблицы уже вычислены, классификация неизвестного фрукта включает в себя только вычисления вероятностей для всех классов, а затем выбор наибольшей вероятности.
Несмотря на простоту, наивный байесовский алгоритм может быть удивительно точным. Например, было установлено, что он может быть успешно применен для фильтрации спама.
Где он используется? Реализации алгоритма могут быть найдены в Orange, scikit-learn, Weka и R.
Байесовский классификатор (видео)
Байесовский классификатор в примерах (видео)
Наивный Байесовский классификатор в 25 строк кода
Наивный Байесовский классификатор один из самых простых из алгоритмов классификации. Тем не менее, очень часто он работает не хуже, а то и лучше более сложных алгоритмов. Здесь я хочу поделиться кодом и описанием того, как это все работает.
Немного теории
Пусть у нас есть строка текста O. Кроме того, имеются классы С, к одному из которых мы должны отнести строку. Нам необходимо найти такой класс с, при котором его вероятность для данной строки была бы максимальна. Математически это записывается так:
Вычислить P(C|O) сложно. Но можно воспользоваться теоремой Байеса и перейти к косвенным вероятностям:
Так как мы ищем максимум от функции, то знаменатель нас не интересует (он в данном случае константа). Кроме того, нужно взглянуть на строку O. Обычно, нет смысла работать со всей строкой. Намного эффективней выделить из нее определенные признаки (features). Таким образом формула примет вид:
Знаменатель нас не интересует. Числитель же можно переписать так.
Но это опять сложно. Здесь включаем «наивное» предположение о том, что переменные O зависят только от класса C, и не зависят друг от друга. Это сильно упрощение, но зачастую это работает. Числитель примет вид:
Финальная формула примет вид:
Т.е. все что нужно сделать, это вычислить вероятности P( C ) и P(O|C). Вычисление этих параметров и называется тренировкой классификатора.
Ниже — код на питоне. Содержит всего две функции: одна для тренировки (подсчета параметров формулы), другая для классификации (непосредственный расчет формулы).
Чтобы натренировать протестировать классификатор возьмем размеченный список мужских и женских имен и воспользуемся этим кодом.
Файл ‘names.txt’ можно скачать здесь.
В качестве фич я выбрал последнюю букву имени (см функцию get_features). Работает неплохо, но для рабочего варианта лучше использовать схему посложнее. К примеру, выбрать первую букву имени и две последних. К примеру, вот так:
Наивный байесовский учебник: Наивный байесовский классификатор в Python
Классификация и прогнозирование — два наиболее важных аспекта машинного обучения, а Наивный Байес — простой, но удивительно мощный алгоритм прогнозного моделирования. Итак, ребята, в этом наивном байесовском уроке я расскажу о следующих темах:
Что такое наивный байесовский?
Наивный байесовский метод является одним из самых простых, но наиболее мощных алгоритмов классификации, основанных на теореме Байеса с предположением независимости среди предикторов. Наивная байесовская модель проста в построении и особенно полезна для очень больших наборов данных. Этот алгоритм состоит из двух частей:
Наивный байесовский классификатор предполагает, что наличие функции в классе не связано с какой-либо другой функцией. Даже если эти признаки зависят друг от друга или от наличия других признаков, все эти свойства независимо способствуют вероятности того, что конкретный фрукт является яблоком, апельсином или бананом, и именно поэтому он известен как «Наивный». «.
Что такое теорема Байеса.
В статистике и теории вероятностей теорема Байеса описывает вероятность события, основываясь на предварительном знании условий, которые могут быть связаны с событием. Он служит способом определения условной вероятности.
«Апостериорная вероятность равна предыдущей вероятности, умноженной на отношение правдоподобия».
Немного смущен? Не беспокойся Давайте продолжим наш наивный байесовский урок и разберем эту концепцию с простой концепцией.
Пример теоремы Байеса
Предположим, у нас есть колода карт, и мы хотим выяснить вероятность того, что выбранная нами карта случайным образом окажется королем, учитывая, что это лицевая карта. Итак, согласно теореме Байеса, мы можем решить эту проблему. Для начала нам нужно выяснить вероятность:
Прогнозирование игры по теореме Байеса
Давайте продолжим наш наивный байесовский урок и предскажем будущее с некоторыми погодными данными.
Здесь у нас есть наши данные, которые включают в себя день, прогноз, влажность и условия ветра. Последний столбец — «Играть», т. Е. Можем ли мы играть на улице, что мы должны предсказать.
Предположим, у нас есть День со следующими значениями:
Внешний вид = дождь
Итак, с помощью данных мы должны предсказать, сможем ли мы играть в этот день или нет.
Вероятность «Да» в этот день = P (прогноз = дождь | да) * P (влажность = высокая | да) * P (ветер = слабый | да) * P (да)
= 2/9 * 3/9 * 6/9 * 9/14 = 0,0199
Вероятность «Нет» в этот день = P (прогноз = дождь | нет) * P (влажность = высокая | нет) * P (ветер = слабый | нет) * P (нет)
= 2/5 * 4/5 * 2/5 * 5/14 = 0,0166
Теперь, когда мы нормализуем значение, мы получаем:
Наша модель предсказывает, что с вероятностью 55% игра будет завтра.
Наивный Байес в промышленности
Теперь, когда у вас есть представление о том, что такое «наивный байесовский» и как он работает, давайте посмотрим, где он используется в промышленности.
RSS-каналы
Наш первый промышленный пример использования — категоризация новостей, или мы можем использовать термин «классификация текста», чтобы расширить спектр этого алгоритма. Новости в сети быстро растут, где каждый новостной сайт имеет свой собственный макет и категоризацию для группировки новостей. Компании используют веб-сканер для извлечения полезного текста из HTML-страниц новостных статей для создания полнотекстового RSS. Содержимое каждой новостной статьи маркируется (классифицируется). Чтобы добиться лучших результатов классификации, мы удаляем из документа менее значимые слова, то есть стоп. Мы применяем наивный байесовский классификатор для классификации новостного контента на основе новостного кода.
Фильтрация спама
Наивные байесовские классификаторы являются популярным статистическим методом фильтрации электронной почты. Как правило, они используют пакет слов / функций для идентификации спама в электронной почте — подход, обычно используемый в классификации текста. Наивные байесовские классификаторы работают, соотнося использование токенов (обычно слов или, иногда, других вещей) со спамом и не спамом, а затем, используя теорему Байеса, вычисляют вероятность того, что электронное письмо является или не является спамом.
Отдельные слова имеют особую вероятность появления в спаме и в законных письмах. Например, большинство пользователей электронной почты часто встречают слова «Лотерея» и «Удача» в спам-письмах, но редко видят их в других письмах. Каждое слово в письме влияет на вероятность спама в электронном письме или только на самые интересные слова. Этот вклад называется апостериорной вероятностью и вычисляется с использованием теоремы Бэйса . Затем вероятность спама в письме вычисляется по всем словам в письме, и если сумма превышает определенный порог (скажем, 95%), фильтр помечает письмо как спам.
Медицинский диагноз
В настоящее время современные больницы хорошо оснащены устройствами для мониторинга и сбора данных, что приводит к постоянному сбору огромного количества данных посредством медицинского осмотра и медицинского обслуживания. Одним из главных преимуществ наивного байесовского подхода, который привлекает врачей, является то, что «вся доступная информация используется для объяснения решения». Это объяснение кажется «естественным» для медицинской диагностики и прогноза, то есть близко к тому, как врачи диагностируют пациентов.
При работе с медицинскими данными наивный байесовский классификатор учитывает доказательства из многих атрибутов, чтобы сделать окончательный прогноз, и дает прозрачные объяснения своих решений, и поэтому он считается одним из наиболее полезных классификаторов для поддержки решений врачей.
Прогноз погоды 
Используется байесовская модель для прогнозирования погоды, где апостериорные вероятности используются для вычисления вероятности каждой метки класса для экземпляра входных данных, а полученная с максимальной вероятностью считается итоговой.
Пошаговое внедрение наивного Байеса
Здесь у нас есть набор данных, состоящий из 768 наблюдений за женщинами в возрасте 21 года и старше. Набор данных описывает мгновенные измерения, взятые у пациентов, такие как возраст, обследование крови и количество беременностей. Каждая запись имеет классовое значение, которое указывает, перенес ли пациент диабет в течение 5 лет. Значения равны 1 для диабетиков и 0 для недиабетических.
Теперь давайте продолжим наш наивный байесовский урок и разберем все шаги, один за другим. Я разбил весь процесс на следующие шаги:
Шаг 1: Обработка данных
Первое, что нам нужно сделать, это загрузить наш файл данных. Данные в формате CSV без строки заголовка или каких-либо кавычек. Мы можем открыть файл с помощью функции открытия и прочитать строки данных, используя функцию чтения в модуле CSV.
Теперь нам нужно разбить данные на наборы данных обучения и тестирования.
Шаг 2: обобщить данные
Сводка собранных обучающих данных включает среднее значение и стандартное отклонение для каждого атрибута по значению класса. Они необходимы при создании прогнозов для расчета вероятности значений определенных атрибутов, принадлежащих каждому значению класса.
Мы можем разбить подготовку этих сводных данных на следующие подзадачи:
Отдельные данные по классу:
Рассчитать среднее:
Рассчитать стандартное отклонение:
Суммируйте набор данных:
Суммируйте атрибуты по классам:
Шаг 3: Создание прогнозов
Теперь мы готовы делать прогнозы, используя резюме, подготовленные на основе наших данных обучения. Прогнозирование включает в себя вычисление вероятности того, что данный экземпляр данных принадлежит каждому классу, затем выбор класса с наибольшей вероятностью в качестве прогнозирования. Нам необходимо выполнить следующие задачи:
Рассчитаем гауссову функцию плотности вероятности:
Рассчитать класс вероятностей:
Сделать прогноз:
Делать предсказания:
Получить точность:
Наконец, мы определяем нашу основную функцию, где мы вызываем все эти методы, которые мы определили, один за другим, чтобы получить точность модели, которую мы создали.
Вывод:
Так что здесь, как вы можете видеть, точность нашей модели составляет 66%. Теперь это значение отличается от модели к модели, а также от коэффициента разделения.
Теперь, когда мы увидели шаги, включенные в наивный байесовский классификатор, Python поставляется с библиотекой Sckit-learn, которая делает все вышеупомянутые шаги простыми в реализации и использовании. Давайте продолжим наш наивный байесовский урок и посмотрим, как это можно реализовать.
Наивный Байес со Sckit-Learn
Импорт библиотек и загрузка наборов данных
Создание нашей наивной байесовской модели с использованием Sckit-learn
Здесь у нас есть GaussianNB() метод, который выполняет те же функции, что и код, описанный выше:
Делать прогнозы
Получение точности и статистики
Здесь мы создадим отчет о классификации, который содержит различные статистические данные, необходимые для оценки модели. После этого мы создадим запутанную матрицу, которая даст нам четкое представление о точности и подгонке модели.
Классификационный отчет:
Матрица путаницы:
Как видите, с помощью этой мощной библиотеки сотни строк кода могут быть сведены в несколько строк кода.
Итак, на этом мы подошли к концу этого наивного байесовского урока. Поздравляю, ты больше не новичок в Наивном Байесе! Я надеюсь, вам понравился этот пост. Попробуйте этот простой пример на ваших системах сейчас.
Наивный Байесовский классификатор в 25 строк кода
Наивный Байесовский классификатор один из самых простых из алгоритмов классификации. Тем не менее, очень часто он работает не хуже, а то и лучше более сложных алгоритмов. Здесь я хочу поделиться кодом и описанием того, как это все работает.
Немного теории
Пусть у нас есть строка текста O. Кроме того, имеются классы С, к одному из которых мы должны отнести строку. Нам необходимо найти такой класс с, при котором его вероятность для данной строки была бы максимальна. Математически это записывается так:
Вычислить P(C|O) сложно. Но можно воспользоваться теоремой Байеса и перейти к косвенным вероятностям:
Так как мы ищем максимум от функции, то знаменатель нас не интересует (он в данном случае константа). Кроме того, нужно взглянуть на строку O. Обычно, нет смысла работать со всей строкой. Намного эффективней выделить из нее определенные признаки (features). Таким образом формула примет вид:
Знаменатель нас не интересует. Числитель же можно переписать так.
Но это опять сложно. Здесь включаем «наивное» предположение о том, что переменные O зависят только от класса C, и не зависят друг от друга. Это сильно упрощение, но зачастую это работает. Числитель примет вид:
Финальная формула примет вид:
(1)
Т.е. все что нужно сделать, это вычислить вероятности P( C ) и P(O|C). Вычисление этих параметров и называется тренировкой классификатора.
Ниже — код на питоне. Содержит всего две функции: одна для тренировки (подсчета параметров формулы), другая для классификации (непосредственный расчет формулы).
В функции train первые пять строк производят подсчет количества классов C, а также частоту появления фич O и С в одном семпле. Вторая часть метода просто нормирует эти частоты. Таким образом на выходе получаются вероятности P© и P(O|C).
В функции classify происходит поиск наиболее вероятного класса. Единственное отличие от формулы (1) в том, что я заменяю произведение вероятностей на сумму логарифмов, взятых с отрицательным знаком, и вычисляю не argmax, а argmin. Переход к логарифмам — распространненный прием чтобы избежать слишком маленьких чисел, которые могли бы получится при произведении вероятностей.
Число 10(^-7), которое подставляется в логарифм, это способ избежать нуля в аргументе логарифма (т.к. он будет иначе он будет неопределен).
Чтобы натренировать классификатор возьмем размеченный список мужских и женских имен и воспользуемся этим кодом:
Файл ‘names.txt’ можно скачать здесь.
В качестве фич я выбрал последнюю букву имени (см функцию get_features). Работает неплохо, но для рабочего варианта лучше использовать схему посложнее. К примеру, выбрать первую букву имени и две последних. К примеру, вот так:
Алгоритм можно использовать для произвольного числа классов. К примеру, можно попробовать построить классификатор текстов по эмоциональной окраске.