Я использую scikit-learn в Python для разработки алгоритма классификации для прогнозирования пола определенных клиентов. В частности, я хочу использовать классификатор Naive Bayes, но моя проблема заключается в том, что у меня есть сочетание категориальных данных (например: "Зарегистрировано онлайн", "Принимает уведомления по электронной почте" и т.д.) И непрерывных данных (например: "Возраст", "Длина членства" и т.д.). Я не использовал scikit много раньше, но я полагаю, что этот гауссовский Naive Bayes подходит для непрерывных данных и что Bernoulli Naive Bayes может использоваться для категориальных данных. Однако, поскольку я хочу иметь и категориальные и непрерывные данные в моей модели, я действительно не знаю, как с этим справиться. Любые идеи были бы высоко оценены!
Смешивание категориальных и непрерывных данных в классификаторе Naive Bayes с использованием scikit-learn
Ответ 1
У вас есть как минимум два варианта:
-
Преобразуйте все свои данные в категориальное представление, вычислив процентили для каждой непрерывной переменной, а затем объединив непрерывные переменные, используя процентили в качестве границ бинов. Например, для высоты человека создайте следующие бункеры: "очень маленький", "маленький", "обычный", "большой", "очень большой", гарантирующий, что в каждом бункере содержится примерно 20% населения вашего набора упражнений. У нас нет никакой утилиты, чтобы выполнять это автоматически в scikit-learn, но это не должно быть слишком сложным, чтобы сделать это самостоятельно. Затем установите уникальный мультиномиальный NB для этих категориальных представлений ваших данных.
-
Независимо от гауссовой модели NB на непрерывной части данных и многомерной модели NB по категориальной части. Затем преобразуйте весь набор данных, взяв вероятности назначения класса (с помощью метода
predict_proba
) в качестве новых возможностей:np.hstack((multinomial_probas, gaussian_probas))
, а затем обновите новую модель (например, новый гауссовский NB) на новых функциях.
Ответ 2
Ответ прост: умножьте результат !! это то же самое.
Наивный байесовский принцип, основанный на применении теоремы Байеса с "наивным" предположением независимости между каждой парой признаков - это означает, что вы вычисляете вероятность Байеса, зависящую от конкретной функции, без удержания других - что означает, что алгоритм умножает каждую вероятность с одной функции на вероятность от второго признака (и мы полностью игнорируем знаменатель - так как это просто нормализатор).
так что правильный ответ:
- рассчитать вероятность по категориальным переменным.
- рассчитать вероятность из непрерывных переменных.
- умножьте 1 и 2.
Ответ 3
Надеюсь, я не опоздал. Недавно я написал библиотеку под названием "Смешанный наивный байесовский", написанную на NumPy. Он может предполагать сочетание гауссовых и категориальных (мультиноуллиевых) распределений для функций обучающих данных.
https://github.com/remykarem/mixed-naive-bayes
Библиотека написана так, что API-интерфейсы похожи на scikit-learn.
В приведенном ниже примере предположим, что первые 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. Потяните запросы с благодарностью :)