c

codeye

V1

2022/10/01阅读:29主题:默认主题

朴素贝叶斯分类算法

朴素贝叶斯分类算法 多项式和高斯朴素贝叶斯的解释

朴素贝叶斯是一种有监督的机器学习方法,是概率分类器家族的一员。它采用贝叶斯定理的天真方法。天真 "这个词的含义是假设每个特征都是独立的。

在这篇博文中,我将分别谈一谈条件概率和贝叶斯定理,这是前提条件。然后,我将谈一谈两种最常用的奈何贝叶斯算法,即多项式和高斯奈何贝叶斯。接下来,我将用Python从头开始写一个Naive Bayes模型。最后,我将展示它在SKlearn中的应用。

条件概率 条件概率是一个事件发生的概率,基于另一个事件的发生。

条件概率 假设我们在我们的同事中进行了一项调查。谁是IOS的狂热者,谁是喜欢安卓的另类?

虽然他们中的一些人选择了其中的任何一个,但有两个人无法决定,并表示他们两个都非常喜欢。有些人因为要去尼泊尔的静默营,所以对这两种都敬而远之。

或然率表

现在让我们来找一找在喜欢IOS的情况下喜欢Android的人的概率。

我们有18个样本,其中3个同时喜欢。在18个人中,我们有9个人喜欢IOS。当我们做数学计算时,我们发现条件概率为0.33。

贝叶斯定理

贝叶斯定理是以统计学家托马斯-贝叶斯的名字命名的。贝叶斯定理有一个公式。由于这个公式,当新的信息出现时,它允许预测、假设被更新。它使用的是条件概率的概念。

贝叶斯定理的公式

让我们从文献中经常提到的一项研究开始。丹尼尔-卡尼曼和阿莫斯-特维斯基是获得诺贝尔奖的社会科学家。他们研究了人们在做决定时如何做出非理性的行为。

让我把你介绍给史蒂夫。

史蒂夫非常害羞和孤僻,总是乐于助人,但对人和现实世界的兴趣很低。他是一个温顺和整洁的灵魂,对秩序和结构有需求,对细节有热情。

你觉得以下哪种情况更有可能。

史蒂夫是一个图书馆员,或者史蒂夫是一个农民。

根据卡尼曼和特维斯基的说法,在人们得到对史蒂夫的这种描述后,大多数人都说他更有可能是一个图书管理员而不是一个农民。因为这个描述更符合人们对图书馆员的刻板印象。然而,这是不理性的。

没有人想过农民和图书管理员的比例。在论文中,科学家们表示,在美国,这个比例大约是20比1。而且,我们假设70%的图书管理员符合描述,所有农民中的10%符合描述。

史蒂夫是图书管理员的概率是10/210。我们假设,鉴于图书馆员符合描述的比例为70%。而一个人具有该描述的概率是20(农民)+7(图书管理员)。

经过计算,我们发现符合描述的史蒂夫是图书馆员的概率是26%。

农民。

实际上,这只是7(符合描述的图书馆员)与符合描述的总人数的比率 l | d = 7 / 7 + 20

多项式朴素贝叶斯

多项式奈何贝叶斯算法是文本分类问题中广泛使用的算法。这种方法使用贝叶斯理论计算每个类别的概率,并将具有最大概率的类别作为结果返回。这里的 "naive "一词表示特征间的独立性。也就是说,天真贝叶斯在评估一个句子时不考虑单词的顺序。

让我们以检查电子邮件的垃圾邮件为例。由于我们使用的是监督学习方法,我们有普通邮件和垃圾邮件的例子。我们计算了这些例子中的单词。例如,我们在普通邮件中共有17个单词,其中8个是 "亲爱的 "单词。

让我们计算一下每个词的条件概率。

P(Dear|Normal) = 8 / 17 = 0.47

想象一下,我们收到一条新的信息,上面写着 "午餐会议"。

我们首先从两种情况的初始预测开始。P(N)正常邮件的概率是正常邮件的数量与转录样本总数的比率。我们的训练数据中有8封正常邮件和4封垃圾邮件。

所以,P(N) = 8 / 12 = 0.67 我们在这里做出的初始猜测被称为先验概率。

P(N) * P(午餐|N) * P(会议|N) = 0.67 * 0.18 * 0.29 = 0.034

我们可以把0.034看作是Lunch Meeting得到的分数,如果它是一个正常的邮件。

P(S)*P(Lunch|S)*P(Meeting|S) = 0.33 * 0 * 0.14 = 0

在上述案例中,在训练数据集中的垃圾邮件例子中,午餐这个词并不包含在邮件中。因此,不管是什么类型的邮件,如果午餐这个词出现在其中,该邮件的垃圾邮件得分将直接为零。为了防止这种情况,我们在所有样本中加入一个我们用阿尔法值确定的数字。通常情况下,这个值是1。

P(N) * P(Lunch|N) * P(Meeting|N) = 0.67 * 0.19 * 0.29 = 0.037

P(S) * P(Lunch|S)*P(Meeting|S) = 0.33 * 0.09 * 0.18 = 0.005

由于正常邮件的得分高于垃圾邮件的得分,我们将该邮件分类为正常邮件(0.037>0.005)。

高斯朴素贝叶斯法 用于连续数据的情况。它利用了高斯正态分布。

比方说,我们有三个特征,财富、年龄和每天的糖消费量。我们正试图了解这些人是否喜欢打篮球。我们有每个特征的高斯分布。

对不起,画得太草率了,但你已经明白了。 为了进行预测,我们从最初的猜测开始。我们在训练数据集中有16个人的数据,其中一半人喜欢打高尔夫。我们将预测一个拥有400单位财富、40岁、25单位糖分的人。(这些数字是我编的)。

先验概率。

P(喜欢高尔夫) = 8 / 16 = 0.5

P(~喜欢高尔夫) = 0.5

然后我们计算给定的人的每个特征的可能性。

喜欢高尔夫的分数 = 0.5 * L(财富|喜欢) * L(年龄|喜欢) * L(糖|喜欢)

我们从高斯正态分布中得到似然值。它是与X轴坐标相对应的曲线上的Y轴坐标。例如,对于财富=400,L(Wealth|Likes)将是0.06

喜欢高尔夫的分数 = 0.5 * 0.06 * 0.004 * 0.0...00000001

为了处理较小的可能性值,通常会对所有的东西进行对数处理。

ln(喜欢高尔夫分数) = ln(0.5 * 0.06 * 0.004 * 0.0...00000001)

ln(Likes Golf Score) = ln(0.5) + ln(0.06) + ln(0.004) + ln(0.0...00000001)

ln(喜欢高尔夫分数) = -124

ln(~(不)喜欢高尔夫分数) = ln(0.5) + ln(0.0...00000001) + ln(0.000079) + ln(0.02)

ln(~喜欢高尔夫的分数) = -48

由于不喜欢高尔夫的分数比喜欢高尔夫的分数大,我们把这个人归类为不喜欢打高尔夫的人。

Python代码

import nltk
nltk.download('stopwords')
import pandas as pd
import numpy as np
from nltk.corpus import stopwords
import string
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.preprocessing import LabelBinarizer
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score

df = pd.read_csv("spam.csv",encoding='iso8859_14')
df.drop(labels=df.columns[2:],axis=1,inplace=True)
df.columns=['target','text']

def clean_util(text):
    punc_rmv = [char for char in text if char not in string.punctuation]
    punc_rmv = "".join(punc_rmv)
    stopword_rmv = [w.strip().lower() for w in punc_rmv.split() if w.strip().lower() not in stopwords.words('english')]
    
    return " ".join(stopword_rmv)
df['text'] = df['text'].apply(clean_util)

cv = CountVectorizer()
X = cv.fit_transform(df['text']).toarray()
lb = LabelBinarizer()
y = lb.fit_transform(df['target']).ravel()

# Train Test Split
X_train, X_test, y_train, y_test = train_test_split(X,y)

clf = MultinomialNB(alpha=1)
clf.fit(X,y)
y_pred = clf.predict(X_test)

多项式贝叶斯

print('Accuracy',accuracy_score(y_test, y_pred),y_pred)
#Accuracy 0.9913854989231874

高斯朴素贝叶斯


import pandas as pd
import matplotlib.pyplot as plt
from sklearn.pipeline import make_pipeline
from sklearn.naive_bayes import GaussianNB
from sklearn.preprocessing import QuantileTransformer
from sklearn.metrics import roc_curve, auc

plt.style.use('bmh')
plt.rcParams['figure.figsize'] = (10, 10)
title_config = {'fontsize': 20, 'y': 1.05}
train = pd.read_csv('D:\\Documents\\Desktop\\train.csv')

X_train = train.iloc[:, 2:].values.astype('float64')
y_train = train['target'].values

pipeline = make_pipeline(QuantileTransformer(output_distribution='normal'), GaussianNB())
pipeline.fit(X_train, y_train)

fpr, tpr, thr = roc_curve(y_train, pipeline.predict_proba(X_train)[:,1])
plt.plot(fpr, tpr)
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic Plot', **title_config)
auc(fpr, tpr)

谢谢你的阅读。

阅读更多...

分类:

后端

标签:

后端

作者介绍

c
codeye
V1