Я собираюсь пройти весь процесс наивного Байеса с нуля, так как мне не совсем ясно, где вы зависаете.
Мы хотим найти вероятность того, что новый пример принадлежит каждому классу: ). Затем мы вычисляем эту вероятность для каждого класса и выбираем наиболее вероятный класс. Проблема в том, что у нас обычно нет таких вероятностей. Однако теорема Байеса позволяет переписать это уравнение в более удобной форме.P(class|feature1,feature2,...,featuren
Теорема Байеса есть просто или в терминах нашей задачи:
P(A|B)=P(B|A)⋅P(A)P(B)
P(class|features)=P(features|class)⋅P(class)P(features)
Мы можем упростить это, удалив . Мы можем сделать это, потому что мы собираемся ранжировать для каждого значения ; будут одинаковыми каждый раз - это не зависит от . Это оставляет нас с
P(features)P(class|features)classP(features)classP(class|features)∝P(features|class)⋅P(class)
Предыдущие вероятности, , можно рассчитать, как вы описали в своем вопросе.P(class)
Это оставляет . Мы хотим исключить огромную и, вероятно, очень разреженную, совместную вероятность . Если каждая функция независима, то Даже если они на самом деле не являются независимыми, мы можем предположить, что они (это " Наивная "часть наивного Байеса). Лично я считаю, что проще обдумать это для дискретных (то есть категориальных) переменных, поэтому давайте воспользуемся немного другой версией вашего примера. Здесь я разделил каждое измерение элемента на две категориальные переменные.P(features|class)P(feature1,feature2,...,featuren|class)P(feature1,feature2,...,featuren|class)=∏iP(featurei|class)
,
Пример: тренировка классификатора
Для обучения классификатора мы подсчитываем различные поднаборы точек и используем их для вычисления априорной и условной вероятностей.
Приоры тривиальны: всего шестьдесят очков, сорок - зеленые, а двадцать - красные. Таким образом,P(class=green)=4060=2/3 and P(class=red)=2060=1/3
Далее мы должны вычислить условные вероятности каждого значения признака данного класса. Здесь есть две функции: и , каждая из которых принимает одно из двух значений (A или B для одного, X или Y для другого). Поэтому нам необходимо знать следующее:feature1feature2
- P(feature1=A|class=red)
- P(feature1=B|class=red)
- P(feature1=A|class=green)
- P(feature1=B|class=green)
- P(feature2=X|class=red)
- P(feature2=Y|class=red)
- P(feature2=X|class=green)
- P(feature2=Y|class=green)
- (в случае, если это не очевидно, это все возможные пары признак-значение и класс)
Их легко вычислить, посчитав и разделив тоже. Например, для мы смотрим только на красные точки и подсчитываем, сколько из них находится в области «A» для . Есть двадцать красных точек, все из которых находятся в области «A», поэтому . Ни одна из красных точек не находится в области B, поэтому . Далее мы делаем то же самое, но рассматриваем только зеленые точки. Это дает нам и . Мы повторяем этот процесс для , чтобы округлить таблицу вероятностей. Предполагая, что я рассчитал правильно, мы получаемP(feature1=A|class=red)feature1P(feature1=A|class=red)=20/20=1P(feature1|class=red)=0/20=0P(feature1=A|class=green)=5/40=1/8P(feature1=B|class=green)=35/40=7/8feature2
- P(feature1=A|class=red)=1
- P(feature1=B|class=red)=0
- P(feature1=A|class=green)=1/8
- P(feature1=B|class=green)=7/8
- P(feature2=X|class=red)=3/10
- P(feature2=Y|class=red)=7/10
- P(feature2=X|class=green)=8/10
- P(feature2=Y|class=green)=2/10
Эти десять вероятностей (два априора плюс восемь условных выражений) являются нашей моделью
Классификация нового примера
Давайте классифицируем белую точку из вашего примера. Он находится в области «A» для и области «Y» для . Мы хотим найти вероятность того, что это в каждом классе. Давайте начнем с красного. Используя формулу выше, мы знаем, что:
Subbing по вероятностям из таблицы получаемfeature1feature2P(class=red|example)∝P(class=red)⋅P(feature1=A|class=red)⋅P(feature2=Y|class=red)
P(class=red|example)∝13⋅1⋅710=730
Затем мы делаем то же самое для зеленого:
P(class=green|example)∝P(class=green)⋅P(feature1=A|class=green)⋅P(feature2=Y|class=green)
Подстановка в этих значениях дает нам 0 ( ). Наконец, мы смотрим, какой класс дал нам наибольшую вероятность. В данном случае это явно красный класс, так что именно здесь мы назначаем точку.2/3⋅0⋅2/10
Примечания
В вашем исходном примере функции непрерывны. В этом случае вам нужно найти какой-то способ присвоения P (feature = value | class) для каждого класса. Тогда вы можете рассмотреть возможность подгонки к известному распределению вероятностей (например, гауссову). Во время обучения вы найдете среднее значение и дисперсию для каждого класса по каждому измерению. Чтобы классифицировать точку, вы должны найти , подключив соответствующее среднее значение и дисперсию для каждого класса. Другие распределения могут быть более подходящими, в зависимости от особенностей ваших данных, но гауссиан будет хорошей отправной точкой.P(feature=value|class)
Я не слишком знаком с набором данных DARPA, но вы, по сути, делаете то же самое. Вы, вероятно, в конечном итоге вычислите что-то вроде P (атака = TRUE | служба = палец), P (атака = ложь | служба = палец), P (атака = TRUE | служба = ftp) и т. Д., А затем объедините их в так же, как в примере. Как примечание стороны, часть уловки здесь состоит в том, чтобы придумать хорошие особенности. Например, исходный IP-адрес, вероятно, будет безнадежно редким - у вас, вероятно, будет только один или два примера для данного IP-адреса. Вы могли бы сделать намного лучше, если бы вы геолоцировали IP-адрес и использовали вместо него «Source_in_same_building_as_dest (true / false)» или что-то еще.
Я надеюсь, что это помогает больше. Если что-то требует разъяснений, я был бы рад попробовать еще раз!