На этом шаге мы перечислим классы, которые реализуют эти классификаторы в библиотеке scikit-learn.
Наивные байесовские классификаторы представляют собой семейство классификаторов, которые очень схожи с линейными моделями, рассмотренными в предыдущих шагах. Однако они имеют тенденцию обучаться быстрее. Цена, которую приходится платить за такую эффективность - немного более низкая обобщающая способность моделей Байеса по сравнению с линеиными классификаторами типа LogisticRegression и LinearSVC.
Причина, по которой наивные байесовские модели столь эффективны, заключается в том, что они оценивают параметры, рассматривая каждый признак отдельно и по каждому признаку собирают простые статистики классов. В scikit-learn реализованы три вида наивных байесовских классификаторов: GaussianNB, BernoulliNB и MultinomialNB. GaussianNB можно применить к любым непрерывным данным, в то время как BernoulliNB принимает бинарные данные, MultinomialNB принимает счетные или дискретные данные (то есть каждый признак представляет собой подсчет целочисленных значений какой-то характеристики, например, речь может идти о частоте встречаемости слова в предложении). BernoulliNB и MultinomialNB в основном используются для классификации текстовых данных.
Классификатор BernoulliNB подсчитывает ненулевые частоты признаков по каждому классу. Это легче всего понять на примере:
[In 46]: X = np.array([[0, 1, 0, 1], [1, 0, 1, 1], [0, 0, 0, 1], [1, 0, 1, 0]]) y = np.array([0, 1, 0, 1])
Здесь у нас есть четыре точки данных с четырьмя бинарными признаками. Есть два класса 0 и 1. Для класса 0 (первая и третья точки данных) первый признак равен нулю два раза и отличен от нуля ноль раз, второй признак равен нулю один раз и отличен от нуля один раз и так далее. Те же самые частоты затем подсчитываются для точек данных во втором классе. Подсчет ненулевых элементов в каждом классе по сути выглядит следующим образом:
[In 47]: counts = {} for label in np.unique(y): # итерируем по каждому классу # подсчитываем (суммируем) элементы 1 по признаку counts[label] = X[y == label].sum(axis=0) print("Частоты признаков:\n{}".format(counts)) Частоты признаков: {0: array([0, 1, 0, 2]), 1: array([2, 0, 2, 1])}
Архив блокнота со всеми вычислениями, выполненными на шагах 37-45, можно взять здесь.
Две другие наивные байесовские модели MultinomialNB и GaussianNB, немного отличаются с точки зрения вычисляемых статистик. MultinomialNB принимает в расчет среднее значение каждого признака для каждого класса, в то время как GaussianNB записывает среднее значение, а также стандартное отклонение каждого признака для каждого класса.
Для получения прогноза точка данных сравнивается со статистиками для каждого класса и прогнозируется наиболее подходящий класс. Интересно отметить, что для MultinomialNB и BernoulliNB это приводит к прогнозной формуле, которая имеет точно такой же вид, что и формула для линейных моделей (смотри 41 шаг "Линейные модели для классификации"). К сожалению, coef_ для наивных байесовских моделей имеет несколько иной смысл, чем coef_ для линейных моделей, здесь coef_ не тождественен w.
На следующем шаге мы перечислим преимущества, недостатки и параметры.