Смешивание категориальных и непрерывных данных в наивном байесовском классификаторе с помощью scikit-learn

Я использую scikit-learn в Python для разработки алгоритма классификации для прогнозирования пола определенных клиентов. Среди прочего я хочу использовать наивный байесовский классификатор, но моя проблема в том, что у меня есть набор категориальных данных (например: "Зарегистрирован онлайн", "Принимает уведомления по электронной почте" и т. Д.) И непрерывных данных (например: "Возраст", "Длина" членства "и т. д.). Раньше я не пользовался scikit раньше, но полагаю, что наивный байесовский метод Гаусса подходит для непрерывных данных, а наивный байесовский метод Бернулли можно использовать для категориальных данных. Однако, поскольку я хочу, чтобы в моей модели были как категориальные, так и непрерывные данные, я не знаю, как с этим справиться. Любые идеи будут высоко ценится!

6 ответов

Решение

У вас есть как минимум два варианта:

  • Преобразуйте все свои данные в категориальное представление, вычисляя процентили для каждой непрерывной переменной, а затем объединяя непрерывные переменные, используя процентили в качестве границ ячейки. Например, для роста человека создайте следующие ячейки: "очень маленькие", "маленькие", "обычные", "большие", "очень большие", гарантируя, что каждая ячейка содержит приблизительно 20% населения вашего тренировочного набора. У нас нет никакой утилиты для автоматического выполнения этого в scikit-learn, но это не должно быть слишком сложно, чтобы сделать это самостоятельно. Затем поместите уникальный многочлен NB на эти категориальные представления ваших данных.

  • Независимо подберите гауссову модель NB для непрерывной части данных и многочленную модель NB для категориальной части. Затем преобразуйте весь набор данных, взяв вероятности присвоения класса (с predict_proba метод) как новые функции: np.hstack((multinomial_probas, gaussian_probas)) и затем установите новую модель (например, новый гауссовский NB) на новые функции.

Надеюсь, я не опоздал. Недавно я написал библиотеку под названием Mixed Naive Bayes, написанную на NumPy. Он может предполагать сочетание гауссовского и категориального (мультинулли) распределений для функций обучающих данных.

https://github.com/remykarem/mixed-naive-bayes

Библиотека написана так, что API-интерфейсы похожи на http://scikit-learn.org/.

В приведенном ниже примере предположим, что первые 2 функции относятся к категориальному распределению, а последние 2 - к гауссовскому. вfit() метод, просто укажите categorical_features=[0,1], что указывает на то, что столбцы 0 и 1 должны соответствовать категориальному распределению.

from mixed_naive_bayes import MixedNB
X = [[0, 0, 180.9, 75.0],
     [1, 1, 165.2, 61.5],
     [2, 1, 166.3, 60.3],
     [1, 1, 173.0, 68.2],
     [0, 2, 178.4, 71.0]]
y = [0, 0, 1, 1, 0]
clf = MixedNB(categorical_features=[0,1])
clf.fit(X,y)
clf.predict(X)

Пип устанавливается через pip install mixed-naive-bayes. Подробнее об использовании в файле README.md. Приветствуются запросы на вытягивание:)

Ответ прост: умножьте результат!! это то же самое.

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

так что правильный ответ:

  1. рассчитать вероятность по категориальным переменным.
  2. рассчитать вероятность из непрерывных переменных.
  3. умножьте 1 и 2.

Вам понадобятся следующие шаги:

  1. Рассчитайте вероятность из категориальных переменных (используя метод из )
  2. Рассчитайте вероятность от непрерывных переменных (используя predict_probaметод из )
  3. Умножьте 1. и 2. И
  4. Разделите на предыдущий (либо из BernoulliNBили из GaussianNBтак как они одинаковые) И ТОГДА
  5. Разделите 4. на сумму (по классам) 4. Это шаг нормализации.

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

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

Автор представил математическое обоснование в своем ответе на Quora , вы можете проверить.

Подход @Yaron требует дополнительного шага (4. ниже):

  1. Рассчитайте вероятность по категориальным переменным.
  2. Рассчитайте вероятность от непрерывных переменных.
  3. Умножьте 1. и 2. И
  4. Разделите 3 на сумму произведения 1 и 2.

Шаг 4. - это шаг нормализации. Взгляните на @remykarem's mixed-naive-bayesв качестве примера (строки 268-278):

              if self.gaussian_features.size != 0 and self.categorical_features.size != 0:
            finals = t * p * self.priors
        elif self.gaussian_features.size != 0:
            finals = t * self.priors
        elif self.categorical_features.size != 0:
            finals = p * self.priors

        normalised = finals.T/(np.sum(finals, axis=1) + 1e-6)
        normalised = np.moveaxis(normalised, [0, 1], [1, 0])

        return normalised

Вероятности гауссовой и категориальной моделей ( t а также p соответственно) умножаются вместе в строке 269 (строка 2 в отрывке выше), а затем нормализуются, как в пункте 4. в строке 275 (четвертая строка снизу в отрывке выше).

Другие вопросы по тегам