Как я могу использовать 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).
Это интересный вопрос, но на самом деле это больше, чем один:
- Как бороться с категориальной функцией в NB.
- Как иметь дело с неоднородными функциями в NB (и, как я укажу ниже, даже две категориальные функции неоднородны).
- Как это сделать в
sklearn
.
Рассмотрим сначала одну категориальную функцию. NB предполагает/упрощает, что функции независимы. Ваша идея превратить это в несколько двоичных переменных - это точно из фиктивных переменных. Ясно, что эти фиктивные переменные ничего, кроме независимых. Ваша идея о том, чтобы затем запустить Bernoulli NB на результат, неявно предполагает независимость. Хотя известно, что на практике NB не обязательно ломается, когда сталкиваются с зависимыми переменными, нет оснований пытаться преобразовать проблему в наихудшую конфигурацию для NB, тем более что многочленный NB является очень простой альтернативой.
И наоборот, предположим, что после преобразования единственной категориальной переменной в многостолбцовый набор данных с использованием фиктивных переменных вы используете многочлен NB. Теория для многочленных NB состояний:
С моделью мультиномиальных событий образцы (векторы объектов) представляют частоты, с которыми определенные события генерируются многочленом... где pi - вероятность того, что событие я произойдет. Вектор функции... тогда является гистограммой, где xi {\ displaystyle x_ {i}} x_ {i} подсчитывает количество случаев, когда событие я наблюдалось в конкретном случае. Это модель события, обычно используемая для классификации документов, с событиями, представляющими появление слова в одном документе (см. Предположение о сумме слов).
Итак, здесь каждый экземпляр вашей единственной категориальной переменной представляет собой "абзац длины-1", а распределение - в точности многочлен. В частности, каждая строка имеет 1 в одной позиции и 0 во всех остальных, потому что абзац длины-1 должен иметь ровно одно слово, и поэтому это будут частоты.
Обратите внимание, что с точки зрения многочлена sklearn
, факт, что набор данных имеет 5 столбцов, теперь не означает предположения о независимости.
Теперь рассмотрим случай, когда у вас есть набор данных, состоящий из нескольких функций:
- категорический
- Бернулли
- Нормальный
В самом предположении использования NB эти переменные являются независимыми. Следовательно, вы можете сделать следующее:
- Постройте классификатор NB для каждой из категориальных данных отдельно, используя ваши фиктивные переменные и многочлен NB.
- Создайте классификатор NB для всех данных Бернулли сразу - это связано с тем, что
sklearn
Bernoulli NB является просто ярлыком для нескольких sklearn
Bernoulli. - То же, что и для всех обычных функций.
По определению независимости вероятность для экземпляра является произведением вероятностей экземпляров этими классификаторами.
Ответ 2
CategoricalNB
от scikit-learn - это новый класс, добавляемый в модуль naive_bayes. Это в ночной сборке здесь.
Смешанный наивный байесовский (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/....