实战朴素贝叶斯算法

1.准备安装

[global]  
index-url = https://pypi.tuna.tsinghua.edu.cn/simple  

linux下~/.pip/pip.conf内容为:

[global]  
index-url = https://pypi.tuna.tsinghua.edu.cn/simple  

二 sublime 配置python环境

配置参考:https://www.cnblogs.com/zhaof/p/8126306.html

三 贝叶斯回顾

本来自己已经理解了,再找一题,突然又点模糊了,题目如下:

有一种病x,假设在人群中得病的概率为0.01%即万分之一,有一种检测方法,检测的准确率为99.9%,误报率为0.1%,那么如果有人检测的时候,检测出来是患有x这个病,那么这个人的的病概率是多少?

思考计算过程:
用B+表示得病,用B-表示未的病,用T标识检测出来有病,用F标识未检测出来有病。
条件
得病的概率:P(B+) = 0.01%
未得病的概率:P(B-) = 99.99%
得病情况下,检测到的得病的概率:P(T|B+) = 99.9%
得病情况下,未检测到的得病的概率:P(F|B+) = 0.1%
未得病情况下,检测到的得病的概率:P(T|B-) = 0.1%
未得病情况下,未检测到的得病的概率: P(F|B-) = 99.9%

计算过程

  • 直观计算法:
    我们要求的是:P(B+|T) 即在检测得病情况下,真正得病的几率是多少。
    我们可以直接思考下,P(B+|T) = 查出且得病人数/查出的总人数
    假设总人数为X,那么P(B+|T)= X*0.01%*99.9%(有病且检测出来)/[X*0.01%*99.9%(有病且检测出来)+X*99.9%*0.1%(无病但是检测出有病) = 0.00999%/(0.00999%+0.0999%) 约等于9%。

  • 贝叶斯计算法:
    P(B+|T) = P(T|B+)*P(B+)/P(T)
    = 99.9%*0.01%/P(T)
    我原来卡在这里面P(T)怎么求,T是标识检测出来得病的概率,这个怎么算。
    其实可以这样想,P(T)概率有两部分组成,一是有病检测出来的概率+无病检测出来的概率
    所以P(T) = 0.01%*99.9%+ 99.9%*0.1%
    和上面一样了。
    所以可以得到更普遍的贝叶斯公式:


    贝叶斯公式

    通用的贝叶斯公式

对照下图公式更好理解:


全概率公式理解

四 .朴素贝叶斯实战

在机器学习领域,一般都是获取数据集合,然后对数据进行可视化和基础的探测,接着选择特征向量,对数据进行预处理,然后训练模型,测试模型的准确率,最后使用模型来预测数据执行结果。

我们这次用Sklearn进行测试,这个是非常简单好用的机器学习库,对于朴素贝叶斯分类算法,分为三个,分别为高斯朴素贝叶斯,多项式朴素贝叶斯,伯努利朴素贝叶斯。

高斯朴素贝叶斯: 特征变量是连续变量,符合高斯分布,比如高考成绩,身高等。
多项式贝叶斯:特征变量是离散的,符合多项式分布,在文档中特征表现为单词的TF-IDF等。
伯努利朴素贝叶斯:特征变量为0或1,这种布尔变量。
伯努利朴素贝叶斯以文件为粒度,如果单词在文件中出现为1,不出现为0,多项式贝叶斯会计算单词在文件中出现的具体次数。高斯贝叶斯,适合特征变量为连续的,且是符合正态分布的数据。

实战准备
对于垃圾邮件来说,是个二分类的问题,我们判断每个单词在垃圾邮件中的概率,在正常邮件中的概率,然后再结合先验概率,求得特定一段邮件文本下的此邮件是垃圾邮件的可能性。

这时候可能会发现误判率应该还是比较高,原因是什么那?因为每个词其实在判断垃圾邮件的重要程度是不一样的,有的可能更重要,有的可能不重要;什么样的词更重要,更能够代表整个邮件的属性那,可以用以前的TF-IDF作为特征替代词的频率,这个在以前的文档相似度算法中有过基本的描述,文档相似度通过单词间的TF-IDF来经过复杂的公式来比对。
TF: 即Trem Frequency 即单词在一个文档中出现的次数;
IDF: Inverse Document Frequency 即逆向文档频率,标识的是在多少个文档中出现单词的倒数。

TF: 标识的是这个单词可以代表的文档的程度;IDF:标识的是这个单词本身的重要性,如果在越多文档中包含这个词,这个词的重要性也就越低。

TF

IDF

TF-IDF = TF*IDF
IDF计算过程中+1防止出现次数为0,用log我像是为了让取值范围更小一些。

代码

# -*- coding: utf-8 -*-
import os
import jieba
import warnings
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn import metrics

warnings.filterwarnings('ignore')

def cut_words(one_dir,label):
    '''
    :param one_dir 一类文件比如体育等
    return  一类的所有词语
    '''
    tmp_words = ''
    one_labels = []
    one_words = []
    for one_file in os.listdir(one_dir):
        real_name = one_dir +'\\'+one_file
        text = open(real_name, 'r', encoding='gb18030').read()
        words = jieba.cut(text)
        for one in words:
            tmp_words += one + ' '
        one_words.append(tmp_words)
        one_labels.append(label)
        tmp_words = ''
    return one_words,one_labels

def get_data_label(file_path):
    all_class_words = []
    all_class_labels  = []
    for dir_name in os.listdir(file_path):
        one_dir = file_path+'\\'+dir_name
        words, labels = cut_words(one_dir,dir_name)
        all_class_words.extend(words)
        all_class_labels.extend(labels)
    return all_class_words,all_class_labels



if __name__== "__main__":
    org_path = 'E:\\python\\PythonCode\\text_classification-master\\text classification'
    file_path = org_path+ '\\train'

    #1.提取词语
    all_train_words,all_train_label = get_data_label(file_path)
    all_test_words,all_test_label = get_data_label(org_path+'\\test')
    #print(len(all_train_words))
    #print(all_train_label[0])

    #2.根据词语生成tf-idf
    stop_words = open(org_path+ '\\stop\\stopword.txt', 'r', encoding='utf-8').read()
    stop_words = stop_words.encode('utf-8').decode('utf-8-sig') # 列表头部\ufeff处理
    stop_words = stop_words.split('\n') # 根据分隔符分隔
    # 计算单词权重 词在文档中出现频率大于60%就删除不计算
    # td-idf 计算的时候是一串单词
    tf = TfidfVectorizer(stop_words=stop_words, max_df=0.6)
    train_features = tf.fit_transform(all_train_words)
    # 上面fit过了,这里transform
    test_features = tf.transform(all_test_words) 

    #3. 多项式贝叶斯分类器训练
    from sklearn.naive_bayes import MultinomialNB  
    #alpha 做平滑处理,不是所有的词都出现,所以原来为0 的改下,改成非零,越小越精确计算越慢
    clf = MultinomialNB(alpha=0.0001).fit(train_features, all_train_label)
    
    #4.预测
    predicted_labels=clf.predict(test_features)
    
    #5. 计算准确率
    print('准确率为:', metrics.accuracy_score(all_test_label, predicted_labels))

说明:
1)词的TF-IDF计算需要多篇文档,这样可以求出IDF,即类似词的权重的概念。
2)TfidfVectorizer计算的时候需要传入的是空格分割的多个单词。
3)TF-IDF实际上相当于一个词语的信息量。

参考:
垃圾邮件分类处理:https://blog.csdn.net/loveliuzz/article/details/78827741
朴素贝叶斯:https://blog.csdn.net/sinat_30353259/article/details/80932111
一些预处理函数说明:https://blog.csdn.net/anshuai_aw1/article/details/82498374
skearn预处理:https://blog.csdn.net/wang1127248268/article/details/53264041
均差方差理解:https://blog.csdn.net/u013066730/article/details/83029619

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,284评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,115评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,614评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,671评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,699评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,562评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,309评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,223评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,668评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,859评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,981评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,705评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,310评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,904评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,023评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,146评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,933评论 2 355

推荐阅读更多精彩内容