朴素贝叶斯是基于贝叶斯定理和特征条件独立假设的分类方法。对于给定的训练数据集,首先基于特征条件独立假设学习输入和输出的联合几率分布;而后基于该模型,对于给定的输入x,利用贝叶斯定理求出后验几率最大的输出y。
通俗来讲,假如你在街上看到一个黑人,我问你这我的来自哪里,你大几率会猜非洲。为何呢?由于黑人中非洲人的比例最高,固然也多是美洲人或亚洲人,但在没有其它可用信息下,咱们会选择条件几率最大的类别,这就是朴素贝叶斯的思想基础。
贝叶斯定理:已知某条件几率,如何获得两个事件交换后的几率,也就是在已知p(x|y)的状况下如何求得p(y|x)。即:算法
条件独立假设数学表达式为:
使用朴素贝叶斯法分类时,对给定的输入x,经过学习到的模型计算后验几率分布p(y=ck|X=x).将后验几率最大的类做为x的类输出,后验几率计算根据贝叶斯定理进行:app
将公式(2)带入公式(3),即得:ide
这就是朴素贝叶斯分类器的基本公式,又因为公式(4)的分母是相同的,所以能够将朴素贝叶斯分类器表示为:函数
从朴素贝叶斯的分类器的公式(5)来看,须要估计两个参数,即:p(y=ck)和p(X(j)=x(j)|y=ck)。其中:
(1)p(y=ck)的极大似然函数估计为:学习
(2)假设第j个特征x(j)的可能取值集合为 (aj,1,aj,2,……,aj,D),条件几率p(X(j)=aj,d)|Y=ck)的极大似然估计是:
其中:
●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
提取码:ohscspa
import numpy as np from sklearn.metrics import accuracy_score from sklearn.model_selection import train_test_split from 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%
一个数据人的自留地是一个助力数据人成长的你们庭,帮助对数据感兴趣的伙伴们明确学习方向、精准提高技能。
扫码关注我,带你探索数据的神奇奥秘3d