Заметки о машинном обучении — наивный байесовский подход

математика

Краткое введение в формулу Байеса (Маошу)

 Теорема Байеса — это теорема об условной вероятности (или предельной вероятности) случайных событий A и B. где P(A|B) — вероятность того, что произойдет событие A, если произойдет событие B. Математически формула Байеса получается из формулы полной вероятности и формулы умножения.Процесс вывода выглядит следующим образом:

Из условной вероятности получаем:P(BiA)=P(ABi)P(A)P\left(B_{i} | A\right)=\frac{P\left(A B_{i}\right)}{P(A)}, используя формулу умножения для числителя и формулу полной вероятности для знаменателя:

P(ABi)=P(Bi)P(ABi)P\left(A B_{i}\right)=P\left(B_{i}\right) P\left(A | B_{i}\right)

P(A)=i=1nP(Bj)P(ABj)P(A)=\sum_{i=1}^{n} P\left(B_{j}\right) P\left(A | B_{j}\right)

Подставляем в исходную формулу, чтобы получить формулу Байеса:P(BA)=P(Bi)P(ABi)i=1nP(Bj)P(ABj)P(B|A)=\frac{P\left(B_{i}\right) P\left(A | B_{i}\right)}{\sum_{i=1}^{n} P\left(B_{j}\right) P\left(A | B_{j}\right)}

Naive Bayes (Li Shu)

 Наивный байесовский метод классификации, основанный на теореме Байеса и предположении о независимости признаков.

теоретический вывод

  Описание символа: Пространство выходного класса:y={c1,c2,,cK}y=\left\{c_{1}, c_{2}, \cdots, c_{K}\right\}Входной вектор признаков равен x

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

P(X=xY=ck)=P(X(1)=x(1),,X(n)=x(n)Y=ck)=j=1nP(X(j)=x(j)Y=ck)\begin{aligned} P\left(X=x | Y=c_{k}\right) =P\left(X^{(1)}=x^{(1)}, \cdots, X^{(n)}=x^{(n)} | Y=c_{k}\right) =\prod_{j=1}^{n} P\left(X^{(j)}=x^{(j)} | Y=c_{k}\right) \end{aligned}(1)

  В классификации с использованием Наивного Байеса для входных данных x мы обычно рассчитываем апостериорное распределение вероятностей с помощью изученной модели:P(Y=ckX=x)P\left( Y=c_{k}| X=x\right), а полученный класс с наибольшей вероятностью используется как выход класса x. Расчет апостериорной вероятности основан на формуле Байеса:P(Y=ckX=x)=P(X=xY=ck)P(Y=ck)kP(X=xY=ck)P(Y=ck)P\left(Y=c_{k} | X=x\right)=\frac{P\left(X=x | Y=c_{k}\right) P\left(Y=c_{k}\right)}{\sum_{k} P\left(X=x | Y=c_{k}\right) P\left(Y=c_{k}\right)}(2)

Из формулы (1) (2) можно получить:P(Y=ckX=x)=P(Y=ck)jP(X(j)=x(j)Y=ck)kP(Y=ck)jP(X(j)=x(j)Y=ck),k=1,2,,KP\left(Y=c_{k} | X=x\right)=\frac{P\left(Y=c_{k}\right) \prod_{j} P\left(X^{(j)}=x^{(j)} | Y=c_{k}\right)}{\sum_{k} P\left(Y=c_{k}\right) \prod_{j} P\left(X^{(j)}=x^{(j)} | Y=c_{k}\right)}, \quad k=1,2, \cdots, K

Тогда окончательный результат классификатора может быть выражен как:y=f(x)=argmaxckP(Y=ck)jP(X(j)=x(j)Y=ck)kP(Y=ck)jP(X(j)=x(j)Y=ck)y=f(x)=\arg \max _{c_{k}} \frac{P\left(Y=c_{k}\right) \prod_{j} P\left(X^{(j)}=x^{(j)} | Y=c_{k}\right)}{\sum_{k} P\left(Y=c_{k}\right) \prod_{j} P\left(X^{(j)}=x^{(j)} | Y=c_{k}\right)}(3)

Нетрудно видеть, что результаты знаменателя (3) одинаковы, поэтому результаты классификатора могут быть эквивалентны:y=argmaxckP(Y=ck)jP(X(j)=x(j)Y=ck)y=\arg\max_{c_{k}}P\left(Y=c_{k}\right)\prod_{j}P\left(X^{(j)}=x^{(j)} | Y=c_{k}\right)

Для вывода ожидаемой минимизации риска здесь == опущено ==

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

  В наивном байесовском методе есть два основных метода оценки вероятности: 1. Оценка максимального правдоподобия 2. Байесовская оценка. Здесь автор прямо приводит формулу без доказательства.

оценка максимального правдоподобия

априориP(Y=Ck)P(Y = C_k)Оценка максимального правдоподобия для:P(Y=ck)=i=1NI(yi=ck)N,k=1,2,,KP\left(Y=c_{k}\right)=\frac{\sum_{i=1}^{N} I\left(y_{i}=c_{k}\right)}{N}, \quad k=1,2, \cdots, K

Предположим, что функцияx(j)x^(j)Возможная коллекцияαj1aj2...ajSj{α_{j1} a_{j2} . .. a_jS_j },Условная возможностьP(X(j)=ajlY=ck)P\left(X^{(j)}=a_{j l} | Y=c_k)\right.Оценка максимального правдоподобия для:P(X(j)=ajlY=ck)=i=1NI(xi(j)=ajl,yi=ck)i=1NI(yi=ck)P\left(X^{(j)}=a_{j l} | Y=c_{k}\right)=\frac{\sum_{i=1}^{N} I\left(x_{i}^{(j)}=a_{j l}, y_{i}=c_{k}\right)}{\sum_{i=1}^{N} I\left(y_{i}=c_{k}\right)} j=1,2,,n;l=1,2,,Sj;k=1,2,,Kj=1,2, \cdots, n ; \quad l=1,2, \cdots, S_{j} ; \quad k=1,2, \cdots, K

Байесовская оценка

Хотя оценка максимального правдоподобия может получить значение оценки вероятности при известных условиях, будет ситуация, когда значение вероятности равно 0, что повлияет на последующие результаты расчета классификации.Байесовская оценка может решить эту проблему.Исходная формула вводитλбольше или равно0(обычно берите1)\lambda больше или равно 0 (обычно 1), байесовская оценка условной вероятности:Pλ(X(j)=ajlY=ck)=i=1NI(xi(j)=ajl,yi=ck)+λi=1NI(yi=ck)+SjλP_{\lambda}\left(X^{(j)}=a_{j l} | Y=c_{k}\right)=\frac{\sum_{i=1}^{N} I\left(x_{i}^{(j)}=a_{j l}, y_{i}=c_{k}\right)+\lambda}{\sum_{i=1}^{N} I\left(y_{i}=c_{k}\right)+S_{j} \lambda}Точно так же байесовская оценка вероятности полученной априорной вероятности:P\left(Y=c_{k} | X=x\right)=\frac{P\left(Y=c_{k}\right) \prod_{j} P\left(X^{(j)}=x^{(j)} | Y=c_{k}\right)}{\sum_{k} P\left(Y=c_{k}\right) \prod_{j} P\left(X^{(j)}=x^{(j)} | Y=c_{k}\right)}, \quad k=1,2, \cdots, K

Шаги алгоритма наивного Байеса

шаг 1: ввод обучающих данныхT={(x1,y1),(x2,y2),,(xN,yN)}T=\left\{\left(x_{1}, y_{1}\right),\left(x_{2}, y_{2}\right), \cdots,\left(x_{N}, y_{N}\right)\right\}Соответствующие оценки параметров вероятности (априорная вероятность и вероятность условного распределения) получаются на основе заданной модели данных:

P(Y=ck)=i=1NI(yi=ck)N,k=1,2,,KP\left(Y=c_{k}\right)=\frac{\sum_{i=1}^{N} I\left(y_{i}=c_{k}\right)}{N}, \quad k=1,2, \cdots, K

P(X(j)=ajlY=ck)=i=1NI(xi(j)=ajl,yi=ck)i=1NI(yi=ck)P\left(X^{(j)}=a_{j l} | Y=c_{k}\right)=\frac{\sum_{i=1}^{N} I\left(x_{i}^{(j)}=a_{j l}, y_{i}=c_{k}\right)}{\sum_{i=1}^{N} I\left(y_{i}=c_{k}\right)} j=1,2,,n;l=1,2,,Sj;k=1,2,,Kj=1,2, \cdots, n ; \quad l=1,2, \cdots, S_{j} ; \quad k=1,2, \cdots, K

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

P(Y=ckX=x)=P(Y=ck)jP(X(j)=x(j)Y=ck)kP(Y=ck)jP(X(j)=x(j)Y=ck),k=1,2,,KP\left(Y=c_{k} | X=x\right)=\frac{P\left(Y=c_{k}\right) \prod_{j} P\left(X^{(j)}=x^{(j)} | Y=c_{k}\right)}{\sum_{k} P\left(Y=c_{k}\right) \prod_{j} P\left(X^{(j)}=x^{(j)} | Y=c_{k}\right)}, \quad k=1,2, \cdots, K

step3: Выведите класс x:

y=argmaxckP(Y=ck)jP(X(j)=x(j)Y=ck)y=\arg \max _{c_{k}} P\left(Y=c_{k}\right) \prod_{j} P\left(X^{(j)}=x^{(j)} | Y=c_{k}\right)

Краткое описание алгоритма

Содержание в основном взято из главы 4 «Статистических методов обучения» учителя Ли Ханга, Здесь вывод байесовского метода основан на предположении, что все входные переменные условно независимы, и если между ними существует вероятностная зависимость, модель становится байесовской сетью, что требует последующего исследования и обучения.

Пример боя - разбор текста

Кратко

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

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

Определить пол

 При использовании гендерной базы данных библиотеки NLTK и наивного байесовского алгоритма для гендерной бинарной классификации основной принцип: использование эвристического метода, то есть последние несколько символов имени могут определять гендерные признаки. Например, если имя оканчивается на «ла», скорее всего, это женское имя, например «Анжела» или «Лейла». Кроме того, если имя заканчивается на «им», это, скорее всего, Мужские имена, такие как «Тим» или «Джим». Как только вы определили, сколько символов вам нужно использовать для определения пола, вы можете провести этот эксперимент. Далее, как определить пол.

import random
from nltk.corpus import names
from nltk import NaiveBayesClassifier
from nltk.classify import accuracy as nltk_accuracy

# 提取输入单词的特征
def gender_features(word, num_letters=2):
    return {'feature': word[-num_letters:].lower()}

if __name__=='__main__':
    # 提取特征名称
    labeled_names = ([(name, 'male') for name in names.words('male.txt')] +
            [(name, 'female') for name in names.words('female.txt')])

    random.seed(7)
    random.shuffle(labeled_names)
    input_names = ['Leonardo', 'Amy', 'Sam']

    # 搜索参数空间
    for i in range(1, 5):
        print('\nNumber of letters:', i)
        featuresets = [(gender_features(n, i), gender) for (n, gender) in labeled_names]
        train_set, test_set = featuresets[500:], featuresets[:500]
        classifier = NaiveBayesClassifier.train(train_set)

        # 打印分类器准确性
        print('Accuracy ==>', str(100 * nltk_accuracy(classifier, test_set)) + str('%'))

        # 预测新输入的结果
        for name in input_names:
            print(name, '==>', classifier.classify(gender_features(name, i)))



Number of letters: 1
Accuracy ==> 76.2%
Leonardo ==> male
Amy ==> female
Sam ==> male

Number of letters: 2
Accuracy ==> 78.60000000000001%
Leonardo ==> male
Amy ==> female
Sam ==> male

Number of letters: 3
Accuracy ==> 76.6%
Leonardo ==> male
Amy ==> female
Sam ==> female

Number of letters: 4
Accuracy ==> 70.8%
Leonardo ==> male
Amy ==> female
Sam ==> female

анализ эмоций

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

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

import nltk.classify.util
from nltk.classify import NaiveBayesClassifier
from nltk.corpus import movie_reviews
 
def extract_features(word_list):
    return dict([(word, True) for word in word_list])
 
if __name__=='__main__':
    # 加载积极与消极评论
    positive_fileids = movie_reviews.fileids('pos')
    negative_fileids = movie_reviews.fileids('neg')
     
    features_positive = [(extract_features(movie_reviews.words(fileids=[f])), 
            'Positive') for f in positive_fileids]
    features_negative = [(extract_features(movie_reviews.words(fileids=[f])), 
            'Negative') for f in negative_fileids]
     
    # 训练与测试数据集比例为(80/20)
    threshold_factor = 0.8
    threshold_positive = int(threshold_factor * len(features_positive))
    threshold_negative = int(threshold_factor * len(features_negative))
     
    features_train = features_positive[:threshold_positive] + features_negative[:threshold_negative]
    features_test = features_positive[threshold_positive:] + features_negative[threshold_negative:]  
    print("\nNumber of training datapoints:", len(features_train))
    print("Number of test datapoints:", len(features_test))
     
    # 训练朴素贝叶斯分类器
    classifier = NaiveBayesClassifier.train(features_train)
    print("\nAccuracy of the classifier:", nltk.classify.util.accuracy(classifier, features_test))

    print("\nTop 10 most informative words:")
    for item in classifier.most_informative_features()[:10]:
        print(item[0])

    # 输入简单的评论
    input_reviews = [
        "but it worked great. Dried my hair in about 15 minutes",
        "Excellent value for travel dryer on a budget",
        "Great hair dryer.",
        "The direction was terrible and the story was all over the place" 
    ]

    print("\nPredictions:")
    for review in input_reviews:
        print("\nReview:", review)
        probdist = classifier.prob_classify(extract_features(review.split()))
        pred_sentiment = probdist.max()
        print("Predicted sentiment:", pred_sentiment) 
        print("Probability:", round(probdist.prob(pred_sentiment), 2))
Number of training datapoints: 1600
Number of test datapoints: 400

Accuracy of the classifier: 0.735

Top 10 most informative words:
outstanding
insulting
vulnerable
ludicrous
uninvolving
avoids
astounding
fascination
symbol
animators

Predictions:

Review: but it worked great. Dried my hair in about 15 minutes
Predicted sentiment: Negative
Probability: 0.63

Review: Excellent value for travel dryer on a budget
Predicted sentiment: Negative
Probability: 0.62

Review: Great hair dryer.
Predicted sentiment: Positive
Probability: 0.54

Review: The direction was terrible and the story was all over the place
Predicted sentiment: Negative
Probability: 0.63

резюме

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

Ссылаться на

  • Мао Шисон «Теория вероятностей и математическая статистика».
  • Ли Ханг, "Статистические методы обучения"
  • Пратик Джоши «Классический случай машинного обучения Python»