Изучив и изучив различные алгоритмы, связанные с машинным обучением, я обнаружил, что существует множество отличных материалов, показывающих, как использовать определенные алгоритмы на конкретном языке. Однако чего обычно не хватает, так это простого математического объяснения того, как работает алгоритм. Во всех случаях это невозможно без сильного математического образования, которого у меня нет.

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

Машинное обучение

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

Для контролируемого обучения требуется помеченный набор данных. Это означает, что каждый элемент данных и все его функции (столбцы), которые вы предоставляете для обучения алгоритма, помечаются правильным ответом. Затем алгоритм использует эту комбинацию элемента данных и результата/ответа, чтобы «узнать», какие вещи диктуют определенный ответ. Получив данные, которые она никогда раньше не видела и которые не помечены, эта обученная модель должна затем предсказать ответ на основе того, что она видела раньше.

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

Наивный Байес

Так какое же место во всем этом занимает Наивный Байес?

Наивный байесовский алгоритм — это контролируемый алгоритм машинного обучения. Он обычно используется с текстовыми наборами данных, чтобы узнать и понять что-то о тексте. Например, учитывая набор электронных писем и людей, которые их написали, наивный байесовский подход можно использовать для построения модели, позволяющей понять стили написания каждого автора электронной почты. После обучения ему можно отправить электронное письмо, не сообщая, кто его написал. Затем он может предсказать, кто написал его, основываясь на том, чему его учили. Как видите, обучающие данные жизненно важны для успеха модели.

Изображение взято с сайта Simafore.com

Как это работает?

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

Давайте посмотрим, что это показывает.

  1. Первая строка показывает распределение, поэтому сколько данных у нас есть для Гомера и Барта — как вы можете видеть здесь, это разделение 50/50.
  2. Представьте, что и Гомер, и Барт произносят только 3 слова под своими именами выше. Под каждым словом указан частотный вес: как часто слово используется человеком. например Гомер использует слово «DOH» в 50% случаев, «пончик» в 40% и «нет» в последних 10% — очевидно, их словарный запас намного богаче, но этого небольшого примера достаточно, чтобы объяснить концепции.
  3. Основываясь на том, что мы знаем, и с учетом утверждения «Нет DOH» — теперь нам нужно выяснить вероятность того, что каждый человек произнесет эту фразу. Это рассчитывается в последних двух строках приведенной выше диаграммы.

Как внимательный наблюдатель, вы заметите, что эти вероятности не составляют в сумме 1 (100%). Чтобы исправить это, нам нужно суммировать две вероятности, чтобы получить вероятность утверждения «Нет DOH», независимо от того, кто это сказал. Затем мы можем рассчитать апостериорную вероятность для Гомера и Барта, разделив их исходную вероятность на накопленную, как показано ниже.

Как видите, теперь мы получаем две вероятности, которые при суммировании составляют 100%. Мы также можем видеть, что существует вероятность 71%, что Гомер сказал эту фразу. Как видите, порядок или словосочетание не учитываются, учитывается только каждое отдельное слово и его частота. Это причина названия «Наивный» — потому что каждая функция (в нашем случае слово) обрабатывается независимо от других.

Пример реализации на Python

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

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

Для краткости я просто проведу вас через базовую реализацию наивной байесовской классификации и мои результаты. Чтобы получить основную часть кода, который поможет вам векторизовать фразы и подготовить их к набору обучающих и тестовых данных, см. Udacity Intro to Machine Learning Github repo и взгляните на их примеры Naive Bayes.

Во-первых, отфильтруйте и разделите данные Симпсонов, чтобы получить файл, содержащий один идентификатор в каждой строке, который является либо идентификатором Барта (8), либо идентификатором Гомера (2). Создайте еще один файл и поместите нормализованный текст для этих отфильтрованных данных в каждую строку (убедитесь, что он находится в том же порядке, что и идентификатор, чтобы идентификатор строки 1 соответствовал тексту строки 1 и т. д.).

Теперь самое интересное. Напишите себе простое приложение Python для Vectorise и подготовьте эти наборы данных для изучения. Вы можете использовать пример Udacity и настроить его. После этого вы можете вписать эти данные в наивную байесовскую модель.

import sys 
from simpsons_script_preprocess 
import preprocess 
### obtain your preprocessed data from your preprocessor application
features_train, features_test, labels_train, labels_test = preprocess() 
### Build you Naive Bayes training model 
from sklearn.naive_bayes import GaussianNB 
clf = GaussianNB() 
clf.fit(features_train, labels_train) 
### Print out the accuracy using the score function
print "Naive Bayes accuracy:", clf.score(features_test, labels_test)

Вывод:

Naive Bayes accuracy: 0.69784868262

Вывод

Только с использованием двух идентификаторов в наборе данных и без настройки модели нам удалось получить 70%! Это неплохо, но и не идеально — все, что выше 80%, меня бы устроило, но это отправная точка. Теперь вы можете добавить дополнительные идентификаторы Барта и Гомера из набора данных (поскольку их было несколько для разных персонажей) и начать настройку параметров, чтобы посмотреть, сможете ли вы повысить точность.