Шаг 45.
Введение в машинное обучение с использованием Python. ... . Алгоритмы машинного обучения с учителем. Наивные байесовские классификаторы (общие сведения)

    На этом шаге мы перечислим классы, которые реализуют эти классификаторы в библиотеке 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.

    На следующем шаге мы перечислим преимущества, недостатки и параметры.




Предыдущий шаг Содержание Следующий шаг