精华内容
下载资源
问答
  • 2019-05-09 09:01:38

    1.什么是高斯朴素贝叶斯

    高斯朴素贝叶斯是一种可以根据样本文件进行预测,其算法本质是对某一事件或某组事件及其结果为样本数据进行学习(其学习过程类似于一种概率计算的过程,具体的过程可以百度贝叶斯算法。)并根据学习结果进行预测。

    2.模组使用

    模组使用的是sklearn包下的GaussianNB.fit(X,Y)方法,需要传入两个数组,其中X为样本属性,Y为样本结果。在初步尝试时,该函数只接受数组类型的数组(当时刚刚接触py,也可能是自己判断有误),所以讲X整体转换成了二进制数组,再次传入,问题解决。预测使用的是predict(X)方法,其中x为预测样本的属性。

    3.遇到的问题

    1.初次尝试时只能传入基础的二维数组数组,单一属性,后将其转为二进制数组后得到解决

    2.因转成二进制数组后,不同的属性样本会导致预测的数组与训练的数组长度不统一,算法无法执行。解决方法:对数组维度进行固定:既在训练和预测时数组转换为二进制后,规定相同的维度(arr.resize([x,y]))。

     

    注:代码未上传,若有意学习可以私聊

    更多相关内容
  • 使用朴素贝叶斯算法实现MNIST数据集的训练预测,精度较高,主要是参考统考学习李航一书和github上相关作者思路进行实现。
  • 朴素贝叶斯算法Naive Bayes定义中有两个关键定义:特征之间强假设独立和贝叶斯定理.这两个定义就是朴素贝叶斯的关键.接下来先了解一下这两个定义. 贝叶斯定理 贝叶斯定义是概率论中的一个定理,它跟随机变量的条件概率...

    朴素贝叶斯

    在机器学习中,朴素贝叶斯分类器是一系列以假设特征之间强(朴素)独立下运用贝叶斯定理为基础的简单概率分类器。

    朴素贝叶斯算法Naive Bayes定义中有两个关键定义:特征之间强假设独立和贝叶斯定理.这两个定义就是朴素贝叶斯的关键.接下来先了解一下这两个定义.

    贝叶斯定理

    贝叶斯定义是概率论中的一个定理,它跟随机变量的条件概率以及边缘概率分布有关.

    通常,事件A在事件B(发生)的条件下的概率,与事件B在事件A(发生)的条件下的概率是不一样的,然而,这两者之间是有确定的关系的,贝叶斯定理就是这种关系的陈述。贝叶斯公式的一个用途在于通过已知的三个概率函数推出第四个.

    直接给出公式:

    P(A|B) = \frac{P(B|A)P(A)}{P(B)}

    其中,P(A|B)是指事件B发生的情况下事件A发生的概率(条件概率).在贝叶斯定理中,每个名词都有约定俗成的名称:

    • P(A|B)是已知B发生后A的条件概率,也由于得知B的取值而被称作A的后验概率;
    • P(A)是A的先验概率(或边缘概率).之所以称为"先验"是因为它不考虑任何B方面的因素;
    • P(B|A)是已知A发生后B的条件概率,也由于得知A的取值而成称作B的后验概率;
    • P(B)是B的先验概率(或边缘概率).

    按这些术语,贝叶斯定理可以表述为:

    后验概率 = (似然性 * 先验概率)/标准化常量

    也就是说,后验概率与先验概率和相似度的乘积成正比.

    同时,分母P(B),可以根据全概率公式分解为:

    P(B)=\sum_{i=1}^nP(Ai)P(B|Ai)

    条件独立性假设

    如果P(X,Y|Z)=P(X|Z)P(Y|Z),或等价地P(X|Y,Z)=P(X|Z),则称事件X,Y对于给定事件Z是条件独立的,也就是说,当Z发生时,X发生与否与Y发生与否是无关的。

    应用在自然语言处理中,就是说在文章类别确定的条件下,文章的各个特征(单词)在类别确定的条件下是独立的,并不相关,用通俗的话说,在文章类别确定的条件下,文章各个词之间出现与否没有相关性(事实上,并不成立).这是一个非常强的假设,但对问题的求解来说变得更加简单.

    朴素贝叶斯的概率模型

    设输入空间X \subseteq R^n为n为向量的集合,输出空间为类标记集合Y = {c_1,c_2,...,c_k}.输入为特征向量x \in X,输出为类标记y \in Y. X是定义在输入空间X上的随机变量,Y是定义在输出空间Y上的随机变量.P(X,Y)是X和Y的联合概率分布.训练数据集:

    T = \{(x_1,y_1), (x_2,y_2),...,(x_N,y_N)\}

    由P(X,Y)独立同分布产生.因此朴素贝叶斯模型也是一个生成模型.

    朴素贝叶斯算法通过训练集学习联合概率分布P(X,Y),具体地,学习先验概率分布以及条件概率分布.其中先验概率分布

    P(Y=c_k), k=1,2,...,K

    条件概率分布

    P(X=x|Y=c_k)=P(X^{(1)}=x^{(1)},X^{(2)}=x^{(2)},...,X^{(n)}=x^{(n)}|Y=c_k), k=1,2,...,K

    通过两个概率得到联合概率分布P(X,Y) = P(X|Y)P(Y).

    条件概率分布P(X=x|Y=c_k)有指数级数量的参数,其估计实际上不可行的.假设x^{(j)}S_j个取值,j=1,2,...,n,Y有K个取值,那么参数个数为K\prod_{j=1}^n S_j.

    指数级的参数估计事实上并不可行,因此朴素贝叶斯算法针对各个特征之间做了假设,也就是对条件概率分布作了条件独立性假设,这是一个很强的假设,通过这个假设,我们的参数求解变得可行,这也就是朴素贝叶斯的"朴素"的由来.这种情况下,我们同样假设x^{(j)}S_j个取值,j=1,2,...,n,Y有K个取值,那么参数个数为K\sum_{i=1}^nS_j,需要估计的参数量大大减少.条件独立性假设是

    P(X=x|Y=c_k)=P(X^{(1)}=x^{(1)},X^{(2)}=x^{(2)},...,X^{(n)}=x^{(n)}|Y=c_k) \\=\prod_{j=1}^n P(X^{(j)}=x^{(j)}|Y=c_k)

    朴素贝叶斯算法分类时,对给定输入x,通过学习到的模型计算后验概率分布P(Y=c_k|X=x),将后验概率最大的类作为输入x的类输出.后验概率根据贝叶斯定理计算:

    P(Y=c_k|X=x)=\frac{P(Y=c_k)P(X=x|Y=c_k)}{\sum_k P(X=x|Y=c_k)P(Y=c_k)}\\ =\frac{P(Y=c_k)\prod_{j=1}^n P(X^{(j)}=x^{(j)}|Y=c_k)}{\sum_k P(Y=c_k)\prod_{j=1}^n P(X^{(j)}=x^{(j)}|Y=c_k)}

    上面的公式是后验概率分布中的一项,由于对于相同输入x下不同类别的后验概率的分母都相同,而最终的类输出是后验概率分布中概率最大对应的类别,所以我们可以简化为只比较分子的大小就可以确定最终的结果,也就是说,最终类输出为:

    y=arg max_{c_k}P(Y=c_k)\prod_{j=1}^n P(X^{(j)}=x^{(j)}|Y=c_k).

    如果我们对右边的乘积概率取log,连乘积就可以转换成为和,计算更简单(加法总比乘法简单),上诉公式存在一种变种:

    y=arg max_{c_k} logP(Y=c_k) + \sum_{j=1}^n logP(X^{(j)}=x^{(j)}|Y=c_k).

    同时这种形式,也可以看做是一种线性回归,权重系数为1.

    介绍完,朴素贝叶斯的概率模型之后,我们目前的主要问题就集中在如何估计这个模型的K\sum_{i=1}^nS_j个参数:P(Y=c_k),P(X^{(j)}=x^{(j)}|Y=c_k),估算出参数,我们就可以对输入向量x做预测.针对这些参数的求解方法不同,存在不同的朴素贝叶斯类型,具体介绍三种:伯努利朴素贝叶斯,多项式朴素贝叶斯和高斯朴素贝叶斯.不同类型的朴素贝叶斯对参数的求法不同,而根源在于对P条件概率(X=x|Y=c_k)的假设分布不同,也就是说在给定类别的情况下,对X假设的分布不同:伯努利假设是伯努利分布(其实应该是多变量伯努利分布),多项式假设是多项式分布,而高斯也就是假设是高斯分布(其实是多变量高斯分布).然后,我们细化到三种不同类型的朴素贝叶斯理论中.

    Bernoulli Naive Bayes 伯努利朴素贝叶斯

    伯努利朴素贝叶斯,其实应该叫"Multi-variate Naive Bayes",假设P(X=x|Y=c_k)是多变量伯努利分布.在了解多变量伯努利分布之前,先介绍一下什么是(单变量的)伯努利分布.

    伯努利分布

    伯努利分布,又叫做两点分布或0-1分布,是一个离散型概率分布.称随机变量X有伯努利分布,参数为p(0< p <1),它分别以概率p和1-p取1和0为值.

    最简单的例子就是抛硬币,硬币结果为正或反.

    P(X=x)=p^x (1-p)^{(1-x)}=px+(1-p)(1-x)

    幂次运算变成乘法运算,更简单.当x=1时,概率是P(X=1)=p,当x=0时,概率P(X=0)=1-p,这样就可以将两种情况合在一起.

    了解了什么是伯努利分布之后,我们再看什么是多元伯努利分布(多变量 multi-variate Bernoulli).

    多元伯努利分布

    多元伯努利分布,通俗的讲就是同时进行多个不同的伯努利实验,P(X=x)=\theta,其中x是一个向量,\theta也是一个向量,表示不同伯努利实验的参数.

    伯努利多项式将文档的生成模型P(X=x|Y=c_k)假设服从为多元伯努利分布,由于我们之前做的特征独立性假设,x=(x^{(1)},x^{(2)}=x^{(2)},...,^{(n)})是一个向量形式,而其中x^{(j)} \in \{0, 1\},也就是说x向量是onehot形式的向量(每个维度值是0或1),表示这个维度的特征是否出现.特征集F = \{f_1,f_2,...,f_n \}有n个特征,特征集的维度决定了输入空间X的维度,而且特征集的维度可以对应到输入空间的各个维度上.

    P(X=x|Y=c_k)=P(X^{(1)}=x^{(1)},X^{(2)}=x^{(2)},…,X^{(n)}=x^{(n)}|Y=c_k)\\=\prod_{i=1}^{n} p(t_i|Y=c_k)x^i+(1-p(t_i|Y=c_k))(1-x^i)

    因为特征之间的独立性,所以多元伯努利变成各个伯努利分布的连乘积,需要注意的一点是因为是伯努利分布,0-1,特征出现有一个概率p,特征不出现也有一个概率1-p.最终模型的参数估计完成之后,对新样本进行预测时,如果某个特征不出现,需要乘上这个特征不出现的概率,不能只计算特征出现的概率!!!两个向量直接相乘,并不能得到最终的结果.

    对应的伯努利朴素贝叶斯模型为:

    P(Y=c_k|X=x)=\frac{P(Y=c_k)P(X=x|Y=c_k)}{\sum_kP(X=x|Y=c_k)P(Y=c_k)}\\=\frac{P(Y=c_k)\prod_{j=1}^n p(t_j|Y=c_k)x^j+(1-p(t_j|Y=c_k))(1-x^j)}{\sum_k P(Y=c_k)\prod_{j=1}^n P(X^{(j)}=x^{(j)}|Y=c_k)}

    为了简化运算,我们可以将分母忽略,虽然对应的结果不是真正的概率,但是相同样本的各个后验概率之间的大小关系保持不变,同时如果两边同时做log运算,后验概率之间的大小关系同样保持不变.因此,

    y=arg max_{c_k} P(Y=c_k)\prod_{j=1}^n P(X^{(j)}=x^{(j)}|Y=c_k) \\ =arg max_{c_k} logP(Y=c_k)+\sum_{j=1}^nlogP(X^{(j)}=x^{(j)}|Y=c_k).

    了解了多元伯努利分布之后,接下来的工作就是对参数进行估计,计算P(x^i|Y=c_k),P(Y=c_k).

    参数估计

    参数估计的过程也是朴素贝叶斯分类器学习的过程.而参数估计可以使用极大似然估计.先验概率P(Y=c_k)的极大似然估计是

    P(Y=c_k)=\frac{\sum_{i=1}^N I(y_i = c_k)}{N}, k=1,2,...,K

    其中,I(x)是一个指示函数,如果x为真,I(x)结果为1,如果x为假,I(x)=0.用语言描述来说,P(Y=c_k)这个概率等于在N个样本的数据集中,类别为c_k的样本所占的比例.

    条件概率P(X^{(i)}=x^{(i)}|Y=c_k)的极大似然估计是:

    P(X^i=x^i|Y=c_k) = \frac{\sum_{i=1}^N I(X^i=x^i, y_i=c_k)}{\sum_{i=1}^N I(y_i=c_k)}

    用语言描述来说,条件概率P(X^i=x^i|Y=c_k)等于在类别为c_k的样本集合(数据集的子集)中,第i个特征等于x_i的概率,x^i是0或1,而且P(X^i=x^i|Y=c_k)服从伯努利分布,所以只需要计算一个,比如P(X^i=1|Y=c_k),P(X^i=0|Y=c_k) = 1 - P(X^i=1|Y=c_k),因为两个概率和为1(这是同一个变量).

    这些参数估计完之后,朴素贝叶斯就完成了学习过程,接下来就可以使用它去进行预测了(应用才是最终的目的).

    0概率处理

    由于P(X^i=x^i|Y=c_k)是伯努利分布,参数p在[0,1]之间,有可能存在P(X^i=x^i|Y=c_k) = 0,也就是存在0概率.

    举例来说,在当前类别下的所有样本中特征i都出现了(=1),根据上面的条件概率极大似然估计,可以知道P(X^i=1|Y=c_k) = 1,那么对应的,P(X^i=0|Y=c_k) = 0,那么当新样本来的时候,加入存在一条记录x,它很巧地没有第i个特征(这不巧了吗?不是),由于0概率的存在,那么使用上面的贝叶斯公式,就会出现属于某个列别的概率为0,P(Y=c_k|X=x)=0.但这种情况是应该避免的,那么如何避免呢?

    我们在对条件概率进行极大似然估计时,针对分子和分母做一些小变动,

    P(X^i=x^i|Y=c_k)=\frac{\alpha+\sum_{i=1}^NI(X^i=x^i,y_i=c_k)}{S_i\alpha+\sum_{i=1}^NI(y_i=c_k)} \\ =\frac{\alpha+\sum_{i=1}^NI(X^i=x^i,y_i=c_k)}{2\alpha+\sum_{i=1}^NI(y_i=c_k)}

    其中,S_i表示第i个特征不同取值的个数,由于这里是one-hot,取值为2,所以S_i = 2,\alpha乘以S_i是保证S_i个不同取值对应的条件概率之和为1,不偏袒任意一种情况,一视同仁.

    代码实现

    To Be Continued.

    数学推导---矩阵形式,批量计算,高效快捷.

    Multinomial Naive Bayes 多项式朴素贝叶斯

    多项式朴素贝叶斯,假设P(X=x|Y=c_k)是多项式分布.在了解多项式朴素贝叶斯之前,先介绍一下什么是多项式分布?

    多项式分布

    将伯努利分布的单变量扩展到d维向量\vec x,其中x_i \in {0,1},且\sum_{i=1}^d x_i =1,假设x_i=1的概率是\mu \in [0,1],并且\sum_{i=1}^d \mu_i=1,则将得到离散分布:

    P(x|\mu)= \prod_{i=1}^d \mu_i^{x_i}.

    其中x,\mu都是d维向量形式.在此的基础上扩展二项分布到多项式分布(Multinomial distribution),该分布描述的是在n次独立实验中有m_ix_i=1的概率,其密度函数可以表达为如下形式:

    p(m_1,m_2,...,m_d|n, \mu)=\frac{n!}{m_1!m_2!...m_d!} \prod_{i=1}^d \mu_i^{m_i}

    多项式分布的期望,方差如下:
    E(x)=n \mu_i

    var(x)=n \mu_i(1-\mu_i)

    多项式朴素贝叶斯

    多项式分布应用到朴素贝叶斯上,对于文档分类问题来说,假设给定文档类型的基础上文档生成模型P(X=x|Y=c_k)是一个多项式分布.这样对应关系就是:

    • 文档分类中的d维字典(d个特征)对应于多项式分布中的向量的d个维度;
    • 文档分类中,词w_i出现与否,对应于d维向量中x_i \in {0,1},两种取值情况,且\sum_{i=1}^d x_i =1;
    • 文档分类中,词w_i出现的概率,对应于离散分布中x_i=1的概率是\mu \in [0,1],并且\sum_{i=1}^d \mu_i=1;
    • 文档分类中,给定类别下,对应一次抽样结果x(d维向量)的概率为:P(x|\mu)= \prod_{i=1}^d \mu_i^{x_i},因为如果一个词不出现,即x_i=0,那么对应\mu_i^0=1,所以P(x|\mu)可以简写为P(x_i|\mu)=\mu_i;
    • n次独立实验中有n_ix_i=1的概率,对应到文档模型中特征i(第i个词)出现了n_i次,n次实验对应到文档模型中表示这篇文档的长度为n(一共有n个词),对应概率密度函数为:p(m_1,m_2,...,m_d|n, \mu)=\frac{n!}{m_1!m_2!...m_d!} \prod_{i=1}^d \mu_i^{m_i}
    多项式分布文档模型
    d维向量d个维度,d个特征
    x_i \in {0,1}第i个词出现与否
    x_i=1的概率是\mu \in [0,1] 第i个词出现的概率
    P(x)= \prod_{i=1}^d \mu_i^{x_i}给定类别下,一次抽样结果的概率(一个词)
    n次实验对应长度为n的文档n次抽样结果

    需要注意的是,应用在文本分类的多项式朴素贝叶斯模型之前,一般多项式条件概率如下:

    P(X=x|Y=c_k)=P(X^1=x^1,X^2=x^2,...,X^d=x^d|Y=c_k) \\=P(|x|)\frac{n!}{x^1!x^2!...x^d!} \prod_{i=1}^d P(w_i|Y=c_k)^{x^i}

    我们的多项式朴素贝叶斯概率模型为:

    P(Y=c_k|X=x)=\frac{P(Y=c_k)\frac{n!}{x^1!x^2!...x^d!} \prod_{i=1}^d P(w_i|Y=c_k)^{x^i}}{P(X=x)}

    这里为了方便,首先我们假设文章长度和文章的类别之间没有相关性(事实上也并不成立,比如说相对较长的邮件,相比垃圾邮件而言,正常邮件的概率更大),也就是说P(|x|)的分布与文章所属类别无关.另一方面,由于最终所属类别是后验概率最大对应的类别,所以,我们可以将文章长度P(|x|)建模的概率,忽略掉,就像我们之前忽略伯努利分布中的分母一样.

    P(X=x|Y=c_k) = P(X^1=x^1,X^2=x^2,...,X^d=x^d|Y=c_k)=\frac{n!}{x^1!x^2!...x^d!} \prod_{i=1}^d P(w_i|Y=c_k)^{x^i}

    再者,为了更加方便,我们通常对两边取log运算,将幂次运算转换成线性运算:

    logP(X=x|Y=c_k) = logP(X^1=x^1,X^2=x^2,...,X^d=x^d|Y=c_k)=\frac{n!}{x^1!x^2!...x^d!} \prod_{i=1}^d P(w_i|Y=c_k)^{x^i}

    我们也可以将文章长度阶乘省略,然后变成:

    y=arg max_{c_k} P(Y=c_k)P(X=x|Y=c_k))\\=arg max_{c_k} logP(Y=c_k)+\sum_{j=1}^d x^{(j)}logP(w_j|Y=c_k).

    这样就变成线性运算,就和线性回归一样,运算高效而简单.

    将文档模型对应到多项式分布上得到多项式朴素贝叶斯,在我们对其做出假设分布之后,剩下的工作就是对假设分布下每个类别下的d个条件概率以及先验分布进行估计.此外,还需要说明的一点是:多项式朴素贝叶斯模型采用词袋模型,每个x_i表示第i个特征出现的次数,也就是词频term-frequency,有时候也可以使用tf-idf作为值.

    参数估计

    参数估计的过程也是朴素贝叶斯分类器学习的过程.而参数估计可以使用极大似然估计.先验概率P(Y=c_k)的极大似然估计是

    P(Y=c_k)=\frac{\sum_{i=1}^NI(y_i=c_k)}{N}, k=1,2,...,K

    其中,I(x)是一个指示函数,如果x为真,I(x)结果为1,如果x为假,I(x)=0.用语言描述来说,P(Y=c_k)这个概率等于在N个样本的数据集中,类别为c_k的样本所占的比例.

    条件概率P(w_t|Y=c_k)的极大似然估计是:

    P(w_t|Y=c_k)=\frac{\sum_{i=1}^N I(w_t=1,y_i=c_k)x_i^{(t)}}{\sum_{i=1}^N \sum_{s=1}^d I(w_s=1,y_i=c_k)x_i^{(s)}}

    用语言描述来说,条件概率P(w_t|Y=c_k)等于在类别为c_k的样本集合(数据集的子集)中,第t个特征出现的概率等于c_k类样本第t个特征出现的总次数(考虑词频,不再是0,1)占c_k类样本的总词数(文章长度之和,文章单词特征是固定的,考虑了词频)的比例.

    为了方便理解,将N_{t,k}表示为第k类样本集合中第t个特征出现的总次数,N_k表示为在所有样本中第k类样本的总词数(第k类样本长度之和,考虑频数),简写成:

    P(w_t|Y=c_k)=\frac{N_{t,k}}{N_k}

    需要注意的是,\sum_t P(w_t|Y=c_k)=1,意思是给定分类下,各个维度的概率之和为1,在文章分类中,就是给定文章分类的情况下,各个词出现的条件概率之和为1,和每个词出现多少词没有关系.

    0概率处理

    和伯努利朴素贝叶斯模型类似,有可能存在某一维度,数据集在这一维度上都是0,对应到文档分类上,就是这个词在所有文章中都没有出现过(词典选的不好,特征选择不好),这种情况就会出现0概率.所以我们需要对条件概率做一点小改动:

    P(w_t|Y=c_k)=\frac{\alpha + N_{t,k}}{d*\alpha + N_k}

    其中,d表示数据维度为d(有d个特征,每个特征都加\alpha,保证概率和为1,\alpha需要乘d).当\alpha=1时,叫做Laplace Smoonthing拉普拉斯平滑,当然\alpha也可以小于1.

    代码实现

    To Be Continued

    Gaussian Naive Bayes 高斯朴素贝叶斯

    高斯朴素贝叶斯,假设P(X=x|Y=c_k)是多元高斯分布.在了解高斯朴素贝叶斯之前,先介绍一下什么是高斯分布,什么是多元高斯分布?

    高斯分布

    高斯分布又称正态分布,在实际应用中最为广泛。对于单变量x \in(−\infty,+\infty),高斯分布的参数有两个,分别是均值\mu \in (−\infty,+\infty)和方差\sigma^2>0,其概率密度函数为

    N(x|\mu,\sigma^2)=\frac1{\sqrt{2\pi}\sigma}exp\{-\frac{(x-\mu)^2}{2\sigma^2}\}

    多元高斯分布

    image

    其中,\mu是D维均值向量,\sum是DxD的协方差矩阵,|\sum|\sum的行列式.多元高斯分布的期望是\mu,方差是\sum

    特殊的,如果D个维度之间相互独立,那么多元高斯分布就可以表示成单元高斯分布概率密度函数的连乘积.

    高斯朴素贝叶斯

    高斯朴素贝叶斯模型是假设条件概率P(X=x|Y=c_k)是多元高斯分布,另一方面,由之前的特征的条件独立性假设,我们就可以通过对每个特征的条件概率建模,每个特征的条件概率N(\mu_t,\sigma_t^2)也服从高斯分布.

    c类下第i个词对应的高斯分布为:

    g(x_i;\mu_{i,c},\sigma_{i,c})=\frac1{\sigma_{i,c}\sqrt{2\pi}}exp\{-\frac{(x_i-\mu_{i,c})^2}{2\sigma_{i,c}^2}\}

    其中,\mu_{i,c},\sigma_{i,c}^2表示c类下第i个特征的均值和方差.

    由于特征之间的独立性假设,我们可以得到条件概率:

    P(X=x|Y=c)=\prod_{i=1}^d g(x_i;\mu_{i,c},\sigma_{i,c})

    一共有d个特征.

    高斯朴素贝叶斯变成:

    P(Y=c_k|X=x)=\frac{P(Y=c_k)P(X=x|Y=c_k)}{\sum_k P(X=x|Y=c_k)P(Y=c_k)}\propto P(Y=c_k)P(X=x|Y=c_k)

    y=arg max_{c_k} P(Y=c_k)P(X=x|Y=c_k).

    了解了多元高斯分布分布之后,接下来的工作就是对参数进行估计,计算\mu_{i,c}\sigma_{i,c}.

    参数估计

    先验概率和之前的估算方法相同,不再描述.主要是对高斯分布的均值和方差的估计,采用的方法仍然是极大似然估计.

    均值的估计\mu_{i,c}是在样本类别c中,所有X_i的平均值;

    方差的估计\sigma_{i,k}^2为样本类别c中所有X_i的方差.

    对于一个连续的样本值,带入高斯分布,就可以求出它的概率分布了.

    所有参数估计完成之后,就可以计算给定样本的条件概率P(X=x|Y=c_k),进而可以计算P(Y=c_k)P(X=x|Y=c_k),之后就可以确定样本类别,完成模型预测.

    Reference

    展开全文
  • 朴素贝叶斯算法 为什么需要朴素贝叶斯算法? 比如说,我们想预测一个人究竟是否能够侥幸在空难中生还,那么我们就需要建立一个分类模型来学习我们的训练集。在训练集中,其中一个人的特征是30岁,男,普通舱,他...

    机器学习18_贝叶斯算法详解(2021.06.02 - 2021.06.05)

    一. 朴素贝叶斯算法

    • 为什么需要朴素贝叶斯算法?
      比如说,我们想预测一个人究竟是否能够侥幸在空难中生还,那么我们就需要建立一个分类模型来学习我们的训练集。在训练集中,其中一个人的特征是30岁,男,普通舱,他最终在空难中去世了。训练完成后,当我们使用训练好的模型进行测试的时候,测试的目标的特征也是30岁,男,普通舱,那么我们的模型必然会给这个人打上去世的标签。然而事实却不一定为此,也许这个人正好坐在了离逃生口最近的位置,他得到了第一时间的救治而生存下来了。因此对于分类算法来说,基于训练的经验,这个人“很有可能”去世,但算法永远无法确定这个人“一定没有活下来”。即便是这个人最后真的去世了,算法也无法根据训练数据给出绝对的判断和结论。
      从这个故事就可以看出,根据算法训练得到的结果其实常常只是一种非100%确定的推测,而我们在使用模型时却非要强行让算法给我们一个分类的结果,这样的结果其实也并不是我们想要的,换句话说大多数时候,我们也希望算法能给我们一个多可能的带有概率分布的结果,因此就有了真正基于概率的算法 ----- 朴素贝叶斯。
    • 什么是朴素贝叶斯算法?
      朴素贝叶斯算法是一种直接衡量标签与特征之间的概率关系的有监督的学习算法,是一种专注分类的算法。其根源就是基于概率论与数理统计的贝叶斯理论,因此它是根正苗红的概率模型。
    • 朴素贝叶斯算法所需的概率知识扫盲
      1.什么是概率?
      概率,旧称几率,又称机率、机会率或或然率,是对随机事件发生之可能性的度量,为数学概率论的基本概念;概率的值是一个在0到1之间的实数,也常以百分数来表示。
      2.通俗地理解联合概率和条件概率
      一篇比较轻松易懂的博文推荐:https://zhuanlan.zhihu.com/p/150438364
      3.概率计算公式总结
      by demo
    • 朴素贝叶斯算法的适用范围
      1.朴素贝叶斯值适用于特征之间是条件独立的情况下,否则分类效果不好,这里的朴素指的就是条件独立。
      2.朴素贝叶斯主要被广泛地使用在文档分类中。
    • 朴素贝叶斯算法的分类
      在sklearn中提供了三种不同类型的贝叶斯模型算法,分别是:高斯模型、多项式模型、伯努利模型

    二. 高斯朴素贝叶斯算法

    • 高斯分布(正态分布)的扫盲
      by demo高斯分布(正态分布)是一种连续型变量的概率分布,简单地来说,高斯分布(正态分布)就是当频率直方图的区间变得特别小的拟合曲线,像一座小山峰,其中两端特别小,越往中间越高。所谓的高斯分布(正态分布)其实就是正常形态的分布,它是自然界的一种规律。现实生活中有很多现象服从高斯分布,比如人的身高、收入、体重等等,大部分的人都处在中等水平,只有极少数的人会特别高或者特别低。高斯朴素贝叶斯公式如图所示,本质上就是通过假设P(xi|Y)是服从高斯分布(正态分布),从而来估计每个特征分到每个类别Y上的条件概率。
      by demo
    • 高斯朴素贝叶斯模型的作用
      在贝叶斯分类中,高斯模型就是用来处理特征变量的,当使用此模型时,第一步:我们会假定特征属于高斯分布,第二步:去计算训练样本集中每一个样本数据的每一个特征分到帅的条件概率和丑的条件概率,再基于最大化P的准则,定义每个特征所属的标签及其概率,第三步:基于训练样本集计算特征所属标签的均值和标准差,这样就可以估计某个特征属于某个类别的概率。
      举个例子:当你想判断一个人是帅还是丑,则帅和丑就是分类的标签。在样本数据集中,一个人的特征假设有身高、体重、三围这三种。对于样本数据中的其中一条数据(某一个人),高斯分布就会计算身高的特征分到帅的条件概率和丑的条件概率,再计算体重的特征分到帅和丑的概率,以此类推。在这之后,将数据集中的每一条数据按照上述描述进行相同的操作。然后对训练样本集中的每一条数据的特征(身高、体重、三围)分到每一个类别的最大概率进行均值、方差计算。从而最终返回每一个特征的系数w。
    • 高斯朴素贝叶斯算法的API
      from sklearn.naive_bayes import GaussianNB
      实例化模型对象的时候,我们不需要对高斯朴素贝叶斯输入任何参数,可以说是一个非常轻量级的类,操作非常容易,但过于简单也意味着贝叶斯没有太多的参数可以调整,因此贝叶斯算法的成长空间并不是太大,如果贝叶斯算法的效果不是太理想,我们一般会考虑换模型。
    • 基于高斯朴素贝叶斯算法和sklearn中的digits数据集的数字分类的代码实现
    from sklearn.naive_bayes import GaussianNB  # 导入高斯朴素贝叶斯
    from sklearn.datasets import load_digits  # 导入数字数据集
    from sklearn.model_selection import train_test_split  # 用于对数据集的拆分
    
    # 读取样本数据集
    data = load_digits()
    # print(data)
    
    # 提取特征数据和标签数据
    feature = data.data
    target = data.target
    
    # 拆分数据
    x_train, x_test, y_train, y_test = train_test_split(feature, target, test_size=0.2, random_state=2021)
    
    # 训练模型
    nb = GaussianNB()  # 实例化模型对象
    nb.fit(x_train, y_train)  # 训练模型
    
    # 给模型评分
    score = nb.score(x_test, y_test)
    print(score)
    
    # 预测
    pred_result1 = nb.predict(x_test[6].reshape(1, -1))
    true_result1 = y_test[6]
    print('预测结果为:', pred_result1, '真实结果为:', true_result1)
    
    # 打印perd_result1属于0~9每个类别的概率,最大值就是分类的结果
    DP_pred_result1 = nb.predict_log_proba(x_test[6].reshape(1, -1))
    print(DP_pred_result1)
    
    # 结果如下,可以看出在9处的概率最高,也是因此将该测试数据的结果定义为了9
    # [[-3.32723175e+02 -4.31949249e+01 -2.13646036e+02 -1.09524299e+02
    #   -4.67899190e+07 -7.60473436e+01 -8.76400506e+02 -9.94269149e+08
    #   -2.10601963e+02  0.00000000e+00]]
    
    

    三. 多项式朴素贝叶斯算法

    • 多项式朴素贝叶斯算法的特性
      1.与高斯朴素贝叶斯相反,多项式朴素贝叶斯主要适用于离散特征的概率计算(虽然在sklearn中的多项式模型也可以被用作在连续性特征概率计算中,但是如果我们想要处理连续性变量时最好选择高斯模型)。
      2.sklearn的多项式模型不接受输入负值(所以如果样本数据为数值型数据的话,务必要进行归一化处理保证特征数据中没有负值出现)。
    • 什么是多项式朴素贝叶斯算法?
      通过举一个简单的例子来理解什么是多项式朴素贝叶斯(对一篇文章类型的分类)。
      对于一篇文章它到底财经类文章还是体育类文章该如何进行分类呢?多项式朴素贝叶斯的方法就是分别计算出这篇文章为不同类型文章的概率,换句话说就是计算出这篇文章是财经文章的概率是多少,是体育文章的概率是多少,之后再将这些概率进行大小比较,从而得出该文章的分类。在这个例子中,最大的概率类型其实就是该文章的类别,而文章又是由一个个词语组成的,所以有以下的公式:
      by demo
      如果假设文章为体育类型文章的概率为1/3,为财经类型文章的概率为1/6,则就可以推测这篇文章是一篇体育类型的文章。
      ⇒ 那么红色框子内的概率是如何计算的呢?
      根据之前学习的条件概率公式(单一条件下的多事件发生)的变形就可以计算出来了。具体的计算过程如下所示:
      by demo
      为了更好的理解介绍的这段计算过程,通过实例化来解释。假设现在有一篇将要被预测的文章,文章中出现了影院、支付宝、云计算这三个词汇,请计算一下该文章属于科技、娱乐的类别概率。
      by demo
      计算过程如下所示:
      by demo
      在计算后发现公式2的结果竟然变成了0,可是这篇文章中也出现了其他有关娱乐的词,所以如果直接将0作为该文章被分类为娱乐文章的概率明显是不合适的,那么要如何解决呢?这就要用到拉普拉斯平滑系数了!(简单地来说,就是在为0的分子上进行加1处理,并将分母也做一定的增大调整,从而使得为0的概率被消除。)
      by demo
    • 多项式朴素贝叶斯的API
      from sklearn.naive_bayes import MultinomialNB
      参数介绍: MultinomialNB(alpha=1.0, fit_prior=True, class_prior=None),其中alpha为拉普拉斯平滑系数,fit_prior和class_prior都可以不用调整。
    • 多项式朴素贝叶斯实现对文章的分类
    import sklearn.datasets as datasets  # 用于导入数据集
    from sklearn.feature_extraction.text import TfidfVectorizer  # 用于文本的特征提取
    from sklearn.model_selection import train_test_split  # 用于数据集的拆分
    from sklearn.naive_bayes import MultinomialNB  # 导入多项式朴素贝叶斯算法
    
    # 获取数据集
    news = datasets.fetch_20newsgroups_vectorized(subset='all')
    # print(news)
    
    # 提取特征数据和标签数据
    feature = news.data  # 返回的是列表,列表中位一篇篇的文章
    # print(feature)
    # print(len(feature))
    target = news.target  # 返回的是ndarray,存储的是每一篇文章的分类
    # print(target)
    # print(len(target))
    
    # 数据集的拆分
    x_train, y_train, x_test, y_test = train_test_split(feature, target, test_size=0.2, random_state=2021)
    # print(x_train)  # 发现拿到的不论是训练集还是测试集的数据都不是数值型数据,因此必须要做特征工程
    
    # 对数据集进行特征抽取
    tf = TfidfVectorizer()  # 实例化一个工具类
    x_train = tf.fit_transform(x_train.toarray())  # 返回训练集所有文章中每个词的重要性
    # print(x_train)
    x_test = tf.fit_transform(x_test.toarray())
    
    # 模型的训练
    mlt = MultinomialNB(alpha=1)
    mlt.fit(x_train, y_train)
    
    # 对模型进行评价
    y_pred = mlt.predict(x_test)
    y_true = y_test
    score = mlt.score(x_test, y_test)
    print('预测分类为', y_pred)
    print('真实分类为', y_true)
    print('模型分类准确率为', score)
    
    • 知识补充 ----- 代码中input的TidifVectorizer是什么?
      TF:词频,TF(w)= 词w在文档中出现的次数 / 文档的总词数
      IDF:逆向文章评率,有些测可能在文本中频繁的出现,但并不重要,即信息量很小。比如:is、are、of 等等,因此我们就可以利用这一点,降低它们的权重。IDF(w) = log_e 语料库的总文档数 / 语料库中w(is、 are、of…)出现的文档数
      TF-IDF:就是将上面的TF和IDF做相乘就得到了该综合参数
      想要深入了解,请移步到这位大神的博文中:链接在此

    四. 伯努利朴素贝叶斯

    • 什么是伯努利朴素贝叶斯?
      对于多项式朴素贝叶斯来说,它既可以处理二项分布(抛硬币)又可以处理多项式分布(掷骰子)。其中的二项分布又被称为伯努利分布,它是一种现实中常见,并且拥有很多优越数学性质的分布。
    • 什么是伯努利模型?
      与多项式模型一样,伯努利模型适用于离散特征的情况,所不同的是,数据集中可以存在多个特征,但每个特征都必须是二分类的,且伯努利模型中每个特征的取值都只能是1和0。举个例子:当你想检查一个单词是否在一篇文章中出现过,那你就需要对出现或者没出现的这个事件做一个定义,换句话说就是,当文章中出现过这个词的时候,这个词的特征值就为1,反之,如果这个词没在文件中出现过,那么个词的特征值就为0。
    • 伯努利朴素贝叶斯的作用
      伯努利朴素贝叶斯与多项式朴素贝叶斯非常相似,都常用于处理文本分类数据,但由于伯努利朴素贝叶斯是处理二项分布的,所以他更加在意的是“是与否”。举个例子来说: 在对一篇文章进行种类区分的时候,伯努利模型做的是判断一篇文章是不是科技类文章,而不是像多项式朴素贝叶斯做的是判断这篇文章是科技类文章还是艺术类文章。
      (注意:由于伯努利模型需要使用的特征值不是0就是,那么是否需要我们将用于训练的数据集进行二值化呢?实际上是不用的,因为伯努利模型类中已经集成了二值化操作,但为了了解一下二值化的含义,还是先动手做一个二值化操作吧。)
    from sklearn import preprocessing
    import numpy as np
    
    X = np.array([
        [1, -2, 2, 3, 1, 10],
        [1, 2, 3, 33, 4, -90],
        [11, 22, 33, 5, -80, 4]
    ])
    
    binaryzation = preprocessing.Binarizer(threshold=5)  # 将大于5的数字视为1,小于等于5的视为0
    X_binaryzation = binaryzation.transform(X)
    print('二值化结果为(阈值为5):\n', X_binaryzation)
    
    # 结果
    # 二值化结果为(阈值为5):
    #  [[0 0 0 0 0 1]
    #  [0 0 0 1 0 0]
    #  [1 1 1 0 0 0]]
    
    • 伯努利朴素贝叶斯的API: from sklearn.naive_bayes import BernoulliNB
      参数介绍:alpha:拉普拉斯平滑系数;binarize:可以是数值或者不输入。如果不输入,则认为每个数据特征已经是二值化的了,否则的话,小于binarizer的会归为一类,大于binarizer的会归为一类。
    • 基于伯努利贝叶斯的鸢尾花分类的代码实现
    import sklearn.datasets as datasets  # 用于导入数据集
    from sklearn.model_selection import train_test_split  # 用于数据集的拆分
    from sklearn.naive_bayes import BernoulliNB   # 导入伯努利朴素贝叶斯算法
    
    # 读取数据集
    iris = datasets.load_iris()
    
    # 提取特征数据和标签数据
    feature = iris.data
    target = iris.target
    
    # 数据集的拆分
    x_train, x_test, y_train, y_test = train_test_split(feature, target, test_size=0.2, random_state=2021)
    # print(x_train)  # 可以看出训练集数据均为数值型类型,且相差不是很大,因此不需要做特征抽取和特征预处理
    
    # 对数据集进行训练
    mlt = BernoulliNB(binarize=6)  # 通过调节binarizer参数值的大小可以改善模型预测的准确率
    mlt.fit(x_train, y_train)
    score = mlt.score(x_test, y_test)
    y_pred = mlt.predict(x_test)
    y_true = y_test
    print("预测鸢尾花类型为", y_pred)
    print("实际鸢尾花类型为", y_true)
    print("预测模型准确率为", score)
    
    # 结果
    # 预测鸢尾花类型为 [0 0 0 0 0 0 0 0 0 0 0 2 0 2 2 2 0 0 0 0 0 2 2 0 2 2 2 2 0 0]
    # 实际鸢尾花类型为 [0 0 1 0 0 0 0 0 0 0 0 1 2 2 1 2 1 1 0 1 1 2 2 0 2 1 1 1 0 0]
    # 预测模型准确率为 0.6333333333333333
    

    由此可见,当待处理的样本数据是一个多分类的数据时,(鸢尾花的种类有三种(山鸢尾、杂色鸢尾、维吉尼亚鸢尾),需要判断它是哪一种),因此预测的结果偏差就较大。反之,如果样本数据中全部都是山鸢尾,那么训练后的模型就能很好地对一个未知的种类的鸢尾花它是不是山鸢尾而做出预测。

    五. 感悟

    1. 朴素贝叶斯模型来源于古典数学理论,有着稳定的分类效率,而且对确实的数据不太敏感,算法也相对比较简单。通常被使用在文本分类的项目中。
    2. 由于朴素贝叶斯算法是基于样本属性独立的假设,所以如果样本属性有关联的时候,朴素贝叶斯算法的分类效果就不尽如人意了。

    如有问题,敬请指正。欢迎转载,但请注明出处。

    展开全文
  • 朴素贝叶斯假设每个参数(也称为特征或预测变量)具有预测输出变量的独立能力。所有参数的预测组合是最终预测,它返回因变量被分类到每个组中的概率,最后的分类被分配给概率较高的分组(类)。 什么是高斯分布? ...

    Gaussian Naive Bayes (GNB) 是一种基于概率方法和高斯分布的机器学习的分类技术。朴素贝叶斯假设每个参数(也称为特征或预测变量)具有预测输出变量的独立能力。所有参数的预测组合是最终预测,它返回因变量被分类到每个组中的概率,最后的分类被分配给概率较高的分组(类)。

    什么是高斯分布?

    高斯分布也称为正态分布,是描述自然界中连续随机变量的统计分布的统计模型。正态分布由其钟形曲线定义, 正态分布中两个最重要的特征是均值 (μ) 和标准差 (σ)。平均值是分布的平均值,标准差是分布在平均值周围的“宽度”。

    重要的是要知道正态分布的变量 (X) 从 -∞ < X < +∞ 连续分布(连续变量),并且模型曲线下的总面积为 1。

    多分类的高斯朴素贝叶斯

    导入必要的库:

    from random import random
    from random import randint
    import pandas as pd
    import numpy as np
    import seaborn as sns
    import matplotlib.pyplot as plt
    import statistics
    from sklearn.model_selection import train_test_split
    from sklearn.preprocessing import StandardScaler
    from sklearn.naive_bayes import GaussianNB
    from sklearn.metrics import confusion_matrix
    from mlxtend.plotting import plot_decision_regions
    

    现在创建一个预测变量呈正态分布的数据集。

    #Creating values for FeNO with 3 classes:
    FeNO_0 = np.random.normal(20, 19, 200)
    FeNO_1 = np.random.normal(40, 20, 200)
    FeNO_2 = np.random.normal(60, 20, 200)
    
    #Creating values for FEV1 with 3 classes:
    FEV1_0 = np.random.normal(4.65, 1, 200)
    FEV1_1 = np.random.normal(3.75, 1.2, 200)
    FEV1_2 = np.random.normal(2.85, 1.2, 200)
    
    #Creating values for Broncho Dilation with 3 classes:
    BD_0 = np.random.normal(150,49, 200)
    BD_1 = np.random.normal(201,50, 200)
    BD_2 = np.random.normal(251, 50, 200)
    
    #Creating labels variable with three classes:(2)disease (1)possible disease (0)no disease:
    not_asthma = np.zeros((200,), dtype=int)
    poss_asthma = np.ones((200,), dtype=int)
    asthma = np.full((200,), 2, dtype=int)
    
    #Concatenate classes into one variable:
    FeNO = np.concatenate([FeNO_0, FeNO_1, FeNO_2])
    FEV1 = np.concatenate([FEV1_0, FEV1_1, FEV1_2])
    BD = np.concatenate([BD_0, BD_1, BD_2])
    dx = np.concatenate([not_asthma, poss_asthma, asthma])
    
    #Create DataFrame:
    df = pd.DataFrame()
    
    #Add variables to DataFrame:
    df['FeNO'] = FeNO.tolist()
    df['FEV1'] = FEV1.tolist()
    df['BD'] = BD.tolist()
    df['dx'] = dx.tolist()
    
    #Check database:
    df
    

    我们的df有 600 行和 4 列。现在我们可以通过可视化检查变量的分布:

    fig, axs = plt.subplots(2, 3, figsize=(14, 7))
    
    sns.kdeplot(df['FEV1'], shade=True, color="b", ax=axs[0, 0])
    sns.kdeplot(df['FeNO'], shade=True, color="b", ax=axs[0, 1])
    sns.kdeplot(df['BD'], shade=True, color="b", ax=axs[0, 2])
    sns.distplot( a=df["FEV1"], hist=True, kde=True, rug=False, ax=axs[1, 0])
    sns.distplot( a=df["FeNO"], hist=True, kde=True, rug=False, ax=axs[1, 1])
    sns.distplot( a=df["BD"], hist=True, kde=True, rug=False, ax=axs[1, 2])
    
    plt.show()
    

    通过人肉的检查,数据似乎接近高斯分布。还可以使用 qq-plots仔细检查:

    from statsmodels.graphics.gofplots import qqplot
    from matplotlib import pyplot
    
    #q-q plot:
    fig, axs = pyplot.subplots(1, 3, figsize=(15, 5))
    qqplot(df['FEV1'], line='s', ax=axs[0])
    qqplot(df['FeNO'], line='s', ax=axs[1])
    qqplot(df['BD'], line='s', ax=axs[2])
    pyplot.show()
    

    虽然不是完美的正态分布,但已经很接近了。下面查看的数据集和变量之间的相关性:

    #Exploring dataset:
    sns.pairplot(df, kind="scatter", hue="dx")
    plt.show()
    

    可以使用框线图检查这三组的分布,看看哪些特征可以更好的区分出类别

    # plotting both distibutions on the same figure
    fig, axs = plt.subplots(2, 3, figsize=(14, 7))
    
    fig = sns.kdeplot(df['FEV1'], hue= df['dx'], shade=True, color="r", ax=axs[0, 0])
    fig = sns.kdeplot(df['FeNO'], hue= df['dx'], shade=True, color="r", ax=axs[0, 1])
    fig = sns.kdeplot(df['BD'], hue= df['dx'], shade=True, color="r", ax=axs[0, 2])
    sns.boxplot(x=df["dx"], y=df["FEV1"], palette = 'magma', ax=axs[1, 0])
    sns.boxplot(x=df["dx"], y=df["FeNO"], palette = 'magma',ax=axs[1, 1])
    sns.boxplot(x=df["dx"], y=df["BD"], palette = 'magma',ax=axs[1, 2])
    
    plt.show()
    

    手写朴素贝叶斯分类

    手写代码并不是让我们重复的制造轮子,而是通过自己编写代码对算法更好的理解。在进行贝叶斯分类之前,先要了解正态分布。

    正态分布的数学公式定义了一个观测值出现在某个群体中的概率:

    我们可以创建一个函数来计算这个概率:

    def normal_dist(x , mean , sd):
          prob_density = (1/sd*np.sqrt(2*np.pi)) * np.exp(-0.5*((x-mean)/sd)**2)
          return prob_density
    

    知道正态分布公式,就可以计算该样本在三个分组(分类)概率。首先,需要计算所有预测特征和组的均值和标准差:

    #Group 0:
    group_0 = df[df['dx'] == 0]print('Mean FEV1 group 0: ', statistics.mean(group_0['FEV1']))
    print('SD FEV1 group 0: ', statistics.stdev(group_0['FEV1']))
    print('Mean FeNO group 0: ', statistics.mean(group_0['FeNO']))
    print('SD FeNO group 0: ', statistics.stdev(group_0['FeNO']))
    print('Mean BD group 0: ', statistics.mean(group_0['BD']))
    print('SD BD group 0: ', statistics.stdev(group_0['BD']))
    
    #Group 1:
    group_1 = df[df['dx'] == 1]
    print('Mean FEV1 group 1: ', statistics.mean(group_1['FEV1']))
    print('SD FEV1 group 1: ', statistics.stdev(group_1['FEV1']))
    print('Mean FeNO group 1: ', statistics.mean(group_1['FeNO']))
    print('SD FeNO group 1: ', statistics.stdev(group_1['FeNO']))
    print('Mean BD group 1: ', statistics.mean(group_1['BD']))
    print('SD BD group 1: ', statistics.stdev(group_1['BD']))
    
    #Group 2:
    group_2 = df[df['dx'] == 2]
    print('Mean FEV1 group 2: ', statistics.mean(group_2['FEV1']))
    print('SD FEV1 group 2: ', statistics.stdev(group_2['FEV1']))
    print('Mean FeNO group 2: ', statistics.mean(group_2['FeNO']))
    print('SD FeNO group 2: ', statistics.stdev(group_2['FeNO']))
    print('Mean BD group 2: ', statistics.mean(group_2['BD']))
    print('SD BD group 2: ', statistics.stdev(group_2['BD']))
    

    现在,使用一个随机的样本进行测试:FEV1 = 2.75FeNO = 27BD = 125

    #Probability for:
    #FEV1 = 2.75
    #FeNO = 27
    #BD = 125
    
    #We have the same number of observations, so the general probability is: 0.33
    Prob_geral = round(0.333, 3)
    
    #Prob FEV1:
    Prob_FEV1_0 = round(normal_dist(2.75, 4.70, 1.08), 10)
    print('Prob FEV1 0: ', Prob_FEV1_0)
    Prob_FEV1_1 = round(normal_dist(2.75, 3.70, 1.13), 10)
    print('Prob FEV1 1: ', Prob_FEV1_1)
    Prob_FEV1_2 = round(normal_dist(2.75, 3.01, 1.22), 10)
    print('Prob FEV1 2: ', Prob_FEV1_2)
    
    #Prob FeNO:
    Prob_FeNO_0 = round(normal_dist(27, 19.71, 19.29), 10)
    print('Prob FeNO 0: ', Prob_FeNO_0)
    Prob_FeNO_1 = round(normal_dist(27, 42.34, 19.85), 10)
    print('Prob FeNO 1: ', Prob_FeNO_1)
    Prob_FeNO_2 = round(normal_dist(27, 61.78, 21.39), 10)
    print('Prob FeNO 2: ', Prob_FeNO_2)
    
    #Prob BD:
    Prob_BD_0 = round(normal_dist(125, 152.59, 50.33), 10)
    print('Prob BD 0: ', Prob_BD_0)
    Prob_BD_1 = round(normal_dist(125, 199.14, 50.81), 10)
    print('Prob BD 1: ', Prob_BD_1)
    Prob_BD_2 = round(normal_dist(125, 256.13, 47.04), 10)
    print('Prob BD 2: ', Prob_BD_2)
    
    #Compute probability:
    Prob_group_0 = Prob_geral*Prob_FEV1_0*Prob_FeNO_0*Prob_BD_0
    print('Prob group 0: ', Prob_group_0)
    
    Prob_group_1 = Prob_geral*Prob_FEV1_1*Prob_FeNO_1*Prob_BD_1
    print('Prob group 1: ', Prob_group_1)
    
    Prob_group_2 = Prob_geral*Prob_FEV1_2*Prob_FeNO_2*Prob_BD_2
    print('Prob group 2: ', Prob_group_2)
    

    可以看到,这个样本具有属于第 2 组的概率最高。这就是朴素贝叶斯手动计算的的流程,但是这种成熟的算法可以使用来自 Scikit-Learn 的更高效的实现。

    Scikit-Learn的分类器样例

    Scikit-Learn的GaussianNB为我们提供了更加高效的方法,下面我们使用GaussianNB进行完整的分类实例。首先创建 X 和 y 变量,并执行训练和测试拆分:

    #Creating X and y:
    X = df.drop('dx', axis=1)
    y = df['dx']
    
    #Data split into train and test:
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30)
    

    在输入之前还需要使用 standardscaler 对数据进行标准化:

    sc = StandardScaler()
    X_train = sc.fit_transform(X_train)
    X_test = sc.transform(X_test)
    

    现在构建和评估模型:

    #Build the model:
    classifier = GaussianNB()
    classifier.fit(X_train, y_train)
    
    #Evaluate the model:
    print("training set score: %f" % classifier.score(X_train, y_train))
    print("test set score: %f" % classifier.score(X_test, y_test))
    

    下面使用混淆矩阵来可视化结果:

    # Predicting the Test set results
    y_pred = classifier.predict(X_test)
    
    #Confusion Matrix:
    cm = confusion_matrix(y_test, y_pred)
    print(cm)
    

    通过混淆矩阵可以看到,的模型最适合预测类别 0,但类别 1 和 2 的错误率很高。为了查看这个问题,我们使用变量构建决策边界图:

    df.to_csv('data.csv', index = False)
    data = pd.read_csv('data.csv')
    def gaussian_nb_a(data):
        x = data[['BD','FeNO',]].values
        y = data['dx'].astype(int).values
        Gauss_nb = GaussianNB()
        Gauss_nb.fit(x,y)
        print(Gauss_nb.score(x,y))
        #Plot decision region:
        plot_decision_regions(x,y, clf=Gauss_nb, legend=1)
        #Adding axes annotations:
        plt.xlabel('X_train')
        plt.ylabel('y_train')
        plt.title('Gaussian Naive Bayes')
        plt.show()
    def gaussian_nb_b(data):
        x = data[['BD','FEV1',]].values
        y = data['dx'].astype(int).values 
        Gauss_nb = GaussianNB()
        Gauss_nb.fit(x,y)
        print(Gauss_nb.score(x,y))
        #Plot decision region:
        plot_decision_regions(x,y, clf=Gauss_nb, legend=1)
        #Adding axes annotations:
        plt.xlabel('X_train')
        plt.ylabel('y_train')
        plt.title('Gaussian Naive Bayes') 
        plt.show()
    def gaussian_nb_c(data):
        x = data[['FEV1','FeNO',]].values
        y = data['dx'].astype(int).values
        Gauss_nb = GaussianNB()
        Gauss_nb.fit(x,y)
        print(Gauss_nb.score(x,y))
        #Plot decision region:
        plot_decision_regions(x,y, clf=Gauss_nb, legend=1)
        #Adding axes annotations:  
        plt.xlabel('X_train')
        plt.ylabel('y_train')  
        plt.title('Gaussian Naive Bayes')
        plt.show()
    gaussian_nb_a(data)
    gaussian_nb_b(data)
    gaussian_nb_c(data)
    

    通过决策边界我们可以观察到分类错误的原因,从图中我们看到,很多点都是落在决策边界之外的,如果是实际数据我们需要分析具体原因,但是因为是测试数据所以我们也不需要更多的分析。

    作者:Carla Martins

    https://www.overfit.cn/post/0457f85f2c184ff0864db5256654aef1

    展开全文
  • 高斯朴素贝叶斯分类器是针对特征值连续的情况下给出的一种分类方法。 贝叶斯公式 所有的贝叶斯分类器的基石都是概率论中的贝叶斯公式,给定训练数据集D={xi,Ci},i=1,...,N,xi∈RD,Ci∈1,...,KD=\{x_i,C_i\},i=1,...,...
  • Python 高斯朴素贝叶斯的优缺点

    千次阅读 2020-04-06 16:09:19
    关注微信公共号:小程在线 关注CSDN博客:程志伟的博客 Sklearn基于这些分布以及这些分布上的概率估计的改进,为我们提供了四个朴素贝叶斯的分类器 ... 高斯分布下的朴素贝叶斯 naive_bayes.MultinomialNB ...
  • 朴素贝叶斯算法学习总结

    千次阅读 2020-12-09 12:32:05
    1、朴素贝叶斯算法之朴素的含义: 朴素是指假定数据的特征变量之间是相互独立的。 2、朴素贝叶斯算法分类: 将实例分类到后验概率最大的类别当中。 假设实例数据有3个特征向量:{A1,A2,A3},Cj为分类当中的第j个类,...
  • 使用Sklearn学习朴素贝叶斯算法

    千次阅读 多人点赞 2020-10-20 13:32:50
    上一篇文章我向大家介绍了朴素贝叶斯工作的理论部分,需要看的小伙伴请移步:贝叶斯分类器,接下来,我们基于Sklearn机器学习库来使用以下具体的贝叶斯分类器算法。 1,sklearn中的贝叶斯分类器 Sklearn基于数据...
  • 机器学习(五):高斯朴素贝叶斯...GaussianNB 实现了运用于分类的高斯朴素贝叶斯算法。特征的可能性(即概率)假设为高斯分布: 参数\large \sigma _{y}和\large \mu _{y}使用最大似然法估计。 使用数据集:Iris...
  • MPI并行设计 在读取数据时使用串行,其余for循环都采用MPI并行。具体步骤如下: 1. 0进程读取数据文件,生成dataSet数组。 2.通过MPI_Scatterv()函数将dataSet数组分为多个长度不等的数据块,向各...7.得到高斯分布
  • https://zhuanlan.zhihu.com/p/64498790
  • GaussianNB 实现了运用于分类的高斯朴素贝叶斯算法。特征的可能性(即概率)假设为高斯分布: 参数使用最大似然法估计。 高斯朴素贝叶斯实现方法代码: '''高斯朴素贝叶斯''' def MyGaussianNB(trainMat='',...
  • 在开始朴素贝叶斯的学习之前,先弄清楚几个概念:先验概率: 事件发生前的预判概率。可以是基于历史数据的统计,可以由背景常识得出,也可以是人的主观观点给出。一般都是单独事件概率,如P(x),P(y)。后验概率:...
  • 1. 什么是朴素贝叶斯朴素贝叶斯(naive Bayes)法是基于贝叶斯定理与特征条件独立假设的分类方法。对于给定的训练数据集,首先基于特征条件独立假设学习输入输出的联合概率分布;然后基于此模型,对给定的输入x,...
  • 高斯朴素贝叶斯

    千次阅读 2020-10-27 11:44:35
    0. 前言 在前面的几篇博客中,对朴素贝叶斯的理论知识进行了一个学习与总结,接下来希望对sklearn库中的朴素贝叶斯分类器作进一步的学习和说明。
  • 朴素贝叶斯算法优缺点

    万次阅读 2018-07-14 00:06:07
    朴素贝叶斯的主要优点有:1)朴素贝叶斯模型有稳定的分类效率。2)对小规模的数据表现很好,能处理多分类任务,适合增量式训练,尤其是数据量超出内存时,可以一批批的去增量训练。3)对缺失数据不太敏感,算法也...
  • 大部分复杂模型的算法设计都是算法工程师在做,而我们 > 分析很多的数据 > 分析具体的业务 > 应用常见的算法 > 特征工程、调参数、优化 我们应该怎么做 1.学会分析问题,使用机器学习算法的目的,想要算法...
  • 朴素贝叶斯(Native Bayes)算法是基于贝叶斯定理和特征条件独立假设的分类算法。sklearn中的native_bayes模块提供了5中朴素贝叶斯模型。 1. GaussianNB 2.MultinomialNB 3. ComplementNB 4. CategoricalNB ...
  • 朴素贝叶斯算法(Naive Bayes)

    千次阅读 2018-05-04 15:46:48
    一.相关公式 先验概率P(A):在不考虑任何条件下,根据经验或样本统计给出的事件发生的概率. 条件概率P(B|A):A事件发生的条件下,事件B发生的概率.... 朴素贝叶斯的特征条件独立性假设 朴素贝叶斯认为...
  • 贝叶斯方法完整代码 import seaborn as sns iris = sns.load_dataset('iris') X_iris = iris.drop('species', axis=1) y_iris = iris['species'] print(X_iris) from sklearn.cross_validation import train_test_...
  • 贝叶斯Bayes - Thomas Bayes前言一、贝叶斯决策论(Bayesian decision theory)二、实例:高斯朴素贝叶斯 Gaussian Naive Bayes (GaussianNB)1.引入库2.生成数据3.高斯朴素贝叶斯模型总结 前言 在介绍贝叶斯之前,...
  • 朴素贝叶斯的主要优点 朴素贝叶斯模型发源于古典数学理理论,有稳定的分类效率。 对小规模的数据表现良好,能够处理多分类任务,适合增量式训练,尤其是数据量超过内存时,可以逐批地去增量训练。 对缺失数据不太...
  • python实现高斯朴素贝叶斯分类器

    千次阅读 2021-02-12 06:39:15
    在这篇文章中,我们将使用我最喜欢的机器学习库scikit-learn在Python中实现朴素贝叶斯分类器。接下来,我们将使用经过训练的朴素贝叶斯(监督分类法)模型来预测人口收入。在朴素贝叶斯分类器的文章中我们讨论了贝叶斯...
  • 朴素贝叶斯分类算法的具体步骤三、在Python中使用朴素贝叶斯分类算法四、朴素贝叶斯分类算法的使用场景 一、朴素贝叶斯公式 条件概率 先验概率 后验概率 似然度 1. 从统计角度看分类问题 我们知道,选择题一般有A...
  • 一、朴素贝叶斯算法 什么是朴素贝叶斯分类方法 属于哪个类别概率大,就判断属于哪个类别 概率基础 概率定义为一件事情发生的可能性 P(X) : 取值在[0, 1] 联合概率、条件概率与相互独立 联合概率:包含多个...
  • sklearn应用朴素贝叶斯算法 <朴素贝叶斯分类算法原理决策树算法if-else原理> C语言中文网推出辅导班啦,包括「C语言辅导班、C++辅导班、算法/数据结构辅导班」,全部都是一对一教学:一对一辅导 + 一对一...
  • 朴素贝叶斯算法

    2022-03-19 09:55:44
    朴素贝叶斯的前提是特征独立 贝叶斯公式是用来描述两个条件概率之间的关系 公式可以理解为 举例: 计算过程 拉普拉斯平滑 如果词频列表里面有很多次数是0,有可能计算结果为0,拉普拉斯平滑解决分类...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,980
精华内容 3,992
关键字:

高斯朴素贝叶斯算法