朴素贝叶斯算法_朴素贝叶斯算法

97f6c93b16316d0bb57d7ef9983eb222.gif

是新朋友吗?记得先点蓝字关注我哦~

作者介绍

知乎@王多鱼

京东的一名推荐算法攻城狮。

主要负责商品推荐的召回和排序模型的优化工作。

一、朴素贝叶斯原理简介

朴素贝叶斯是基于贝叶斯定理和特征条件独立假设的分类方法。对于给定的训练数据集,首先基于特征条件独立假设学习输入和输出的联合概率分布;然后基于该模型,对于给定的输入x,利用贝叶斯定理求出后验概率最大的输出y。

通俗来说,假如你在街上看到一个黑人,我问你这个人来自哪里,你大概率会猜非洲。为什么呢?因为黑人中非洲人的比例最高,当然也可能是美洲人或亚洲人,但在没有其它可用信息下,我们会选择条件概率最大的类别,这就是朴素贝叶斯的思想基础。

贝叶斯定理:已知某条件概率,如何得到两个事件交换后的概率,也就是在已知p(x|y)的情况下如何求得p(y|x)。即:

cc6d664e911886a1ebfdde9d73e2fe87.png

条件独立假设数学表达式为:

3ce376590c7dc122d5f9c74418005786.png

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

f5dbf2685d47abf4a6e6a680d3b0a718.png

将公式(2)带入公式(3),即得:

8daf7b1897f311e01c8fcd01997cdd06.png

这就是朴素贝叶斯分类器的基本公式,又由于公式(4)的分母是相同的,因此可以将朴素贝叶斯分类器表示为:

de437d57ff591861bcd52fa664ae0e32.png

二、朴素贝叶斯参数估计

从朴素贝叶斯的分类器的公式(5)来看,需要估计两个参数,即:p(y=ck)和p(X(j)=x(j)|y=ck)。其中:

(1)p(y=ck)的极大似然函数估计为:

b31e328571c2bb54f9ef0d49a136913a.png

(2)假设第j个特征x(j)的可能取值集合为 (aj,1,aj,2,……,aj,D),条件概率p(X(j)=aj,d)|Y=ck)的极大似然估计是:

74e021df863b2edba08bc210bee5171c.png

其中:

●i=1,...,M 表示样本个数;

●j=1,...,n 表示特征个数;

●k=1,...,K 表示标签的类别个数;

●Xi(j)表示第i个样本的第j个特征;

●aj,d表示第j个特征的第d类取值;

●I是指示函数。

三、实践朴素贝叶斯算法

下面使用朴素贝叶斯模型,对邮件进行分类,识别邮件是不是垃圾邮件。

数据下载地址:

链接:https://pan.baidu.com/s/1er-AjWm-inaWPf-r0qxnLA
提取码:ohsc

import numpy as npfrom sklearn.metrics import accuracy_scorefrom sklearn.model_selection import train_test_splitfrom sklearn.naive_bayes import MultinomialNB  # 预处理数据def text_parse(big_string):    token_list = big_string.split()    return [tok.lower() for tok in token_list if len(tok)>2]  # 去除列表中重复元素,并以列表形式返回def create_vocab_list(data_set):    vocab_set = set({})    for d in data_set:        vocab_set = vocab_set | set(d)            return list(vocab_set)  # 统计每一文档(或邮件)在单词表中出现的次数,并以列表形式返回def words_to_vec(vocab_list, input_set):    return_vec = [0] * len(vocab_list)     for word in input_set:        if word in vocab_list:            return_vec[vocab_list.index(word)] += 1                return return_vec   # 朴素贝叶斯主程序 doc_list, class_list, x = [], [], [] for i in range(1, 26):    # 读取第i篇垃圾文件,并以列表形式返回    word_list = text_parse(open('email/spam/{0}.txt'.format(i), encoding='ISO-8859-1').read())    doc_list.append(word_list)    class_list.append(1)        # 读取第i篇非垃圾文件,并以列表形式返回     word_list = text_parse(open('email/ham/{0}.txt'.format(i), encoding='ISO-8859-1').read())    doc_list.append(word_list)    class_list.append(0)        # 将数据向量化vocab_list = create_vocab_list(doc_list) for word_list in doc_list:    x.append(words_to_vec(vocab_list, word_list))  # 分割数据为训练集和测试集x_train, x_test, y_train, y_test = train_test_split(x, class_list, test_size=0.25)x_train, x_test, y_train, y_test = np.array(x_train), np.array(x_test),\    np.array(y_train), np.array(y_test)  print("x_train: ")print(x_train[:5])print("\n")print("y_train: ")print(y_train[:5])print("\n")  # 训练模型nb_model = MultinomialNB()nb_model.fit(x_train, y_train)  # 测试模型效果y_pred = nb_model.predict(x_test)  # 输出预测情况print("正确值:{0}".format(y_test))print("预测值:{0}".format(y_pred))print("准确率:%f%%" % (accuracy_score(y_test, y_pred)*100))

结果如下所示,识别正确率为92.3%,效果还算可以哦。

x_train: [[0 0 0 ... 0 0 0] [0 0 0 ... 0 0 0] [0 0 0 ... 0 0 0] [0 0 0 ... 0 0 0] [0 0 0 ... 0 0 0]]  y_train: [1 0 0 0 1]  正确值:[1 1 1 1 1 1 1 1 1 1 1 0 0]预测值:[1 1 1 0 1 1 1 1 1 1 1 0 0]准确率:92.307692%
b691cc78bd59e5c21852ea8df0602b90.png

一个数据人的自留地是一个助力数据人成长的大家庭,帮助对数据感兴趣的伙伴们明确学习方向、精准提升技能。

扫码关注我,带你探索数据的神奇奥秘

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值