朴素贝叶斯模型

在生成学习算法中,特征向量是连续值,从而我们假设一个连续分布,来拟合P(x|y)。如果x是离散的并且维数很大又该怎么处理?

 

文本分类问题

以文本分类为例子,引出朴素贝叶斯方法。

考虑分类邮件的例子。我们要通过邮件中的文本,来建立模型,从而把垃圾邮件与正常邮件区分开开来。而邮件一般由文字组成,我们要把这些文字提取作为邮件的特征。一个简单的方法就是建立字典,每一维代表一个字母是否出现,于是每个邮件可以提取得到如下特征向量:


1表示出现,0表示没出现。

如果我们选择一个5000个单词的字母表,那么邮件的特征便为5000维。根据生成模型的方法,我们要假设一个分布P(X|Y)。那么,如果假设P(X|Y)满足多变量高斯分布,那么这个高斯分布有2^5000-1的参数需要拟合。

 

朴素贝叶斯假设

为了处理这种维数过高的情况,我们做一个假设:X的每一维特征之间都是独立的。这也就是朴素贝叶斯假设。

根据独立分布的条件,我们就能够容易地写出P(X|Y),如下:


实践证明,即使我们做了朴素贝叶斯假设,而且这还是一个很强的,大部分情况下都不完全成立的假设,如上的模型还是有比较好的效果的。

 

拟合参数

写出最大释然公式:


最大化,得到拟合参数:


得到如上参数之后,对于一个新的样本,我们能够如下估计其标签:



然后比较其属于哪个类的概率更大。

 

连续变量处理

在许多情况下,我们可以把连续的特征分布离散化,然后在朴素贝叶斯假设下,简单计算离散值的概率,然后把复杂的分布特征转化为简单的朴素贝叶斯模型。如下就是一个简单的离散化处理:


这样做的目的,就是把复杂的分布简单化。

 

拉普拉斯平滑

考虑到训练样本的局限性,有时候,我们会得到某个特征数量为0的情况。也就是,当某个样本不满足一定条件,那么这个样本属于此类的概率就会为0,而不管他的其他特征与这类如何相似。

比如,区分男人,女人,身高作为一个特征值。我们得到的训练样本中,男生身高全部大于170。那么朴素贝叶斯模型得到的P(身高<170|其为男生)=0。

可想而知,由于这个假设,所有身高小于170的测试样本,无论男女都会被判定为女生。

为了解决这种情况,我们给每个特征加入一个基础的概率值,也就是拉普拉斯平滑。比如假设训练样本中每种属性至少有一个人。

也就是把公式:


改写为:

 


多项式事件模型

在垃圾邮件模型中,我们假设文件发送者恶意与否已经根据P(Y)决定了。那么对于每个特定的词xi,正常发送者有P(xi|Y=0)的概率发送;恶意发送者有P(xi|Y=1)的概率发送这个词。再通过朴素贝叶斯假设,我们得到了垃圾邮件分类的多变量伯努利模型。

 同样是朴素贝叶斯假设,我们从另一个角度考虑垃圾邮件问题,得出另一种基于朴素贝叶斯假设的垃圾邮件特征提取方法。

还是字典:


我们考虑遍历邮件的文本,如果第一个词在字典中为3000位,那么我们有x1=3000;同理我们可以依次得到ni个特征值(x1,x2,…,xni),这里的ni表示邮件i的词数。

上面的多变量伯努利模型中,我们以字典中的每个词发,或不发,为一次随机试验,然后做N次独立试验。这里,我们把所有的词看做一个统一的试验,每次依概率取出不确定的值,然后做ni次独立试验。这种方法也称为多项式事件模型。

 

一个简单的比喻:

多变量伯努利模型中,有N个发送开关,每个开关决定某个词是否发送,每个开关开启关闭的概率一定,然后发送者依概率做N次选择。

多项式事件模型中,有一个大麻袋,里面装了N个球,每个球代表一个单词,同一个单词可以有多个球。发送者从麻袋里随机摸出一个球,然后发送球上的单词。

 

写出最大释然估计:


最大化求解得到:


考虑加入拉普拉斯平滑值,得到:

 

结论:朴素贝叶斯模型是简单的容易实现的模型,其效果也很好,会是很多问题的首选。


Matlab实现

实现基于朴素贝叶斯的伯努利模型:

基于UCI的某个数据库进行实验:

http://archive.ics.uci.edu/ml/datasets/Statlog+%28Australian+Credit+Approval%29 


贝叶斯函数:

function test_label=bays(train_feature,train_label,test_feature)
[N,M]=size(train_feature);
Maxmin=zeros(N,2);
Maxmin(:,1)=min(train_feature')';
Maxmin(:,2)=max(train_feature')';
S=zeros(N,2);
S(:,1)=(Maxmin(:,1)+Maxmin(:,2))./3;
S(:,2)=2*(Maxmin(:,1)+Maxmin(:,2))./3;
Py0=sum(train_label==0)/length(train_label);
Py1=1-Py0;
P1=zeros(N,3);
P0=zeros(N,3);
for i=1:N
    for j=1:M
        if(train_label(j)==1)
            if(train_feature(i,j)<S(i,1))
                P1(i,1)=P1(i,1)+1;
            elseif(train_feature(i,j)>=S(i,1)&&train_feature(i,j)<S(i,2))
                P1(i,2)=P1(i,2)+1;
            else
                P1(i,3)=P1(i,3)+1;
            end
        else
            if(train_feature(i,j)<S(i,1))
                P0(i,1)=P0(i,1)+1;
            elseif(train_feature(i,j)>=S(i,1)&&train_feature(i,j)<S(i,2))
                P0(i,2)=P0(i,2)+1;
            else
                P0(i,3)=P0(i,3)+1;
            end
        end
    end
end

P1=(P1+1)./(sum(train_label==1)+3);
P0=(P0+1)./(sum(train_label==0)+3);
%拉普拉斯平滑
[N,m]=size(test_feature);


for i=1:m
    p0=1;
    p1=1;
    for j=1:N
        if(test_feature(j,i)<S(j,1))
            p1=p1*P1(j,1);
            p0=p0*P0(j,1);
        elseif(test_feature(j,i)>=S(j,1)&&test_feature(j,i)<S(j,2))
            p1=p1*P1(j,2);
            p0=p0*P0(j,2);
        else
             p1=p1*P1(j,3);
             p0=p0*P0(j,3);
        end
    end
        px=p1*Py1+p0*Py0;
        p1=p1*Py1/px;
        p0=p0*Py0/px;
        if(p1>p0)
            test_label(i)=1;
        else
            test_label(i)=0;
        end
end
end

主函数:

clear;
clc;
load data;
L=bays(train_feature,train_label,test_feature);
n_0=sum(test_label==0);
n_1=sum(test_label==1);
n=length(test_label);


acc=0;
pd=0;
pf=0;
pre=0;
for i=1:n
    if(L(i)==test_label(i))
        acc=acc+1;
    end
        if(L(i)==1&&test_label(i)==0)
            pf=pf+1;
        end
    if(L(i)==1&&test_label(i)==1)
        pd=pd+1;
    end
    if(L(i)==1)
        pre=pre+1;
    end


end
acc=acc/n;
pre=pd/pre;
pf=pf/n_0;
pd=pd/n_1;
Fmeasure = 2*pd*pre/(pd+pre);


结果:

Pd=87.58%

Pf=14.58%

Pre=82.72%

Acc=86.38%

F_measure=85.05%

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值