Разное

Bayes naive: Наивный Байесовский классификатор в 25 строк кода / Хабр

Содержание

Наивный Байесовский классификатор в 25 строк кода / Хабр

Наивный Байесовский классификатор один из самых простых из алгоритмов классификации. Тем не менее, очень часто он работает не хуже, а то и лучше более сложных алгоритмов. Здесь я хочу поделиться кодом и описанием того, как это все работает.

И так, для примера возьму задачу определения пола по имени. Конечно, чтобы определить пол можно создать большой список имен с метками пола. Но этот список в любом случае будет неполон. Для того чтобы решить эту проблему, можно «натренировать» модель по маркированным именам.

Если интересует, прошу .

Немного теории

Пусть у нас есть строка текста O. Кроме того, имеются классы С, к одному из которых мы должны отнести строку. Нам необходимо найти такой класс с, при котором его вероятность для данной строки была бы максимальна. Математически это записывается так:

Вычислить P(C|O) сложно. Но можно воспользоваться теоремой Байеса и перейти к косвенным вероятностям:

Так как мы ищем максимум от функции, то знаменатель нас не интересует (он в данном случае константа). Кроме того, нужно взглянуть на строку O. Обычно, нет смысла работать со всей строкой. Намного эффективней выделить из нее определенные признаки (features). Таким образом формула примет вид:

Знаменатель нас не интересует. Числитель же можно переписать так.

Но это опять сложно. Здесь включаем «наивное» предположение о том, что переменные O зависят только от класса C, и не зависят друг от друга. Это сильно упрощение, но зачастую это работает. Числитель примет вид:

Финальная формула примет вид:

(1)

Т.е. все что нужно сделать, это вычислить вероятности P( C ) и P(O|C). Вычисление этих параметров и называется тренировкой классификатора.

Код

Ниже — код на питоне. Содержит всего две функции: одна для тренировки (подсчета параметров формулы), другая для классификации (непосредственный расчет формулы).

from __future__ import division
from collections import defaultdict
from math import log

def train(samples):
    classes, freq = defaultdict(lambda:0), defaultdict(lambda:0)
    for feats, label in samples:
        classes[label] += 1                 # count classes frequencies
        for feat in feats:
            freq[label, feat] += 1          # count features frequencies

    for label, feat in freq:                # normalize features frequencies
        freq[label, feat] /= classes[label]
    for c in classes:                       # normalize classes frequencies
        classes[c] /= len(samples)

    return classes, freq                    # return P(C) and P(O|C)

def classify(classifier, feats):
    classes, prob = classifier
    return min(classes.keys(),              # calculate argmin(-log(C|O))
        key = lambda cl: -log(classes[cl]) + \
            sum(-log(prob.get((cl,feat), 10**(-7))) for feat in feats))

В функции train первые пять строк производят подсчет количества классов C, а также частоту появления фич O и С в одном семпле. Вторая часть метода просто нормирует эти частоты. Таким образом на выходе получаются вероятности P© и P(O|C).

В функции classify происходит поиск наиболее вероятного класса. Единственное отличие от формулы (1) в том, что я заменяю произведение вероятностей на сумму логарифмов, взятых с отрицательным знаком, и вычисляю не argmax, а argmin. Переход к логарифмам — распространненный прием чтобы избежать слишком маленьких чисел, которые могли бы получится при произведении вероятностей.

Число 10(^-7), которое подставляется в логарифм, это способ избежать нуля в аргументе логарифма (т.к. он будет иначе он будет неопределен).

Чтобы натренировать классификатор возьмем размеченный список мужских и женских имен и воспользуемся этим кодом:

def get_features(sample): return (sample[-1],) # get last letter

samples = (line.decode('utf-8').split() for line in open('names.txt'))
features = [(get_features(feat), label) for feat, label in samples]
classifier = train(features)

print 'gender: ', classify(classifier, get_features(u'Аглафья'))

Файл ‘names.txt’ можно скачать здесь.

В качестве фич я выбрал последнюю букву имени (см функцию get_features). Работает неплохо, но для рабочего варианта лучше использовать схему посложнее. К примеру, выбрать первую букву имени и две последних. К примеру, вот так:

def get_features(sample): return (
        'll: %s' % sample[-1],          # get last letter
        'fl: %s' % sample[0],           # get first letter
        'sl: %s' % sample[1],           # get second letter
        )

Алгоритм можно использовать для произвольного числа классов. К примеру, можно попробовать построить классификатор текстов по эмоциональной окраске.

Тесты

Я протестировал классификатор на части исходного корпуса с именами. Точность составила 96%. Это не блестящий результат, но для многих задач вполне достаточно.

6 шагов для освоения наивного байесовского алгоритма

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

Перед вами обучающий набор данных, содержащий несколько сотен тысяч элементов и большое количество признаков. Что вы будете делать? На вашем месте я бы воспользовался наивным байесовским алгоритмом (naive Bayes algorithm, НБА), который превосходит по скорости многие другие алгоритмы классификации. В его основе лежит теорема Байеса.

В этой статье мы рассмотрим основы этого алгоритма, чтобы вы получили в свое распоряжение эффективный инструмент для работы с большими наборами данных. Кроме того, начинающим изучать Python будет полезен пример кода, представленный в конце статье.

Содержание

  1. Что такое наивный байесовский алгоритм?
  2. Как он работает?
  3. Положительные и отрицательные.
  4. 4 приложения наивного байесовского алгоритма.
  5. Как создать базовую модель на его основе с помощью Python?
  6. Советы по оптимизации модели.

Что такое наивный байесовский алгоритм?

Наивный байесовский алгоритм – это алгоритм классификации, основанный на теореме Байеса с допущением о независимости признаков. Другими словами, НБА предполагает, что наличие какого-либо признака в классе не связано с наличием какого-либо другого признака. Например, фрукт может считаться яблоком, если он красный, круглый и его диаметр составляет порядка 8 сантиметров. Даже если эти признаки зависят друг от друга или от других признаков, в любом случае они вносят независимый вклад в вероятность того, что этот фрукт является яблоком. В связи с таким допущением алгоритм называется «наивным».

Модели на основе НБА достаточно просты и крайне полезны при работе с очень большими наборами данных. При своей простоте НБА способен превзойти даже некоторые сложные алгоритмы классификации.

Теорема Байеса позволяет рассчитать апостериорную вероятность P(c|x) на основе P(c), P(x) и P(x|c).

На рисунке выше:

  • P(c|x) – апостериорная вероятность данного класса c (т.е. данного значения целевой переменной) при данном значении признака x.
  • P(c) – априорная вероятность данного класса.
  • P(x|c) – правдоподобие, т.е. вероятность данного значения признака при данном классе.
  • P(x) – априорная вероятность данного значения признака.

Как работает наивный байесовский алгоритм?

Давайте рассмотрим пример. Ниже представлен обучающий набор данных, содержащий один признак «Погодные условия» (weather) и целевую переменную «Игра» (play), которая обозначает возможность проведения матча. На основе погодных условий мы должны определить, состоится ли матч. Чтобы сделать это, необходимо выполнить следующие шаги.

Шаг 1. Преобразуем набор данных в частотную таблицу (frequency table).

Шаг 2. Создадим таблицу правдоподобия (likelihood table), рассчитав соответствующие вероятности. Например, вероятность облачной погоды (overcast) составляет 0,29, а вероятность того, что матч состоится (yes) – 0,64.

Sunny – Солнечная погода
Rainy – Дождливая погода
Overcast – Облачная погода

Шаг 3. С помощью теоремы Байеса рассчитаем апостериорную вероятность для каждого класса при данных погодных условиях. Класс с наибольшей апостериорной вероятностью будет результатом прогноза.

Задача. Состоится ли матч при солнечной погоде (sunny)?

Мы можем решить эту задачу с помощью описанного выше подхода.

P(Yes | Sunny) = P(Sunny | Yes) * P(Yes) / P(Sunny)

Здесь мы имеем следующие значения:

P(Sunny | Yes) = 3 / 9 = 0,33

P(Sunny) = 5 / 14 = 0,36

P(Yes) = 9 / 14 = 0,64

Теперь рассчитаем P(Yes | Sunny):

P(Yes | Sunny) = 0,33 * 0,64 / 0,36 = 0,60

Значит, при солнечной погоде более вероятно, что матч состоится.

Аналогичным образом с помощью НБА можно прогнозировать несколько различных классов на основе множества признаков. Этот алгоритм в основном используется в области классификации текстов и при решении задач многоклассовой классификации.

Положительные и отрицательные стороны наивного байесовского алгоритма

Положительные стороны:

  • Классификация, в том числе многоклассовая, выполняется легко и быстро.
  • Когда допущение о независимости выполняется, НБА превосходит другие алгоритмы, такие как логистическая регрессия (logistic regression), и при этом требует меньший объем обучающих данных.
  • НБА лучше работает с категорийными признаками, чем с непрерывными. Для непрерывных признаков предполагается нормальное распределение, что является достаточно сильным допущением.

Отрицательные стороны:

  • Если в тестовом наборе данных присутствует некоторое значение категорийного признака, которое не встречалось в обучающем наборе данных, тогда модель присвоит нулевую вероятность этому значению и не сможет сделать прогноз. Это явление известно под названием «нулевая частота» (zero frequency). Данную проблему можно решить с помощью сглаживания. Одним из самых простых методов является сглаживание по Лапласу (Laplace smoothing).
  • Хотя НБА является хорошим классификатором, значения спрогнозированных вероятностей не всегда являются достаточно точными. Поэтому не следует слишком полагаться на результаты, возвращенные методом predict_proba.
  • Еще одним ограничением НБА является допущение о независимости признаков. В реальности наборы полностью независимых признаков встречаются крайне редко.

4 приложения наивного байесовского алгоритма

  • Классификация в режиме реального времени. НБА очень быстро обучается, поэтому его можно использовать для обработки данных в режиме реального времени.
  • Многоклассовая классификация. НБА обеспечивает возможность многоклассовой классификации. Это позволяет прогнозировать вероятности для множества значений целевой переменной.
  • Классификация текстов, фильтрация спама, анализ тональности текста. При решении задач, связанных с классификацией текстов, НБА превосходит многие другие алгоритмы. Благодаря этому, данный алгоритм находит широкое применение в области фильтрации спама (идентификация спама в электронных письмах) и анализа тональности текста (анализ социальных медиа, идентификация позитивных и негативных мнений клиентов).
  • Рекомендательные системы. Наивный байесовский классификатор в сочетании с коллаборативной фильтрацией (collaborative filtering) позволяет реализовать рекомендательную систему. В рамках такой системы с помощью методов машинного обучения и интеллектуального анализа данных новая для пользователя информация отфильтровывается на основании спрогнозированного мнения этого пользователя о ней.

Как создать базовую модель на основе наивного байесовского алгоритма с помощью Python?

В этом нам поможет библиотека scikit-learn. Данная библиотека содержит три типа моделей на основе наивного байесовского алгоритма:

  • Gaussian (нормальное распределение). Модель данного типа используется в случае непрерывных признаков и предполагает, что значения признаков имеют нормальное распределение.
  • Multinomial (мультиномиальное распределение). Используется в случае дискретных признаков. Например, в задаче классификации текстов признаки могут показывать, сколько раз каждое слово встречается в данном тексте.
  • Bernoulli (распределение Бернулли). Используется в случае двоичных дискретных признаков (могут принимать только два значения: 0 и 1). Например, в задаче классификации текстов с применением подхода «мешок слов» (bag of words) бинарный признак определяет присутствие (1) или отсутствие (0) данного слова в тексте.

В зависимости от набора данных вы можете выбрать подходящую модель из описанных выше. Далее представлен пример кода для модели Gaussian.

Пример кода на Python

#Import Library of Gaussian Naive Bayes model
from sklearn.naive_bayes import GaussianNB
import numpy as np

#assigning predictor and target variables
x= np.array([[-3,7],[1,5], [1,2], [-2,0], [2,3], [-4,0], [-1,1], [1,1], [-2,2], [2,7], [-4,1], [-2,7]])
Y = np.array([3, 3, 3, 3, 4, 3, 3, 4, 3, 4, 4, 4])
#Create a Gaussian Classifier
model = GaussianNB()

# Train the model using the training sets 
model.fit(x, Y)

#Predict Output 
predicted= model.predict([[1,2],[3,4]])
print predicted

Output: ([3,4])

Мы рассмотрели базовую модель на основе НБА. Эффективность базовой модели можно повысить посредством настройки параметров, а также с помощью других методов, которые мы обсудим ниже. Чтобы получить более подробную информацию о классификации текстов с помощью НБА, я рекомендую вам обратиться к следующему документу.

Советы по оптимизации модели

  • Если значения непрерывных признаков не обладают нормальным распределением, тогда с помощью соответствующего преобразования необходимо привести их к такому распределению.
  • Если тестовый набор данных имеет проблему «нулевой частоты»()евой сатотый набор данных имеет проблему «лениюных ии текста с помощью данного алгоритма, я рекомендую вам обратиться к , необходимо применить сглаживание по Лапласу.
  • Если два признака имеют высокую корреляцию, один из них следует удалить, иначе они будут вносить удвоенный вклад, завышая тем самым свою значимость.
  • Наивный байесовский классификатор имеет набор параметров, доступных для настройки. Например, alpha=1 – активирует сглаживание по Лапласу, fit_prior=[True | False] – определяет, обучать ли модель априорным вероятностям классов. Полный список параметров можно найти здесь. Я рекомендую сосредоточиться на предобработке данных и отборе признаков.
  • Следует отметить, что в случае НБА использование ансамблевых методов, таких как бэггинг (bagging) и бустинг (boosting), не дает результатов. Данные подходы направлены на уменьшение дисперсии, что неприменимо по отношению к НБА.

Заключение

В данной статье мы рассмотрели наивный байесовский алгоритм. Основной областью применения этого алгоритма являются задачи классификации. Если вы хорошо разобрались в этом материале, значит, вы уже сделали первый шаг к освоению алгоритма. Теперь все, что вам нужно, – это практика.

Перед применением наивного байесовского алгоритма я рекомендую вам уделять особое внимание предобработке данных и отбору признаков. В следующей статье мы более подробно рассмотрим классификацию текстов с помощью данного алгоритма.

По материалам: analyticsvidhya.com

Наивный байесовский классификатор

В прошлой заметке я в общих чертах описал задачу классификации, а также традиционные подходы используемые для классификации текстовых документов. В этой заметке я более детально расскажу о том как работает самый простой, но вместе с тем один из самых часто используемых при обработке натуральных языков алгоритм классификации – наивный байесовский классификатор.

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

Теория

Осторожно, в этой части заметки много формул.

В основе NBC (Naïve Bayes Classifier) лежит, как вы уже могли догадаться, теорема Байеса.

$$ P(c|d) = \frac{ P(d|c)P(c) }{ P(d) } $$

где,

  • $ P(c|d) $ — вероятность что документ $d$ принадлежит классу $c$, именно её нам надо рассчитать;
  • $ P(d|c) $ — вероятность встретить документ $d$ среди всех документов класса $c$;
  • $ P(c) $ — безусловная вероятность встретить документ класса $c$ в корпусе документов;
  • $ P(d) $ — безусловная вероятность документа $d$ в корпусе документов.

Её смысл на обывательском уровне можно выразить следующим образом. Теорема Байеса позволяет переставить местами причину и следствие. Зная с какой вероятностью причина приводит к некоему событию, эта теорема позволяет расчитать вероятность того что именно эта причина привела к наблюдаемому событию.

Цель классификации состоит в том чтобы понять к какому классу принадлежит документ, поэтому нам нужна не сама вероятность, а наиболее вероятный класс. Байесовский классификатор использует оценку апостериорного максимума (Maximum a posteriori estimation) для определения наиболее вероятного класса. Грубо говоря, это класс с максимальной вероятностью.

$$ c_{map}=\operatorname*{arg\,max}_{c \in C} \frac{ P(d|c)P(c) }{ P(d) }$$

То есть нам надо рассчитать вероятность для всех классов и выбрать тот класс, который обладает максимальной вероятностью. Обратите внимание, знаменатель (вероятность документа) является константой и никак не может повлиять на ранжирование классов, поэтому в нашей задаче мы можем его игнорировать.

$$ c_{map}=\operatorname*{arg\,max}_{c \in C} \left[ P(d|c)P(c) \right] $$

Формула №1

Далее делается допущение которое и объясняет почему этот алгоритм называют наивным.

Предположение условной независимости

Если я вам скажу “темно как у негра в …”, вы сразу поймете о каком месте чем идет речь, даже если я не закончу фразу. Так происходит потому что в натуральном языке вероятность появления слова сильно зависит от контекста. Байесовский же классификатор представляет документ как набор слов вероятности которых условно не зависят друг от друга. Этот подход иногда еще называется bag of words model. Исходя из этого предположения условная вероятность документа аппроксимируется произведением условных вероятностей всех слов входящих в документ.

$$ P(d|c) \approx P(w_1|c)P(w_2|c)…P(w_n|c) = \prod_{i=1}^n P(w_i|c) $$

Этот подход также называется Unigram Language Model. Языковые модели играют очень важную роль в задачах обработки натуральных языков, но выходят за пределы этой заметки.

Подставив полученное выражение в формулу №1 мы получим:

$$ c_{map}=\operatorname*{arg\,max}_{c \in C} \left[ P(c) \prod_{i=1}^n P(w_i|c) \right] $$

Проблема арифметического переполнения

При достаточно большой длине документа придется перемножать большое количество очень маленьких чисел. Для того чтобы при этом избежать арифметического переполнения снизу зачастую пользуются свойством логарифма произведения $\log ab = \log a+\log b$. Так как логарифм функция монотонная, ее применение к обоим частям выражения изменит только его численное значение, но не параметры при которых достигается максимум. При этом, логарифм от числа близкого к нулю будет числом отрицательным, но в абсолютном значении существенно большим чем исходное число, что делает логарифмические значения вероятностей более удобными для анализа. Поэтому, мы переписываем нашу формулу с использованием логарифма.

$$ c_{map}=\operatorname*{arg\,max}_{c \in C} \left[ \log P(c)+\sum_{i=1}^n \log P(w_i|c) \right] $$

Формула №2

Основание логарифма в данном случае не имеет значения. Вы можете использовать как натуральный, так и любой другой логарифм.

Оценка параметров Байесовской модели

Оценка вероятностей $ P(c) $ и $ P(w_i|c) $ осуществляется на обучающей выборке. Вероятность класса мы можем оценить как:

$$ P(c)=\frac{D_c}{D} $$

где, $D_c$ – количество документов принадлежащих классу $c$, а $D$ – общее количество документов в обучающей выборке.

Оценка вероятности слова в классе может делаться несколькими путями. Здесь я приведу multinomial bayes model.

$$ P(w_i|c)=\frac{W_{ic}}{ \sum_{i’\in V} W_{i’c} } $$

Формула №3

  • $W_{ic}$ — количество раз сколько $i$-ое слово встречается в документах класса $c$;
  • $V$ — словарь корпуса документов (список всех уникальных слов).

Другими словами, числитель описывает сколько раз слово встречается в документах класса (включая повторы), а знаменатель – это суммарное количество слов во всех документах этого класса.

Проблема неизвестных слов

С формулой №3 есть одна небольшая проблема. Если на этапе классификации вам встретится слово которого вы не видели на этапе обучения, то значения $W_{ic}$, а следственно и $P(w_i|c)$ будут равны нулю. Это приведет к тому что документ с этим словом нельзя будет классифицировать, так как он будет иметь нулевую вероятность по всем классам. Избавиться от этой проблемы путем анализа большего количества документов не получится. Вы никогда не сможете составить обучающую выборку содержащую все возможные слова включая неологизмы, опечатки, синонимы и т.д. Типичным решением проблемы неизвестных слов является аддитивное сглаживание (сглаживание Лапласа). Идея заключается в том что мы притворяемся как будто видели каждое слово на один раз больше, то есть прибавляем единицу к частоте каждого слова.

$$ P(w_i|c)=\frac{W_{ic}+1}{ \sum_{i’\in V} \left( W_{i’c} + 1 \right) } = \frac{W_{ic}+1}{ |V| + \sum_{i’\in V} W_{i’c} } $$

Логически данный подход смещает оценку вероятностей в сторону менее вероятных исходов. Таким образом, слова которые мы не видели на этапе обучения модели получают пусть маленькую, но все же не нулевую вероятность. Вот как это выглядит на практике. Допустим на этапе обучения мы видели три имени собственных указанное количество раз.

ИмяЧастота
Вася3
Петя2
Женя1

И тут на этапе классификации у нас появляется имя Иннокентий, которое мы не видели на этапе обучения. Тогда оригинальная и смещённая по Лапласу оценка вероятностей будет выглядеть следующим образом.

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

Собираем все вместе

Подставив выбранные нами оценки в формулу №2 мы получаем окончательную формулу по которой происходит байесовская классификация.

$$ c_{map}=\operatorname*{arg\,max}_{c \in C} \left[ \log\frac{D_c}{D} + \sum_{i=1}^n\log{\frac{W_{ic}+1}{ |V|+\sum_{i’\in V} W_{i’c}}} \right] $$

Формула №4

Реализация классификатора

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

  • относительные частоты классов в корпусе документов. То есть, как часто встречаются документы того или иного класса;
  • суммарное количество слов в документах каждого класса;
  • относительные частоты слов в пределах каждого класса;
  • размер словаря выборки. Количество уникальных слов в выборке.

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

$$ \log\frac{D_c}{D} + \sum_{i \in Q}\log{\frac{W_{ic}+1}{ |V|+L_{c} }} $$

Упрощенная запись формулы №4

в этой формуле:

  • $D_c$ — количество документов в обучающей выборке принадлежащих классу $c$;
  • $D$ — общее количество документов в обучающей выборке;
  • $|V|$ — количество уникальных слов во всех документах обучающей выборки;
  • $L_{c}$ — суммарное количество слов в документах класса $c$ в обучающей выборке;
  • $W_{ic}$ — сколько раз $i$-ое слово встречалось в документах класса $c$ в обучающей выборке;
  • $Q$ – множество слов классифицируемого документа (включая повторы).

Информация необходимая для осознания смысла этого выражения приведена выше в разделе Теория.

Пример

Допустим, у нас есть три документа для которых известны их классы (HAM означает – не спам):

  • [SPAM] предоставляю услуги бухгалтера;
  • [SPAM] спешите купить виагру;
  • [HAM] надо купить молоко.

Модель классификатора будет выглядеть следующим образом:

 spamham
частоты классов21
суммарное количество слов63
 spamham
предоставляю10
услуги10
бухгалтера10
спешите10
купить11
виагру10
надо01
молоко01

Теперь классифицируем фразу “надо купить сигареты”. Рассчитаем значение выражения для класса SPAM:

$$ \log\frac{2}{3} + \log\frac{1}{8+6} + \log\frac{2}{8+6} + \log\frac{1}{8+6} \approx -7.629 $$

Теперь сделаем то же самое для класса HAM:

$$ \log\frac{1}{3} + \log\frac{2}{8+3} + \log\frac{2}{8+3} + \log\frac{1}{8+3} \approx -6.906 $$

В данном случае класс HAM выиграл и сообщение не будет помечено как спам.

Формирование вероятностного пространства

В простейшем случае вы выбираете класс который получил максимальную оценку. Но если вы например хотите помечать сообщение как спам только если соответствующая вероятность больше 80%, то сравнение логарифмических оценок вам ничего не даст. Оценки которые выдает алгоритм не удовлетворяют двум формальным свойствам которым должны удовлетворять все вероятностные оценки:

  • они все должны быть в диапазоне от нуля до единицы;
  • их сумма должна быть равна единице.

Для того чтобы решить эту задачу, необходимо из логарифмических оценок сформировать вероятностное пространство. А именно: избавиться от логарифмов и нормировать сумму по единице.

Здесь — это логарфмическая оценка алгоритма для класса , а возведение (основание натурального логарфима) в степерь оценки используется для того чтобы избавиться от логарифма (). Таким образом, если вы в рассчетах использовали не натуральный логарифм, а десятичный, вам необходимо использовать не , а 10.

Для вышеприведенного примера вероятность что сообщение спам равно:

то есть сообщение является спамом с вероятностью 32.7%.

В комментариях читатели обратили внимание на алгебраическую оптимизацию, которая позволяет избежать арифметического переполнения при делении экспонент друг на друга. Если сократить экспоненту оценки текущего класса в числителе и знаменателе, то в общем виде получим:

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

В заключении

Show me the code

На github доступен пример описанного классификатора реализованный на Scala. Имплементация занимает 50 с лишним строк кода, разобраться с ним у вас не составит труда, просто посмотрите тест ClassifierSpec. Для запуска тестов необходим Maven.

Вопросы оставшиеся за бортом

Сушествует целый ряд вопросов который остался без рассмотрения на текущий момент:

Учитывая объем данного поста, эти вопросы я смело оставляю для будущих заметок.

Please enable JavaScript to view the comments powered by Disqus.

Байесовский классификатор · Loginom Wiki

Синонимы: Простой байесовский классификатор, Байесовская классификация, Наивный байесовский классификатор, Naive Bayes

Разделы: Алгоритмы

В машинном обучении — семейство простых вероятностных классификаторов, основанных на использовании теоремы Байеса и «наивном» предположении о независимости признаков классифицируемых объектов.

Анализ на основе байесовской классификации активно изучался и использовался начиная с 1950-х годов в области классификации документов, где в качестве признаков использовались частоты слов. Алгоритм является масштабируемым по числу признаков, а по точности сопоставим с другими популярными методами, такими как машины опорных векторов.

Как и любой классификатор, байесовский присваивает метки классов наблюдениям, представленным векторами признаков. При этом предполагается, что каждый признак независимо влияет на вероятность принадлежности наблюдения к классу. Например, объект можно считать яблоком, если он имеет округлую форму, красный цвет и диаметр около 10 см. Наивный байесовский классификатор «считает», что каждый из этих признаков независимо влияет на вероятность того, что этот объект является яблоком, независимо от любых возможных корреляций между характеристиками цвета, формы и размера.

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

По сути, байесовский классификатор представляет собой вероятностную модель. Пусть задано множество наблюдений, каждое из которых представлено вектором признаков x=(x1,x2,…,xn). Модель присваивает каждому наблюдению условную вероятность p(Ck|x1,x2,…,xn), Ck — класс.

Используя теорему Байеса, можно записать:

p(Ck|x)=p(Ck)p(x|Ck)p(x)

В этой формуле интерес с точки зрения классификации представляет только числитель, поскольку знаменатель от метки классов не зависит и является константой. При условии, что признаки независимы, можно показать, что

p(Ck|x1,x2,…,xn)=p(Ck)p(x1|Ck)p(x2|Ck)…p(xn|Ck)=∏np(xi|Ck).

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

y=argkmax1…k∏np(xi|Ck)

Таким образом, выбирается класс Ck, который максимизирует функцию правдоподобия, представляющую собой произведение условных вероятностей значений признака xi по каждому классу Ck.

Вероятностный классификатор предсказывает класс с самой большой условной вероятностью для заданного вектора признаков x.

1.9. Наивный байесовский метод — документация scikit-learn 0.23.2

Наивные методы Байеса представляют собой набор алгоритмов контролируемого обучения
основанный на применении теоремы Байеса с «наивным» предположением
условная независимость между каждой парой функций с учетом
значение переменной класса. Теорема Байеса утверждает следующее
связь, заданная переменная класса \ (y \) и зависимая функция
вектор от \ (x_1 \) до \ (x_n \),:

\ [P (y \ mid x_1, \ dots, x_n) = \ frac {P (y) P (x_1, \ dots, x_n \ mid y)}
{P (x_1, \ dots, x_n)} \]

Используя наивное предположение об условной независимости,

\ [P (x_i | y, x_1, \ dots, x_ {i-1}, x_ {i + 1}, \ dots, x_n) = P (x_i | y), \]

для всех \ (i \), это соотношение упрощается до

\ [P (y \ mid x_1, \ dots, x_n) = \ frac {P (y) \ prod_ {i = 1} ^ {n} P (x_i \ mid y)}
{P (x_1, \ dots, x_n)} \]

Поскольку \ (P (x_1, \ dots, x_n) \) константа на входе,
мы можем использовать следующее правило классификации:

\ [\ begin {align} \ begin {align} P (y \ mid x_1, \ dots, x_n) \ propto P (y) \ prod_ {i = 1} ^ {n} P (x_i \ mid y) \\ \ Downarrow \\\ hat {y} = \ arg \ max_y P (y) \ prod_ {i = 1} ^ {n} P (x_i \ mid y), \ end {align} \ end {align} \]

, и мы можем использовать оценку Maximum A Posteriori (MAP) для оценки
\ (P (y) \) и \ (P (x_i \ mid y) \);
первое — тогда относительная частота класса \ (y \)
в обучающем наборе.

Различные наивные байесовские классификаторы различаются главным образом допущениями, которые они
make относительно распределения \ (P (x_i \ mid y) \).

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

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

С другой стороны, хотя наивный Байес известен как приличный классификатор,
известно, что это плохая оценка, поэтому вероятность выходит из
pred_proba не следует воспринимать слишком серьезно.2_y} \ справа) \]

Параметры \ (\ sigma_y \) и \ (\ mu_y \)
оцениваются с использованием максимального правдоподобия.

 >>> из sklearn.datasets import load_iris
>>> из sklearn.model_selection import train_test_split
>>> from sklearn.naive_bayes импортировать GaussianNB
>>> X, y = load_iris (return_X_y = True)
>>> X_train, X_test, y_train, y_test = train_test_split (X, y, test_size = 0.5, random_state = 0)
>>> gnb = GaussianNB ()
>>> y_pred = gnb.fit (X_train, y_train) .predict (X_test)
>>> print ("Количество неправильно обозначенных точек из общего количества% d точек:% d"
...% (X_test.shape [0], (y_test! = Y_pred) .sum ()))
Количество неправильно маркированных точек из 75 баллов: 4
 

1.9.2. Полиномиальный наивный байесовский код

MultinomialNB реализует наивный алгоритм Байеса для полиномиального
распределенных данных, и является одним из двух классических наивных вариантов Байеса, используемых в
классификация текста (где данные обычно представлены как вектор слов
подсчитывает, хотя известно, что векторы tf-idf также хорошо работают на практике).Распределение параметризуется векторами
\ (\ theta_y = (\ theta_ {y1}, \ ldots, \ theta_ {yn}) \)
для каждого класса \ (y \), где \ (n \) — количество функций
(при классификации текста размер словарного запаса)
а \ (\ theta_ {yi} \) — вероятность \ (P (x_i \ mid y) \)
признака \ (i \), появляющегося в выборке, принадлежащей классу \ (y \).

Параметры \ (\ theta_y \) оцениваются сглаженным
версия максимального правдоподобия, т.е. подсчет относительной частоты:

\ [\ hat {\ theta} _ {yi} = \ frac {N_ {yi} + \ alpha} {N_y + \ alpha n} \]

где \ (N_ {yi} = \ sum_ {x \ in T} x_i \) равно
количество раз, когда функция \ (i \) появляется в выборке класса \ (y \)
в обучающей выборке \ (T \),
и \ (N_ {y} = \ sum_ {i = 1} ^ {n} N_ {yi} \) — общее количество
все функции для класса \ (y \).

Априорное сглаживание \ (\ alpha \ ge 0 \) составляет
функции, отсутствующие в обучающих выборках и предотвращающие нулевые вероятности
в дальнейших расчетах.
Установка \ (\ alpha = 1 \) называется сглаживанием Лапласа,
а \ (\ alpha <1 \) называется сглаживанием Лидстоуна.

1.9.3. Дополнение наивного байеса

.

1.9. Наивный байесовский метод — документация scikit-learn 0.19.1

Наивные методы Байеса представляют собой набор алгоритмов контролируемого обучения
основанный на применении теоремы Байеса с «наивным» предположением о независимости
между каждой парой функций. Учитывая переменную класса и
зависимый вектор признаков,
Теорема Байеса утверждает следующее соотношение:

Используя наивное предположение о независимости,

для всех, эта связь упрощается до

Поскольку на входе задано постоянное значение,
мы можем использовать следующее правило классификации:

, и мы можем использовать оценку Maximum A Posteriori (MAP) для оценки
а также ;
первое — это относительная частота занятий
в обучающем наборе.

Различные наивные байесовские классификаторы различаются главным образом допущениями, которые они
сделать в отношении распространения.

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

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

С другой стороны, хотя наивный Байес известен как приличный классификатор,
известно, что это плохая оценка, поэтому вероятность выходит из
pred_proba не следует воспринимать слишком серьезно.

1.9.1. Гауссовский наивный байесовский

GaussianNB реализует алгоритм Gaussian Naive Bayes для
классификация. Предполагается, что вероятность появления признаков гауссова:

Параметры и
оцениваются с использованием максимального правдоподобия.

 >>> из наборов данных импорта sklearn
>>> iris = datasets.load_iris ()
>>> from sklearn.naive_bayes импортировать GaussianNB
>>> gnb = GaussianNB ()
>>> y_pred = gnb.подходят (iris.data, iris.target) .predict (iris.data)
>>> print ("Количество неправильно обозначенных точек из общего количества% d точек:% d"
...% (iris.data.shape [0], (iris.target! = y_pred) .sum ()))
Количество неправильно обозначенных точек из 150 баллов: 6
 

1.9.3. Бернулли Наивный Байес

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

Решающее правило для наивного Байеса Бернулли основано на

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

В случае классификации текста векторы встречаемости слов (а не слова
count векторов) можно использовать для обучения и использования этого классификатора. БернуллиNB
может работать лучше с некоторыми наборами данных, особенно с более короткими документами.
Желательно оценить обе модели, если позволяет время.

1.9.4. Нестандартный пример наивной байесовской модели

Наивные байесовские модели могут использоваться для решения крупномасштабных задач классификации
для которых полный обучающий набор может не поместиться в памяти.Чтобы справиться с этим делом,
MultinomialNB , BernoulliNB и GaussianNB
предоставить метод partial_fit , который можно использовать
постепенно, как это делается с другими классификаторами, как показано на
Внеосновная классификация текстовых документов. Все наивный байесовский
классификаторы поддерживают взвешивание выборки.

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

Для обзора доступных стратегий в scikit-learn см. Также
внепрофильная учебная документация.

Примечание

Вызов метода partial_fit наивных байесовских моделей вводит некоторые
вычислительные накладные расходы. Рекомендуется использовать такие размеры блоков данных, как
насколько это возможно, насколько позволяет доступная оперативная память.

.

Naive Bayes Tutorial: наивный байесовский классификатор в Python

Классификация и прогнозирование — два наиболее важных аспекта машинного обучения, а наивный байесовский алгоритм — это простой, но удивительно мощный алгоритм для прогнозного моделирования. Итак, ребята, в этом руководстве по Наивному Байесу я затрону следующие темы:

  • Что такое наивный байесовский метод?
  • Что такое теорема Байеса?
  • Прогнозирование игр с использованием теоремы Байеса
  • Наивный байесовский метод в промышленности
  • Пошаговая реализация наивного байесовского метода
  • Наивный байесовский код с SKLEARN

Что такое наивный байесовский метод?

Наивный Байесовский алгоритм — один из самых простых, но наиболее мощных алгоритмов классификации , основанный на теореме Байеса с предположением независимости предсказателей.Наивную байесовскую модель легко построить, и она особенно полезна для очень больших наборов данных. Этот алгоритм состоит из двух частей:

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

Что такое теорема Байеса.

В статистике и теории вероятностей теорема Байеса описывает вероятность события, основанную на предварительном знании условий, которые могут быть связаны с событием. Он служит способом определения условной вероятности.

Учитывая гипотезу ( H) и свидетельство ( E) , теорема Байеса утверждает, что связь между вероятностью гипотезы до получения свидетельства, P (H) , и вероятностью гипотезы после получения доказательства P (H | E) , составляет:

По этой причине P (H) называется априорной вероятностью , а P (H | E) называется апостериорной вероятностью .Фактор, который связывает эти два, P (H | E) / P (E) , называется отношением правдоподобия . Используя эти термины, теорему Байеса можно перефразировать так:

«Апостериорная вероятность равна априорной вероятности, умноженной на отношение правдоподобия».

Немного запутались? Не волнуйся. Давайте продолжим наше руководство по Наивному Байесу и разберемся с этой концепцией с помощью простой концепции.

Пример теоремы Байеса

Предположим, у нас есть колода карт, и мы хотим выяснить, с какой вероятностью случайно выбранная карта окажется королем, учитывая, что это лицевая карта.Итак, согласно теореме Байеса, мы можем решить эту проблему. Для начала нам нужно узнать вероятность:

  • P (Король) , что составляет 4/52 , поскольку в колоде карт 4 короля.
  • P (Face | King) равно 1 , поскольку все короли являются лицевыми картами.
  • P (лицо) равно 12/52 , так как в масти из 13 карт 3 лицевые карты, а всего в масти 4 масти.

Теперь, сложив вместе все значения в уравнении Байеса, мы получаем результат 1/3 .

Прогнозирование игр с использованием теоремы Байеса

Давайте продолжим наше руководство по Наивному Байесу и спрогнозируем будущее с некоторыми погодными данными.

Здесь у нас есть наши данные, которые включают день, прогноз, влажность и ветровые условия. Последний столбец — «Играть», то есть можем ли мы играть на улице, что мы должны предсказать.

  • Сначала мы создадим таблицу частот , используя каждый атрибут набора данных.

  • Для каждой таблицы частот мы сгенерируем таблицу правдоподобия .

  • Вероятность « Да » для « Санни » составляет:
    • P (c | x) = P (Да | Солнечно) = P (Солнечно | Да) * P (Да) / P (Солнечно) = (0,3 x 0,71) / 0,36 = 0,591
  • Точно так же вероятность «» при « Sunny » составляет:
    • P (c | x) = P (Нет | Солнечно) = P (Солнечно | Нет) * P (Нет) / P (Солнечно) = (0,4 x 0,36) / 0,36 = 0,40
  • Теперь таким же образом нам нужно создать таблицу правдоподобия и для других атрибутов.

Предположим, у нас есть День со следующими значениями:

  • Outlook = дождь

  • Влажность = высокая

  • Ветер = Слабый

  • Играть =?

Итак, имея данные, мы должны предсказать, «сможем ли мы сыграть в этот день или нет».

  • Вероятность «Да» в этот день = P (прогноз = дождь | Да) * P (влажность = высокая | да) * P (ветер = слабый | да) * P (да)

  • Вероятность отказа в этот день = P (прогноз = дождь | нет) * P (влажность = высокая | нет) * P (ветер = слабый | нет) * P (нет)

Теперь, когда мы нормализуем значение, получаем:

  • P (Да) = 0.0199 / (0,0199+ 0,0166) = 0,55
  • P (Нет) = 0,0166 / (0,0199+ 0,0166) = 0,45

Наша модель предсказывает, что существует вероятность 55% , что завтра будет игра.

Наивный байесовский метод в промышленности

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

RSS-каналы

Наш первый промышленный пример использования — это категоризация новостей, или мы можем использовать термин «классификация текста», чтобы расширить спектр этого алгоритма.Новости в сети быстро растут, и каждый новостной сайт имеет свой собственный макет и категоризацию для группирования новостей. Компании используют поискового робота для извлечения полезного текста из HTML-страниц новостных статей для создания полнотекстового RSS. Содержание каждой новостной статьи — это токенизированный (по категориям). Чтобы добиться лучших результатов классификации, мы удаляем из документа менее значимые слова, то есть стоп. Мы применяем наивный байесовский классификатор для классификации новостного контента на основе кода новостей.

Фильтрация спама

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

Определенные слова имеют особую вероятность встретиться в спам-сообщениях и в законных сообщениях электронной почты.Например, большинство пользователей электронной почты часто сталкиваются со словами «Лотерея» и «Розыгрыш удачи» в спам-письмах, но редко встречают их в других электронных письмах. Каждое слово в электронном письме влияет на вероятность спама или только на самые интересные слова. Этот вклад называется апостериорной вероятностью и вычисляется с использованием теоремы Бэйеса . Затем вероятность спама в электронном письме вычисляется по всем словам в электронном письме, и если общее количество превышает определенный порог (скажем, 95%), фильтр помечает электронное письмо как спам.

Медицинский диагноз

В настоящее время современные больницы хорошо оснащены устройствами для мониторинга и сбора других данных, что приводит к непрерывному сбору огромного количества данных посредством медицинских осмотров и лечения. Одним из главных преимуществ наивного байесовского подхода, который привлекает врачей, является то, что «вся доступная информация используется для объяснения решения». Это объяснение кажется «естественным» для медицинского диагноза и прогноза, т.е.е. близок к тому, как врачи ставят диагноз пациентам.

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

Прогноз погоды

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

Пошаговая реализация наивного байесовского метода

Здесь у нас есть набор данных, состоящий из 768 наблюдений за женщинами в возрасте 21 года и старше. Набор данных описывает мгновенные измерения, сделанные у пациентов, такие как возраст, анализ крови и количество беременностей. Каждая запись имеет значение класса, которое указывает, развилось ли у пациента диабет в течение 5 лет. Значения: 1 для диабетиков и 0 для недиабетиков.

А теперь давайте продолжим наше руководство по Наивному Байесу и разберемся со всеми шагами, один за другим. Я разбил весь процесс на следующие этапы:

  • Обработка данных

  • Обобщить данные

  • Делайте прогнозы

  • Оценить точность

Шаг 1. Обработка данных

Первое, что нам нужно сделать, это загрузить наш файл данных. Данные представлены в формате CSV без заголовка и кавычек.Мы можем открыть файл с помощью функции открытия и прочитать строки данных с помощью функции чтения в модуле CSV.

  импорт CSV
импорт математики
случайный импорт


def loadCsv (имя файла):
lines = csv.reader (open (r'C: \ Users \ Kislay \ Desktop \ pima-indians-diab.data.csv '))
набор данных = список (строки)
для i в диапазоне (len (набор данных)):
набор данных [i] = [float (x) для x в наборе данных [i]]
вернуть набор данных  

Теперь нам нужно разделить данные на наборы данных для обучения и тестирования.

  def splitDataset (набор данных, splitRatio):
trainSize = int (len (набор данных) * splitRatio)
trainSet = []
копия = список (набор данных)
в то время как len (trainSet) & amp; lt; поезд Размер:
индекс = случайный.randrange (len (копия))
trainSet.append (copy.pop (индекс))
возврат [trainSet, копия]  

Шаг 2: Обобщение данных

Сводка собранных данных обучения включает в себя среднее значение и стандартное отклонение для каждого атрибута по значению класса. Они требуются при прогнозировании для вычисления вероятности принадлежности значений конкретных атрибутов к каждому значению класса.

Мы можем разбить подготовку этих сводных данных на следующие подзадачи:

Раздельные данные по классам:

  def отдельныйByClass (набор данных):
разделенный = {}
для i в диапазоне (len (набор данных)):
вектор = набор данных [i]
если (вектор [-1] не разделен):
разделенные [вектор [-1]] = []
разделенный [вектор [-1]].добавить (вектор)
возврат разделенный  

Среднее значение:

  def означает (числа):
вернуть сумму (числа) / с плавающей запятой (len (числа))  

Вычислить стандартное отклонение:

  def stdev (числа):
avg = среднее (числа)
дисперсия = сумма ([pow (x-avg, 2) для x в числах]) / float (len (числа) -1)
вернуть math.sqrt (отклонение)  

Обобщите набор данных:

  def summarize (набор данных):
summaries = [(среднее (атрибут), стандартное отклонение (атрибут)) для атрибута в zip-архиве (* набор данных)]
дель резюме [-1]
сводки по возврату  

Обобщите атрибуты по классам:

  def summarizeByClass (набор данных):
разделенный = отдельныйByClass (набор данных)
резюме = {}
для classValue экземпляры разделены.Предметы():
summaries [classValue] = summarize (экземпляры)
сводки по возврату  

Шаг 3. Прогнозы

Теперь мы готовы делать прогнозы, используя сводки, подготовленные на основе наших обучающих данных. Выполнение прогнозов включает в себя вычисление вероятности того, что данный экземпляр данных принадлежит каждому классу, а затем выбор класса с наибольшей вероятностью в качестве прогноза. Нам необходимо выполнить следующие задачи:

Вычислить гауссову функцию плотности вероятности:

  def calculateProbability (x, mean, stdev):
экспонента = математика.ехр (- (math.pow (x-среднее, 2) / (2 * math.pow (stdev, 2))))
return (1 / (math.sqrt (2 * math.pi) * stdev)) * показатель  

Вычислить вероятности класса:

  def calculateClassProbabilities (сводки, inputVector):
вероятности = {}
для classValue, classSummaries в summaries.items ():
вероятности [classValue] = 1
для i в диапазоне (len (classSummaries)):
среднее, stdev = classSummaries [i]
x = inputVector [i]
вероятности [classValue] * = calculateProbability (x, mean, stdev)
вероятности возврата  

Сделайте прогноз:

  def прогноз (сводки, inputVector):
вероятности = calculateClassProbabilities (сводки, inputVector)
bestLabel, bestProb = Нет, -1
для classValue вероятность в вероятностях.Предметы():
если bestLabel - Нет или вероятность & amp; gt; bestProb:
bestProb = вероятность
bestLabel = classValue
вернуть bestLabel  

Сделать прогнозы:

  def getPredictions (сводки, testSet):
прогнозы = []
для i в диапазоне (len (testSet)):
результат = прогноз (сводки, набор тестов [i])
predictions.append (результат)
возврат прогнозов  

Получить точность:

  def getAccuracy (testSet, прогнозы):
правильно = 0
для x в диапазоне (len (testSet)):
if testSet [x] [- 1] == прогнозы [x]:
правильно + = 1
return (правильно / float (len (testSet))) * 100.0  

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

  def main ():
filename = 'пима-индейцы-диабет.data.csv'
splitRatio = 0,67
набор данных = loadCsv (имя файла)
trainingSet, testSet = splitDataset (набор данных, splitRatio)
print ('Разделить {0} строки на train = {1} и test = {2} rows'.format (len (набор данных), len (trainingSet), len (testSet)))
# подготовить модель
summaries = summarizeByClass (тренировочный набор)
# тестовая модель
predictions = getPredictions (резюме, testSet)
точность = getAccuracy (набор тестов, прогнозы)
print ('Точность: {0}%'.формат (точность))

основной ()  

Выход:

Итак, как видите, точность нашей модели составляет 66%. Теперь это значение отличается от модели к модели, а также от коэффициента разделения.

Теперь, когда мы увидели шаги, включенные в наивный байесовский классификатор, Python поставляется с библиотекой Sckit-learn, которая упрощает реализацию и использование всех вышеупомянутых шагов. Давайте продолжим наше руководство по Наивному Байесу и посмотрим, как это можно реализовать.

Наивный байесовский метод с изучением Sckit

Для нашего исследования мы собираемся использовать набор данных IRIS , который поставляется с библиотекой Sckit-learn.Набор данных содержит 3 класса по 50 экземпляров в каждом, где каждый класс относится к типу ириса. Здесь мы собираемся использовать модель GaussianNB, которая уже доступна в библиотеке Sckit-learn.

Импорт библиотек и загрузка наборов данных

  из наборов данных импорта sklearn
из показателей импорта sklearn
из sklearn.naive_bayes импортировать GaussianNB

& amp; nbsp;

набор данных = datasets.load_iris ()  

Создание нашей наивной байесовской модели с использованием Sckit-learn

Здесь у нас есть метод GaussianNB () , который выполняет те же функции, что и код, описанный выше:

  модель = GaussianNB ()
модель.подходят (набор данных, набор данных.целевой)  

Делаем прогнозы

  ожидается = dataset.target
предсказанный = model.predict (dataset.data)  

Получение точности и статистики

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

  печать (метрика.классификации_report (ожидаемый, прогнозируемый))
print (metrics.confusion_matrix (ожидаемый, прогнозируемый))  

Классификационный отчет:

Матрица неточностей:

Как видите, с помощью этой мощной библиотеки сотни строк кода можно свести всего в несколько строк кода.

Итак, на этом мы подошли к концу этого руководства по Наивному Байесу. Поздравляем, вы больше не новичок в Наивном Байесе! Надеюсь, вам понравился этот пост.Попробуйте прямо сейчас этот простой пример в своих системах.

.

Страница не найдена · GitHub Pages

Страница не найдена · GitHub Pages

Файл не найден

Сайт, настроенный по этому адресу, не
содержать запрошенный файл.

Если это ваш сайт, убедитесь, что регистр имени файла соответствует URL-адресу.
Для корневых URL (например, http://example.com/ ) вы должны предоставить
index.html файл.

Прочтите полную документацию
для получения дополнительной информации об использовании GitHub Pages .

.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *