Этот пост поможет вам лучше понять наивный байесовский метод.

Подобно тому, как Наивный Байес делает наивное предположение, что функции, которые мы придаем модели, независимы, я также сделал несколько наивных предположений о том, как работает NB.

  • Я предполагал, что MultinomialNB работает для любых данных. (И я использую это для любых данных, которые у меня есть) → Подробно объяснил в посте ниже, почему это плохая практика.
  • Гауссовский наивный Байес делает предположение, что характеристики являются гауссовскими. → Признаки не считаются гауссовскими, предполагается, что вероятности правдоподобия соответствуют гауссовскому распределению.
  • Вычисление правдоподобия в MultinomialNB и CategoriesNB одинаково → Нет, есть небольшая разница в вычислении вероятности. В полиномиальном знаменателе будет общее количество слов в этом конкретном классе, в то время как в категориальномNB это общее количество точек данных с определенным классом.
  • Реализовать наивный байесовский метод с нуля на python очень сложно. → Для реализации полиномиального Наивного Байеса требуется всего 15 строк кода.

Ниже приведены вещи, которые, по моему мнению, дадут вам более глубокое понимание Наивного Байеса:

Если вы новичок в Наивном Байесе или хотите быстро отредактировать его, пожалуйста, ознакомьтесь с моими заметками, чтобы начать.

1. Почему в наивном байесовском методе мы предполагаем, что функции условно независимы?

2. Sklearn имеет GaussianNB, MultinomialNB, КатегориальныйNB, BernoulliNB → Какую модель вы выберете для данных с категориями, числовыми, двоичными характеристиками?

3. Как реализовать Multinomial Naive Bayes с нуля для текстовых данных и сопоставить результаты с Sklearn MultinomialNB?

4. Как с нуля реализовать категориальный наивный байесовский метод для категориальных данных и сопоставить результаты с помощью Sklearn CategoryNB?

5. Как реализовать Gaussian Naive Bayes с нуля для числовых данных и сопоставить результаты с помощью Sklearn GaussianNB?

6. Что такое обучение и проверка → временные и пространственные сложности для Наивного Байеса?

7. Влияют ли несбалансированные данные на наивный байесовский метод? Если да, то как это исправить?

8. Как наивный байесовский метод влияет на выбросы?

9. Можно ли интерпретировать наивный байесовский анализ, можем ли мы сказать, какие функции помогли нам предсказать конкретный класс?

10. Является ли наивный байесовский классификатор линейным классификатором, может ли он решить нелинейную границу принятия решений?

11. Как избежать проблем с переоснащением или недообучением в наивном байесовском методе?

В этом посте вы найдете все ответы на первые 4 вопроса (выделены жирным шрифтом). Поскольку пост становился все длиннее, я переместил эти вопросы в часть 2, вы можете проверить ссылку здесь.



Давайте начнем,

1. Почему в наивном байесовском методе мы предполагаем, что функции условно независимы?

Это наивное уравнение Байеса для вычисления апостериорной вероятности целевого значения с учетом входного X (без предположения какой-либо условной независимости)

Предположим, у вас есть три функции, тогда, чтобы рассчитать вероятность правдоподобия, вы должны выполнить следующие шаги.

Предположим, что ваши данные обучения имеют только три точки данных (0,1,0), (1,0,0) и (1,0,1) с целевыми значениями 0,0 и 1 соответственно. Теперь давайте вычислим вероятность правдоподобия с условной независимостью и без нее.

Без условной независимости вероятность правдоподобия равна нулю. Но почему?

Потому что у нас недостаточно комбинаций данных, которые помогут нам вычислить вероятность правдоподобия.

Итак, сколько минимум точек данных вам нужно иметь?

Предположим, мы решаем двоичную классификацию, и входные данные также являются двоичной функцией. Допустим, у нас есть 3 функции - тогда все возможные значения ввода X могут иметь 2 * 2 * 2 = 8 комбинаций, и нам нужны эти 8 комбинаций для каждого класса 8 * 2 = 16.

Для данных d-измерения нам нужно иметь 2 ^ (d + 1) точек данных. Если d = 30, то это близко к 500 миллиардам точек данных. Что практически невозможно.

При условной независимости получается 2 * d комбинаций. С помощью простого предположения временная сложность значительно снижается.

2. Sklearn имеет GaussianNB, MultinomialNB, КатегориальныйNB, BernoulliNB → Какую модель вы выберете для данных с категориями, числовыми, двоичными характеристиками?

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

GaussianNB → Когда у вас есть непрерывные функции.

КатегориальныйNB → Когда у вас есть категориальные данные.

MultinomialNB → Применяется к текстовым данным.

Итак, учитывая, что ваши данные имеют непрерывные функции, категориальные особенности и текстовые данные, какой алгоритм вы будете использовать?

Фундаментальное предположение каждого алгоритма состоит в том, что он предполагает, что функции условно независимы. Подгоните категориальные функции на категориальныйNB, непрерывные функции на GaussianNB и текстовые данные на MultinomialNB и получите вероятности правдоподобия каждой модели (для каждой точки данных теперь у нас будет 3 вероятности правдоподобия) и умножьте их, чтобы получить общую вероятность правдоподобия.

Примечание: вы должны умножить априорную вероятность на окончательную вероятность, чтобы получить окончательную апостериорную вероятность.

3. Как реализовать Multinomial Naive Bayes с нуля для текстовых данных и сопоставить результаты с Sklearn MultinomialNB?

Шаги:

  1. Преобразуйте данные в вектор с помощью BOW.
  2. Рассчитайте количество на основе класса.
  3. Рассчитайте все вероятности правдоподобия.
  4. Рассчитайте априорную вероятность.
  5. Рассчитайте апостериорную вероятность.

Возьмем для примера данные:

  1. Преобразуйте текст в BOW с помощью CountVectorizer:

Это просто и не требует пояснений.

2. Рассчитайте количество на основе классов

  • Во-первых, выполните быстрое кодирование целевых значений. Я использую здесь LabelBinarizer. Проверьте пример вывода в приведенном ниже коде.
  • Форма y теперь будет (n_classes * n_datapoints), а форма X - (n_datapoints * n_features).

Чтобы получить счет на основе класса, достаточно просто умножить транспонирование y на X.

Не понимая, как работает count_matrix, давайте рассмотрим пример и проясним:

Надеюсь, что приведенный выше пример понятен, если не попытаться сделать это на листе бумаги, чтобы понять умножение матриц.

3. Расчет вероятностей:

Например, чтобы вычислить P («are» / y = ’question’), мы используем формулу ниже. Сглаживание Лапласа добавлено, чтобы избежать случая нулевой вероятности.

Шаги по вычислению feature_log_probabilities:

  1. У нас уже есть счетчики → Просто добавьте к ним альфа для выполнения сглаживания лапласа.
  2. Теперь для этого посчитайте сумму построчно, чтобы получить количество слов в определенном классе.

Когда альфа = 1:

  1. Добавляем единицу ко всем значениям в count_matrix.
  2. Расчет суммы по строкам. Согласно формуле знаменателя, мы должны добавить 21 * альфа (21 уникальное слово), мы это делаем?

Да, здесь в числителе к каждому значению мы добавили альфа, поэтому, когда мы просто суммируем, мы в основном делаем сумму строк (count_matrix) + 21 * alpha.

4. Рассчитайте априорные вероятности:

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

4. Функция прогнозирования:

Теперь у нас есть вероятности и точка запроса. Мы можем просто вычислить взвешенную сумму вероятностей и точку запроса, используя умножение матриц.

Завершая весь код,

Давайте сравним наши результаты с результатами реализации sklearn.

Имея всего 15 строк кода, мы реализовали «наивный байесовский классификатор».

4. Как с нуля реализовать категориальный наивный байесовский метод для категориальных данных и сопоставить результаты с помощью Sklearn КатегориальныйNB?

  1. Предварительная обработка данных.
  2. Рассчитайте количество / присутствие каждой функции в зависимости от класса.
  3. Рассчитайте правдоподобие.
  4. Рассчитайте априорную вероятность.
  5. Вычислить апостериорную вероятность для заданной точки запроса → Функция прогнозирования

Для этого упражнения я использую простые категориальные данные:

Предварительная обработка данных:

  • Преобразование категориальных данных в числовую форму с использованием порядкового кодирования. Функции преобразуются в порядковые целые числа. В результате получается один столбец целых чисел (от 0 до n_categories - 1) для каждой функции.
  • Примените быстрое кодирование к целевым значениям (как мы это делали в Multinomial NB)
X,y,classes = preprocess()
X.shape, y.shape

Форма вывода после кодирования: X → ((18, 3), y → (18, 2))

2. Рассчитайте количество / присутствие каждого объекта в зависимости от класса.

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

Наша основная цель в этой части - создать эту матрицу подсчета для каждой функции.

  • Для каждой функции - извлеките этот столбец из данных - X_feature
  • Для класса → Определите, где класс будет равен нулю, а где он будет равен единице, и преобразуйте его в логическое значение.
  • Теперь замаскируйте функцию ввода и просто подсчитайте.

Count_matrix даст результат таким образом, для каждой из функций, у вас есть 2D-массив (первая строка соответствует Нет, а вторая строка соответствует Да).

3. Расчет вероятностей правдоподобия:

Это похоже на то, что мы сделали для MultinomialNB, Здесь

  • Для каждой функции мы добавляем альфа (сглаживание Лапласа), если оно предусмотрено.
  • Суммирование по строкам, как показано на изображении выше.
  • Нахождение логарифмических вероятностей - log (num / den) → log (num) -log (den).

4. Рассчитайте априорные вероятности:

Это в точности похоже на MultinomialNB и является самым простым шагом в алгоритме.

5. Расчет апостериорной вероятности:

  • Получите соответствующие log_probs от каждой функции.
  • Сложите эти вероятности с априорной вероятностью, чтобы получить окончательную апостериорную вероятность.

Сравнение результатов Sklearn и нашей ручной реализации.

Бинго !!

По оставшимся вопросам проверьте часть 2 по ссылке ниже:



Большое вам спасибо 💖 за то, что прочитали этот пост, и я надеюсь, что вы получили ясное и глубокое понимание того, как работает наивный байесовский метод.

Вы можете найти весь код по этой ссылке на GitHub. Вы также можете связаться со мной в LinkedIn.

Использованная литература:

  1. Https://scikit-learn.org/stable/modules/naive_bayes.html#naive-bayes
  2. Курс прикладного ИИ