• 机器学习Matlab打击垃圾邮件的分类————朴素贝叶斯模型


    该系列来自于我《人工智能》课程回顾总结,以及实验的一部分进行了总结学习机

    垃圾分类是有监督的学习分类最经典的案例,本文首先回顾了概率论的基本知识、则以及朴素贝叶斯模型的思想。最后给出了垃圾邮件分类在Matlab中用朴素贝叶斯模型的实现


    1.概率

    1.1 条件概率

    定义:事件B发生的情况下,事件A发生的概率记作条件概率P(A|B)

    P(A|B)=P(AB)P(B)

    条件概率也叫后验概率。无条件概率也叫先验概率(在没有不论什么其他信息存在的情况下关于命题的信度)

    能够得到乘法规则:

    P(AB)P(A|B)P(B)

    推广有链式法则:

    P(X1,...,Xn)=P(Xn|X1,...,Xn1)P(X1,...,Xn1)=P(Xn|X1,...,Xn1)P(Xn1|X1,...,Xn2)P(X1,...,Xn2)...=i=1nP(Xi)P(x1,...,Xi1)

    1.2 概率公理

    P(¬A)=1P(A)

    P(AB)=P(A)+P(B)P(AB)

    1.3 联合分布和边缘概率分布

    X是随机变量x取值集合,Y是随机变量y取值集合。那么称P(X,Y)为x和y的联合分布P(X,Y)

    边缘概率定义为联合分布中某一个随机变量发生的概率:

    P(X)=yYP(X,y)=yYP(X|y)P(y)

    1.4 独立性

    若事件A和B满足:P(A|B)=P(A)P(B|A)=P(B)P(AB)P(A)P(B),则称A和B是独立的

    称A和B关于C**条件独立**,则有:

    P(A|B,C)=P(A|B)

    P(B|A,C)=P(B|A)

    P(A,B|C)=P(A|C)P(B|C)


    2.贝叶斯法则

    2.1 贝叶斯法则

    从乘法规则P(AB)P(A|B)P(B)=P(B|A)P(A)能够推导出贝叶斯法则:

    P(B|A)=P(A|B)P(B)P(A)

    常常我们把把未知因素cause造成的结果effect看作证据。去确定未知因素cause发生的概率,那么有:

    P(cause|effect)=P(effect|cause)P(cause)P(effect)

    P(effect|cause)刻画了因果关系P(cause|effect)刻画了诊断关系

    举个样例:

    我们预先知道在感冒(cause)的情况下头痛(effect)发生的概率为50%,而感冒的概率为0.025且头痛的概率为0.1,那么某天早上醒来我头痛了,这时我感冒的概率是0.5*0.025/0.1=0.125而不是感觉上的50%

    2.2 朴素贝叶斯模型

    给定cause的情况下有n个彼此条件独立的症状effect,那么他们的联合分布有:

    P(cause,effect1,...,effectn)=P(cause)iP(effecti|cause)

    通常称这个概率分布为朴素贝叶斯模型贝叶斯分类器

    那么朴素贝叶斯模型怎么实现分类呢?

    我们设有非常多种cause(m个),这些cause下分别会表现为n个effect(effect也有多种)。我们统计训练集(已做标记)的结果仅仅能统计知道某个cause的情况下这n个effect的取值。也就是P(effecti|causej),i=1,..,n,j=1,...,m,以及这些cause分别的发生的概率P(causej)

    那么当我们有未标记的測试数据须要预測时,仅仅须要输入这些測试数据的表现。也就是n个effect,我们就能通过一下公式计算出条件概率最大的causej作为我们的预測:

    P(causej|effect1,...,effectn)j=1,...,m=P(causej,effect1,...,effectn)P(effect1,...,effectn)=P(causej)iP(effecti|causej)kP(effect1,...,effectn|causek)P(causek)=P(causej)iP(effecti|causej)k[P(causek)iP(effecti|causek)]

    之所以称之为朴素。是由于其对effect条件独立性的如果,可是往往实际情况中effect并不是条件独立的。


    3.朴素贝叶斯模型下的垃圾邮件分类

    3.1 模型

    如果:

    • 设有n个单词wordii=1,...,nwordi0表示这个单词在这封email中不出现。wordi1表示这个单词在这封email中出现。
    • 设训练集每封email有label标记邮件是否为垃圾邮件spam,label=1则该邮件是垃圾邮件

    模型:

    P(spam|word1,...,wordn)j=1,...,m=P(spam)iP(wordi|spam)P(spam)iP(wordi|spam)+P(norm)iP(wordi|norm)=11+P(norm)iP(wordi|norm)P(spam)iP(wordi|spam)=11+P(norm)P(spam)iP(wordi|norm)P(wordi|spam)

    3.2 训练

    我们须要用训练集计算出:

    • 正常邮件概率P(norm)
    • 垃圾邮件概率P(spam)
    • 单词i在正常邮件中不出现概率P(wordi=0|norm)
    • 单词i在正常邮件中出现概率P(wordi=1|norm)
    • 单词i在垃圾邮件中不出现概率P(wordi=0|spam)
    • 单词i在垃圾邮件中出现概率P(wordi=1|spam)

    那么我们依据朴素贝叶斯模型就可以计算出P(spam|word1,...,wordn),选取一个threshold。若測试集某邮件的P(spam|word1,...,wordn)>threshold则标记该邮件为垃圾邮件

    3.3 Matlab实现

    用Matlab实现朴素贝叶斯模型垃圾邮件分类器例如以下:

    function [ypred,accuracy]= nbayesclassifier (traindata, trainlabel, testdata, testlabel, threshold)
        trainnum = size(traindata, 1);
        wordnum = size(traindata, 2);
    
        p = zeros(wordnum, 2, 2);
        count = zeros(2, 1);
    
        for i = 1 : trainnum
            count(trainlabel(i) + 1) = count(trainlabel(i) + 1) + 1;
            for j = 1 : wordnum
                p(j, trainlabel(i) + 1, traindata(i, j) + 1) = p(j, trainlabel(i) + 1, traindata(i, j) + 1) + 1;
            end
        end
    
        pnorm = count(1) / trainnum;
        pspam = count(2) / trainnum;
    
        p(:, 1, :) = (p(:, 1, :)+1) / (count(1)+1);
        p(:, 2, :) = (p(:, 2, :)+1) / (count(2)+1);
    
        testnum = size(testdata, 1);
        ypred = zeros(testnum, 1);
        correct = 0;
    
        for i = 1 : testnum
            q = pnorm / pspam;
            for j = 1 : wordnum
                q = q * p(j, 1, testdata(i, j) + 1) / p(j, 2, testdata(i, j) + 1);
            end
    
            q = 1 / (1 + q);
    
            if q > threshold
                ypred(i) = 1;
            end
            if ypred(i) == testlabel(i)
                correct = correct + 1;
            end
        end
    
        accuracy = correct / testnum;
    
    end

    当中有几个要点:

    • 我们将已标记数据集划分为训练集和測试集,训练集用来训练模型參数,測试集用来測试模型准确率。依据比較模型预測和測试集真实标记。我们能够计算出模型的准确率threshold
    • p(:, 1, :) = (p(:, 1, :)+1) / (count(1)+1);是为了避免某个单词在某个分类(正常邮件或垃圾邮件)中一直没有出现而导致p(:, 1, :)=0的情况减少分类器鲁棒性的情况(称之为Laplace校准。在数据规模较大时,加1产生的偏差忽略不计)

    3.4 分类结果

    通过枚举threshold的能够确定在某个训练集和測试集划分下,最优的阈值选取

    我简单測试1000个邮件的数据量,6:4划分下最优预測准确率仅仅有90%(待优化)

    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    java它 ------ 图形界面(两)
    使用python+flask让你自己api(教程源代码)
    hadoop工作平台梳理
    互斥锁设计,有效的避免死锁
    Cache基础知识OR1200在ICache一个简短的引论
    工作日志2014-08-04
    POSIX 螺纹具体解释(1-概要)
    3.1、Eclipse
    vim cheat sheet
    C++ 学习资料搜寻与学习(第一期)(未完待续)
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4820067.html
Copyright © 2020-2023  润新知