Naive Bayes 朴素贝叶斯
Scatter plot 散点图
Decision Surface Linea 决策线
朴素贝叶斯 是一个常见的寻找决策面的算法
Bayes Rule 贝叶斯规则
无人驾驶汽车是一个重要的监督分类(supervised classification)问题
监督:表示你有许多样本,我们可以说,你了解这些样本的正确答案
Acerous 还是 Non-Acerous?
机器学习主要是从实例中学习,给机器举一大堆案例,每个案例都有许多特征和属性,
如果可以挑出正确的特征,它会给你正确的信息,然后就可以对新的案例进行分类
如何利用机器学习算法来正确处理这类问题?
监督式分类示例
- □ 拿一册带标签的照片,试着认出照片中的某个人
- □ 对银行数据进行分析,寻找异常的交易,将其标记为涉嫌欺诈
- □ 根据某人的音乐喜好以及其所爱音乐的特点,比如节奏或流派推荐一首他们可能会喜欢的歌
- □ 根据优达学城学生的学习风格,将其分成不同的组群
第一个是的,第二个不是,因为并没有给出异常交易的明确定义,第三个是,第四个不是,属于聚类问题
特征和标签音乐示例
Features & Labels 特征和标签
在机器学习中,我们通常会把特征作为输入,然后尝试生成标签
比如你听一首歌,它的特征可能是强度、歌曲节奏或者流派或声音性别等信息
然后你的大脑会将它处理为两个类别中的一个喜欢或者不喜欢
从散点图到决策面
机器学习算法能做什么呢?它们可以定义决策面 scatter plot decision surface
决策面通常位于两个不同的类之间的某个位置上
良好的线性决策面
当决策面为直线的时候,我们称它为线性决策面
机器学习算法所做的是 获取数据->并将其转化成一个决策面(D.S)
转为使用朴素贝叶斯
Naive Bayes 是一个常见的寻找这样的决策面的算法
Python 中的 NB 决策边界
Sklearn 使用入门
scikit-learn,经常缩写为sklearn
高斯朴素贝叶斯示例
Google 搜索 sklearn navie bayes
打开链接http://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.GaussianNB.html
>>> import numpy as np >>> X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]]) >>> Y = np.array([1, 1, 1, 2, 2, 2])
#上面的代码是用来生成一些可以利用的训练点 >>> from sklearn.naive_bayes import GaussianNB
#把外部模块引入你编写的代码里 >>> clf = GaussianNB()#创建分类器,把GaussianNB赋值给clf(分类器) >>> clf.fit(X, Y)#fit替代了train,这里是我们实际提供训练数据的地方
#它会学习各种模式,然后就形成了我们刚刚创建的分类器(clf)
#我们在分类器上调用fit函数,接下来将两个参数传递给fit函数,一个是特征x一个是标签y
#在监督分类中这个过程都是如此,先调用fit函数,然后依次获得特征和标签 GaussianNB(priors=None)
#最后我们让已经完成了训练的分类器进行一些预测,我们为它提供一个新点[-0.8,-1]
#我们系那个知道的是,这个特定点的标签是什么?它属于什么类? >>> print(clf.predict([[-0.8, -1]])) [1] >>> clf_pf = GaussianNB() >>> clf_pf.partial_fit(X, Y, np.unique(Y)) GaussianNB(priors=None) >>> print(clf_pf.predict([[-0.8, -1]])) [1]
必须先训练好分类器,才能调用分类器上的预测函数。因为使用数据训练的过程是它实际学习模式的过程
然后分类器能利用学得的模式进行预测
在刚才的计算NB准确性示范例子中执行的其中一项操作,在两个不同的数据集上进行测试和训练,你自己
可能都没有主要到,实际上,在机器学习的过程中始终都是在训练,并在不同数据上测试非常重要
如果你不这样做,可能会与训练数据过拟合,可能会高估你对情况的了解程度
这非常重要,因为在机器学习中,你需要泛化在某些方面存在差别的新数据,一个算法如果只是记住所有数据
使用相同数据u作为训练数据进行测试,这样就能始终获得100%的正确率,但它不知道如何泛化新数据
我们应该始终执行并且会始终执行的操作是保存10%的数据,并将其用作测试集
你将通过这些数据真正了解你在学习数据模式方面的进展,因为它能更好、更公平地了解数据在训练时的表现
使用贝叶斯规则将 NB 拆包
刚刚构建了一个有趣的分类器,而且它可以使用,不过,现在我们要做一些深入探讨,我们要仔细分析,
算法的每个细节部分
贝叶斯规则
(概率推理的圣杯)holy grail of probabilistic inference,它被称为贝叶斯规则(Bayes rule)
癌症测试
假如一种特定癌症发生率为人口的1%,对于这种癌症的检查,
若得了这种特定癌症,检查结果90%可能是呈阳性的--这通常叫做测试的敏感性(sensitivity)
但是有时候你并没有患癌症,检查结果还是呈阳性
所以我们假设,若你没患上这种特定癌症,有90%的可能性是成阴性 -- 这通常叫做特异性(specitivity)
问题:
没有任何症状的情况下你进行了检查,检查结果成阳性
你认为患上这种特定癌症的可能性是多少?
回答:
画图,假设这是所有人和一部分人,其中只有1%患有癌症99%没有
有一个检查会告诉你是否患有癌症,正确诊断率为90%的可能性,如果画出来的话,
这部分就是患有癌症且检查结果呈阳性的,这里,这个圈是癌症患者中的90%,然而这并不是全部真相
即使这个人没有患癌症,检查结果也可能呈阳性,事实上,其几率正好是所有案例中的10%
如果癌症先验概率为1%,敏感性和特异性为90%,癌症测试结果呈阳性的人患病的概率有多大?
通过阳性测试,你就知道你在这个区域,有癌症并被检测呈阳性+没有癌症并被检测呈阳性
但是在这个圆圈内部,癌症区域的比例,与整个区域比起来还是非常小
它会变大,很显然阳性测试改变了癌症概率,但是它只增加到大约8倍
先验和后验
贝叶斯法则的本质:
这里有一些被称为先验的概率,也就是你在检测之前所得到的概率(prior probability)
然后你会从测试本身获得一些证据(evidence),
这些都是会引导你获取后验概率(posterior probability)
贝叶斯法则 是将测试中的某些证据加入你的先验概率以便获得后验概率
在上面的癌症示例中,我们知道 癌症的先验概率是0.01,也就是1%
在检验结果是阳性的情况下(这里我们简称为阳性) 患癌症的概率
是先验概率乘以我们检测的敏感性(敏感性也就是在患有癌症的情况下阳性的概率)
你可能还记得,该敏感性是0.9或90%。为了让这个结果准确,我们还需要非癌症的后验概率
Posterior 应该写为:
P(C, Pos) = P(C) • P(Pos|C)
P(ℸC, Pos) = P(ℸC)• P(Pos|ℸC)
这里的结果是在阳性的情况下没有患癌症的概率,这里使用了先验概率,我们知道非癌症的概率为0.99
乘以非癌症的情况下阳性的概率。这两个方程的表达方式相同,但是癌症换成了非癌症
我们知道如果没有癌症,测试得出阴性结果的几率为90% ,那么没有癌症得出我们阳性结果的几率为10%
更有趣的是,这是一个大概正确的方程 ,只是概率加起来还不到1
规范化
归一化分为2步:我们只需要把这些数字归一,比例保持不变,但是确保它们相加之和为1
首先,让我们计算这两个数字的和,0.099+0.009 = 0.108
严格地说,它的真正含义是阳性测试结果的概率
第二步是现在我们终于提到了另外的这一个后验概率,之前的后验概率通常被称之为两个事件的联合概率(joint)。而且这个后验概率是通过这个数除以规范化值得到的
贝叶斯规则图
我们所说的情况中包括了一个先验概率(prior),一项测试(test)和它的敏感性(sensitivity)
和特殊性(specificity)
比如说,如果你得到一个阳性(positive)测试结果,你要做的是获取先验结果,
然后把此测试结果的概率分别乘以(multiply),在C发生的情况(P(Pos|C))
和在C不发生(P(Pos|!C))的情况下,获取相应检验结果的概率
左边就是考虑你患癌症的分支 ,右边就是考虑你未患癌症的分支
完成此操作后,你将得到一个数字,左边是该数字把患癌症(P(Pos,C))假设和测试结果结合了起来,
右边包含了未患病假设(P(Pos,!C)),现在我们将这些结果相加,它们的结果通常不会超过1
你会得到一个数量,这刚好是测试结果在总样本中的概率(P(Pos)在本例中为阳性)
接下来,你只需要把左边的结果除以(divide)这里的总和,也叫做归一化(normalize),
在右边也执行同样的操作,两种情况下的除数都相同,
因为这是你的患病范围、未患病范围。但是P(Pos)这个值将不再以来癌症变量
你现在得出的是所需的后验概率P(C|Pos)
如果你按此处所示正确执行了所有操作,它们相加的和将为1。这就是贝叶斯规则算法(Bayes Rule)
用于分类的贝叶斯规则
可以在很多方面使用贝叶斯规则,其中一个是用于Text Learning
假设我们有两个人,其中一个叫Chris另一个叫Sara,而且两个人都写了很多电子邮件
为了简单起见,假设这些邮件仅包含3个词语,它们包括 爱(love)、交易(deal) 和生活(life)
Chris和Sara的区别是他们使用这些词语的频率不同,为了简单起见,假设Chris喜欢谈论交易(deal)
那么他的词语中有80%或0.8涉及交易,且他谈及生活和爱的概率为0.1
Sara更多的谈及爱,较少的谈及交易和生活,分别占0.2和0.3
现在可以使用朴素贝叶斯方法基于随机邮件确定邮件的发送人
----------------------------------------------------------------------
假设有一封电子邮件谈及爱和生活,不知道是谁发送的,但是希望弄清楚发送人是谁
假设事先认定发送人是Chris或Sara的概率各为50%
可以使用基本形式判断,因此我们会说Chris的概率等于0.5,这意味着发送人是Chris的先验概率为50%
那么Sara的概率也是0.5,所以,直观的来看,谁更可能写了这封电子邮件呢?
后验概率
为何朴素贝叶斯很朴素
跟平常监督学习中的情况一样,它能让你从文本源中鉴别这个标签更有可能
可以使用这个方法判断人或新闻资源,比如可以问,这篇文章是莎士比亚还是其他人写的
之所以叫做朴素贝叶斯是因为它忽略了一件事,词序,因为这个乘积没有考虑词序
而英语是有词序的,如果随意将单词重新排序,那句子是没有任何意义的
没有注意到词序,所以它并没有真正理解这个文本,它只能把词的频率当成一种分类方法
这就是为什么被称为Naive(朴素)的原因
朴素贝叶斯的优势和劣势
优势:1、非常易于执行 2、它的特征空间非常大在两万-二十万英文单词之间3、运行非常容易,非常有效
缺点:1、它会与间断,由多个单词组成且意义明显不同的词语不太适合(芝加哥公牛)
具体根据想要解决的问题,以及必须要解决的数据集,不可以把监督分类算法当作黑匣子
而是把它们当作成一种理论性理解关于算法如何运行,以及是否适合你想要解决的问题,当然需要进行测试
之前谈的训练集测试集,以及可以检查测试集的表现以及它是如何运行的
如果表现的不尽如意,它可能就是错误的算法或者是错误的参数