Как я могу использовать sklearn.naive_bayes с (несколькими) категориальными функциями?

Я хочу изучить модель Naive Bayes для проблемы, когда класс является логическим (принимает одно из двух значений). Некоторые из функций являются логическими, но другие функции категоричны и могут принимать небольшое количество значений (~ 5).

Если все мои функции были логическими, тогда я хотел бы использовать sklearn.naive_bayes.BernoulliNB. Кажется очевидным, что sklearn.naive_bayes.MultinomialNB не то, что я хочу.

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

Другая возможность заключается в том, чтобы кодировать переменную как действительную переменную, где 0.0 означает красный, 1.0 означает зеленый, а 2.0 означает синий. Это также кажется совершенно неуместным использовать GaussianNB (по понятным причинам).

То, что я пытаюсь сделать, не кажется странным, но я не понимаю, как вставить его в модели Naive Bayes, которые дает мне sklearn. Легко кодировать себя, но я предпочитаю использовать sklearn, если возможно, по понятным причинам (большинство: чтобы избежать ошибок).

[Изменить, чтобы объяснить, почему я не думаю, что многочленный NB - это то, что я хочу]:

Я понимаю, что в многочленном NB вектор признаков состоит из отсчетов, сколько раз токен наблюдался в образцах k iid.

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

В моем случае у меня есть несколько переменных bernoulli, плюс пара категориальных. Но здесь нет понятия "графы".

Пример: классы - это люди, которые любят или не любят математику. Предикторы являются главными колледжами (категоричны) и идут ли они в аспирантуру (boolean).

Я не думаю, что это соответствует многочлену, потому что здесь нет счетов.

Ответ 1

Некоторые из функций являются логическими, но другие функции категоричны и могут принимать небольшое количество значений (~ 5).

Это интересный вопрос, но на самом деле это больше, чем один:

  1. Как бороться с категориальной функцией в NB.
  2. Как иметь дело с неоднородными функциями в NB (и, как я укажу ниже, даже две категориальные функции неоднородны).
  3. Как это сделать в sklearn.

Рассмотрим сначала одну категориальную функцию. NB предполагает/упрощает, что функции независимы. Ваша идея превратить это в несколько двоичных переменных - это точно из фиктивных переменных. Ясно, что эти фиктивные переменные ничего, кроме независимых. Ваша идея о том, чтобы затем запустить Bernoulli NB на результат, неявно предполагает независимость. Хотя известно, что на практике NB не обязательно ломается, когда сталкиваются с зависимыми переменными, нет оснований пытаться преобразовать проблему в наихудшую конфигурацию для NB, тем более что многочленный NB является очень простой альтернативой.

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

С моделью мультиномиальных событий образцы (векторы объектов) представляют частоты, с которыми определенные события генерируются многочленом... где pi - вероятность того, что событие я произойдет. Вектор функции... тогда является гистограммой, где xi {\ displaystyle x_ {i}} x_ {i} подсчитывает количество случаев, когда событие я наблюдалось в конкретном случае. Это модель события, обычно используемая для классификации документов, с событиями, представляющими появление слова в одном документе (см. Предположение о сумме слов).

Итак, здесь каждый экземпляр вашей единственной категориальной переменной представляет собой "абзац длины-1", а распределение - в точности многочлен. В частности, каждая строка имеет 1 в одной позиции и 0 во всех остальных, потому что абзац длины-1 должен иметь ровно одно слово, и поэтому это будут частоты.

Обратите внимание, что с точки зрения многочлена sklearn, факт, что набор данных имеет 5 столбцов, теперь не означает предположения о независимости.


Теперь рассмотрим случай, когда у вас есть набор данных, состоящий из нескольких функций:

  1. категорический
  2. Бернулли
  3. Нормальный

В самом предположении использования NB эти переменные являются независимыми. Следовательно, вы можете сделать следующее:

  1. Постройте классификатор NB для каждой из категориальных данных отдельно, используя ваши фиктивные переменные и многочлен NB.
  2. Создайте классификатор NB для всех данных Бернулли сразу - это связано с тем, что sklearn Bernoulli NB является просто ярлыком для нескольких sklearn Bernoulli.
  3. То же, что и для всех обычных функций.

По определению независимости вероятность для экземпляра является произведением вероятностей экземпляров этими классификаторами.

Ответ 2

  1. CategoricalNB от scikit-learn - это новый класс, добавляемый в модуль naive_bayes. Это в ночной сборке здесь.

  2. Смешанный наивный байесовский (https://github.com/remykarem/mixed-naive-bayes). Он может предполагать сочетание гауссовых и категориальных (мультиноуллиевых) распределений по характеристикам обучающих данных. Библиотека написана так, что API-интерфейсы похожи на scikit-learn's.

from mixed_naive_bayes import MixedNB
X = [[0, 0],
     [1, 1],
     [2, 1],
     [1, 1],
     [0, 2]]
y = [0, 0, 1, 1, 0]
clf = MixedNB(categorical_features='all')
clf.fit(X,y)
clf.predict(X)

Смотрите мой ответ на похожий вопрос здесь fooobar.com/info/181175/....