一、贝叶斯认识
如果你对贝叶斯很陌生,但是你一定会每天都接触输入法快速匹配这样的功能或软件, 比如你输入几个中文字符机器就会识别出你还没输入但是最可能输入的其他字符,能够快速 帮你输入你想输入的东西,表现出的状态就是机器很懂你。搜索引擎中模糊查询的关键词的 快速识别,可以在下拉栏中预测出你想输入的完整答案甚至比你还懂你自己的答案都是贝叶斯算法的功劳。其他类型的还包括大部分跟简单模式识别相关的应用都是跟贝叶斯算法有关的
贝叶斯定理用 Thomas Bayes 的名字命名。Thomas Bayes 是一位不墨守成规的英国牧师, 是 18 世纪概率论和决策论的早期研究者。贝叶斯学派很古老,但是从诞生到一百年前一直 不是主流。主流是频率学派。频率学派的权威皮尔逊和费歇尔都对贝叶斯学派不屑一顾,但 是贝叶斯学派硬是凭借在现代特定领域的出色应用表现为自己赢得了半壁江山
朴素贝叶斯(Naive Bayesian)是基于贝叶斯定理和特征条件独立假设的分类方法,它 通过特征计算分类的概率,选取概率大的情况,是基于概率论的一种机器学习分类(监督学 习)方法,被广泛应用于情感分类领域的分类器
二、概率
1、基于概率论的方法
通过概率来衡量事件发生的可能性。概率论和统计学是两个相反的概念,统计学是抽取 部分样本统计来估算总体情况,而概率论是通过总体情况来估计单个事件或部分事情的发生 情况。概率论需要已知数据去预测未知的事件
例如,我们看到天气乌云密布,电闪雷鸣并阵阵狂风,在这样的天气特征( F )下,我 们推断下雨的概率比不下雨的概率大,也就是 P (下雨)> P (不下雨),所以认为待会儿会下 雨,这个从经验上看对概率进行判断。而气象局通过多年长期积累的数据,经过计算,今天 下雨的概率 P (下雨)=85%、 P (不下雨)=15%,同样的 P (下雨)> P (不下雨),因此今天的 天气预报肯定预报下雨。这是通过一定的方法计算概率从而对下雨事件进行判断
2、条件概率
若Ω是全集, A 、B 是其中的事件(子集),P 表示事件发生的概率,则条件概率表示 某个事件发生时另一个事件发生的概率。假设事件 B 发生后事件 A 发生的概率为:
3、全概率
全概率公式主要用途在于它可以将一个复杂的概率计算问题,分解为若干个简单事件的 概率计算问题,最后应用概率的可加性求出最终结果
4、贝叶斯公式
意义:现在已知时间 A 确实已经发生,若要估计它是由原因 Bi 所导致的概率,则可用 Bayes 公式求出
三、朴素贝叶斯算法 API
scikit-learn 机器学习包提供了 3 个朴素贝叶斯分类算法
1、高斯朴素贝叶斯
调用方法为:sklearn.naive_bayes.GaussianNB(priors=None)
下面随机生成六个坐标点,其中 x 坐标和 y 坐标同为正数时对应类标为 2,x 坐标和 y 坐标同为负数时对应类标为 1
2、多项式朴素贝叶斯
调用方法为:sklearn.naive_bayes.MultinomialNB(alpha=1.0,fit_prior=True, class_prior=None)
主要用于离散特征分类,例如文本分类单词统计,以出现的次数作为特征值
表 xx MultinomialNB 参数说明
参数名称 | 说明 |
---|---|
alpha | 可选,默认为 1.0,添加拉普拉修/Lidstone 平滑参数 |
fit_prior | 默认为 True,表示是否学习先验概率,参数为 False 表示所有类标记具有相同的先验概率; |
class_prior | 接收数组,数组大小为(n_classes,),默认 None, 类先验概率 |
3、伯努利朴素贝叶斯
调用方法为:sklearn.naive_bayes.BernoulliNB(alpha=1.0,binarize=0.0,fit_prior=True,class _prior=None)
类似于多项式朴素贝叶斯,也主要用于离散特征分类
和 MultinomialNB 的区别是:
MultinomialNB 以出现的次数为特征值,BernoulliNB 为二进制或布尔型特性。
下面是朴素贝叶斯算法常见的属性和方法
参数名称 | 说明 |
---|---|
class_prior | 观察各类标记对应的先验概率,主要是 class_prior_属性,返回数组 |
class_count | 获取各类标记对应的训练样本数 |
theta | 获取各个类标记在各个特征上的均值 |
sigma | 获取各个类标记在各个特征上的方差 |
fit(X, y, sample_weight=None) | 训练样本,X 表示特征向量,y 类标记,sample_weight 表各样本权重数组 |
partial_fit(X, y, classes=None, sample_weight=None) | 增量式训练,当训练数据集数据量非常大,不能一次性全部载入内存时,可以将数据集 划分若干份,重复调用 partial_fit 在线学习模型参数,在第一次调用 partial_fit 函数时, 必须制定 classes 参数,在随后的调用可以忽略 |
四、案例:书籍订单评价信息分类
1、中文文本数据集预处理
假设现在需要判断一封邮件是不是垃圾邮件,其步骤如下:
数据集拆分成单词,中文分词技术;
计算句子中总共多少单词,确定词向量大小;
句子中的单词转换成向量,BagofWordsVec;
计算 P(Ci),P(Ci|w)=P(w|Ci)P(Ci)/P(w),表示 w 特征出现时,该样本被分为 Ci 类的 条件概率;
判断 P(w[i]C[0])和 P(w[i]C[1])概率大小,两个集合中概率高的为分类类标
2、数据集读取
假设存在如下所示 Python 书籍订单评价信息,每条评价信息对应一个结果(好评和差 评),如下表所示:
表 xx Pythn 书籍订单评价信息表
内容 | 评价 |
---|---|
从编程小白的角度看,入门极佳。 | 好评 |
很好的入门书,简洁全面,适合小白。 | 好评 |
讲解全面,许多小细节都有顾及,三个小项目受益匪浅。 | 好评 |
前半部分讲概念深入浅出,要言不烦,很赞 | 好评 |
看了一遍还是不会写,有个概念而已 | 差评 |
中规中矩的教科书,零基础的看了依旧看不懂 | 差评 |
内容太浅显,个人认为不适合有其它语言编程基础的人 | 差评 |
破书一本 | 差评 |
适合完完全全的小白读,有其他语言经验的可以去看别的书 | 差评 |
基础知识写的挺好的! | 好评 |
太基础 | 差评 |
略啰嗦。。适合完全没有编程经验的小白 | 差评 |
真的真的不建议买 | 差评 |
代码实现:
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
import jieba
import numpy as np
from sklearn.naive_bayes import MultinomialNB
def build_data():
"""
加载数据
:return: data
"""
data = pd.read_csv('./data.csv'