1.9. Наивный байесовский классификатор

Наивные методы Байеса представляют собой набор алгоритмов обучения с учителем, основанных на применении теоремы Байеса с “наивным” предположением об условной независимости между каждой парой признаков при заданном значении переменной класса. Теорема Байеса устанавливает следующую связь с учетом переменной класса \(y\) и зависимого вектора признаков от \(x_1\) до \(x_n\), :

\[P(y \mid x_1, \dots, x_n) = \frac{P(y) P(x_1, \dots, x_n \mid y)} {P(x_1, \dots, x_n)}\]

Используя наивное предположение условной независимости, что

\[P(x_i | y, x_1, \dots, x_{i-1}, x_{i+1}, \dots, x_n) = P(x_i | y),\]

для всех \(i\) это соотношение упрощается до

\[P(y \mid x_1, \dots, x_n) = \frac{P(y) \prod_{i=1}^{n} P(x_i \mid y)} {P(x_1, \dots, x_n)}\]

Поскольку \(P(x_1, \dots, x_n)\) является константой с учетом входных данных, мы можем использовать следующее правило классификации:

\[ \begin{align}\begin{aligned}P(y \mid x_1, \dots, x_n) \propto P(y) \prod_{i=1}^{n} P(x_i \mid y)\\\Downarrow\\\hat{y} = \arg\max_y P(y) \prod_{i=1}^{n} P(x_i \mid y),\end{aligned}\end{align} \]

и мы можем использовать максимальную апостериорную оценку (Maximum A Posteriori - MAP) для оценки \(P(y)\) и \(P(x_i \mid y)\); первое - это относительная частота класса \(y\) в обучающем наборе.

Различные наивные байесовские классификаторы различаются главным образом предположениями, которые они делают относительно распределения \(P(x_i \mid y)\).

Несмотря на кажущееся упрощение, классификаторы наивного Байеса отлично работают во многих реальных ситуациях, например, при классификации документов и фильтрации спама. Для оценки необходимых параметров им требуется небольшой объем обучающих данных. (Теоретические причины того, почему наивный Байес работает хорошо, и на каких типах данных он работает, см. в ссылках ниже).

Наивные байесовские методы обучения и классификаторы могут работать чрезвычайно быстро по сравнению с более сложными методами. Разделение распределений условных признаков классов означает, что каждое распределение можно независимо оценить как одномерное распределение. Это, в свою очередь, помогает облегчить проблемы, возникающие из-за проклятия размерности.

С другой стороны, хотя наивный Байес известен как хороший классификатор, он, как известно, является плохой моделью, поэтому к вероятностным результатам predict_proba не следует относиться слишком серьезно.

Ссылки Click for more details

1.9.1. Гауссов Наивный Байес

GaussianNB реализует гауссов наивный байесовский алгоритм классификации. Вероятность признаков предполагается гауссовой:

\[P(x_i \mid y) = \frac{1}{\sqrt{2\pi\sigma^2_y}} \exp\left(-\frac{(x_i - \mu_y)^2}{2\sigma^2_y}\right)\]

Параметры \(\sigma_y\) и \(\mu_y\) оцениваются с использованием максимального правдоподобия.

>>> from sklearn.datasets import load_iris
>>> from sklearn.model_selection import train_test_split
>>> from sklearn.naive_bayes import GaussianNB
>>> X, y = load_iris(return_X_y=True)
>>> X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=0)
>>> gnb = GaussianNB()
>>> y_pred = gnb.fit(X_train, y_train).predict(X_test)
>>> print("Number of mislabeled points out of a total %d points : %d"
...       % (X_test.shape[0], (y_test != y_pred).sum()))
Number of mislabeled points out of a total 75 points : 4

1.9.2. Многочленный наивный Байес

MultinomialNB реализует наивный алгоритм Байеса для полиномиально распределенных данных и является одним из двух классических наивных вариантов Байеса, используемых в классификации текста (где данные обычно представляются как количество векторов слов, хотя векторы tf-idf также известно, что они хорошо работают на практике).

Распределение параметризуется векторами \(\theta_y = (\theta_{y1},\ldots,\theta_{yn})\) для каждого класса \(y\), где \(n\) - количество признаков (при классификации текста - размер словаря) и \(\theta_{yi}\) - это вероятность \(P(x_i \mid y)\) появления признака \(i\) в образце, принадлежащем классу \(y\).

Параметры \(\theta_y\) оцениваются с помощью сглаженной версии метода максимального правдоподобия, т. е. подсчета относительной частоты:

\[\hat{\theta}_{yi} = \frac{ N_{yi} + \alpha}{N_y + \alpha n}\]

где \(N_{yi} = \sum_{x \in T} x_i\) - количество раз, когда признак \(i\) появляется в образце класса \(y\) в обучающем наборе \(T\) и \(N_{y} = \sum_{i=1}^{n} N_{yi}\) - это общее количество всех функций для класса \(y\).

Приоритеты сглаживания \(\alpha \ge 0\) учитывают особенности, отсутствующие в обучающих выборках, и предотвращают появление нулевых вероятностей в дальнейших вычислениях. Установка \(\alpha = 1\) называется сглаживанием Лапласа, а \(\alpha < 1\) называется сглаживанием Лидстоуна.

1.9.3. Дополнение наивного Байеса

ComplementNB реализует наивный байесовский алгоритм дополнения (Complement Naive Bayes - CNB). CNB - это адаптация стандартного многочленного наивного алгоритма Байеса (Multinomial Naive Bayes - MNB), который особенно подходит для несбалансированных наборов данных. В частности, CNB использует статистику из дополнения каждого класса для вычисления весов модели. Изобретатели CNB эмпирически показывают, что оценки параметров CNB более стабильны, чем оценки для MNB. Кроме того, CNB регулярно превосходит MNB (часто со значительным отрывом) в задачах классификации текста.

Расчет весов Click for more details

Процедура расчета весов следующая:

\[ \begin{align}\begin{aligned}\hat{\theta}_{ci} = \frac{\alpha_i + \sum_{j:y_j \neq c} d_{ij}} {\alpha + \sum_{j:y_j \neq c} \sum_{k} d_{kj}}\\w_{ci} = \log \hat{\theta}_{ci}\\w_{ci} = \frac{w_{ci}}{\sum_{j} |w_{cj}|}\end{aligned}\end{align} \]

где суммирование производится по всем документам \(j\) не в классе \(c\), \(d_{ij}\) является либо счетчиком, либо значением tf-idf термина \(i ` в документе :math:`j\), \(\alpha_i\) - это гиперпараметр сглаживания, аналогичный тому, что есть в MNB, и \(\alpha = \sum_{i} \alpha_i\). Вторая нормализация направлена ​​на то, чтобы более длинные документы доминировали в оценках параметров в MNB. Правило классификации следующее:

\[\hat{c} = \arg\min_c \sum_{i} t_i w_{ci}\]

т.е. документ присваивается классу, который имеет наихудшее соответствие дополнениям.

Ссылки Click for more details

1.9.4. Бернулли Наивный Байес

BernoulliNB реализует простые байесовские алгоритмы обучения и классификации данных, которые распределяются в соответствии с многомерными распределениями Бернулли; т.е. может быть несколько функций, но предполагается, что каждая из них представляет собой переменную с двоичным значением (Бернулли, логическое значение).

Следовательно, этот класс требует, чтобы выборки были представлены в виде векторов признаков с двоичными значениями; если переданы данные любого другого типа, экземпляр BernoulliNB может бинаризировать свои входные данные (в зависимости от параметра binarize).

Правило принятия решения для наивного Байеса Бернулли основано на

\[P(x_i \mid y) = P(x_i = 1 \mid y) x_i + (1 - P(x_i = 1 \mid y)) (1 - x_i)\]

которое отличается от правила многочленного NB тем, что оно явно наказывает за невозникновение признака \(i\), который является индикатором для класса \(y\), где полиномиальный вариант просто игнорирует не встречающееся признаках.

В случае классификации текста для обучения и использования этого классификатора могут использоваться векторы вхождения слов (а не векторы количества слов). BernoulliNB может работать лучше с некоторыми наборами данных, особенно с более короткими документами. Если позволяет время, желательно оценить обе модели.

Ссылки Click for more details

1.9.5. Категориальный Наивный Байес

CategoricalNB реализует категориальный наивный алгоритм Байеса для категориально распределенных данных. Предполагается, что каждый признак, описываемый индексом \(i\), имеет свое категориальное распределение.

Для каждого признака \(i\) в обучающем наборе \(X\), CategoricalNB оценивает категориальное распределение для каждого признака i из X, обусловленное классом y. Набор индексов выборок определяется как \(J = \{ 1, \dots, m \}\), где \(m\) - количество выборок.

Расчет вероятности Click for more details

Вероятность категории \(t\) в признаке \(i\) данного класса \(c\) оценивается как:

\[P(x_i = t \mid y = c \: ;\, \alpha) = \frac{ N_{tic} + \alpha}{N_{c} + \alpha n_i},\]

где \(N_{tic} = |\{j \in J \mid x_{ij} = t, y_j = c\}|\) - количество раз, когда категория \(t\) появляется в образцы \(x_{i}\), принадлежащие классу \(c\), \(N_{c} = |\{ j \in J\mid y_j = c\}|\) - это число выборок класса c, \(\alpha\) - параметр сглаживания, а \(n_i\) - количество доступных категорий объектов \(i\).

CategoricalNB предполагает, что образец матрицы \(X\) закодирован (например, с помощью OrdinalEncoder) так, что все категории для каждого объекта \(i\) представлены числами \(0, ..., n_i - 1\), где \(n_i\) - количество доступных категорий объекта \(i\).

1.9.6. Обучение наивной байесовской модели вне ядра

Наивные байесовские модели можно использовать для решения крупномасштабных задач классификации, для которых полный обучающий набор может не поместиться в памяти. Чтобы справиться с этим случаем, MultinomialNB, BernoulliNB и GaussianNB предоставляют метод partial_fit, который можно использовать постепенно, как это делается с другими классификаторами, как показано в Out-of-core classification of text documents. Все простые байесовские классификаторы поддерживают взвешивание выборки.

В отличие от метода fit, при первом вызове partial_fit необходимо передать список всех ожидаемых меток классов.

Обзор доступных стратегий в scikit-learn см. также в документации out-of-core Learning.

Примечание

Вызов метода partial_fit в наивных моделях Байеса приводит к некоторым вычислительным издержкам. Рекомендуется использовать максимально большие размеры блоков данных, насколько это позволяет доступная оперативная память.