朴素贝叶斯分类
问题引入
设一个数据集为D={(X1, Y1), (X2, Y2), …, (Xn, Yn)},其中样本Xi的可由m个特征表示,即Xi=(Xi1, Xi2, …, Xim)(一般要离散特征,对于连续特征的情况见后续的注意事项);而Yi为样本标签,Yi∈{C1,C2, …, Ck},i=1,2, …, n.
现有一个新样本X# = (X#1, X#2, …, X#m),在给定的数据集D的基础上估计其所属的类别标签Y#(即对其进行分类,也即估计条件概率P(Y# | X#) )。
算法理论(问题分析)
1.贝叶斯定理
贝叶斯定理给出:
由于P(X#)对于所有类别都是相同的(因为这里是在比较不同类别的后验概率),所以选择忽略它,而只专注于计算
2. 朴素贝叶斯的假设
朴素贝叶斯分类器假设样本特征之间相互独立,即:
忽略分母P(X#)且应用该假设之后,
3. 计算概率
计算
…………
k个“概率值”的最大值对应的Ck即为最后所预测的样本X#的标签。
这里使用所给定的数据集D的“频率”代替“概率”:
其中,为D中标签为Ck的样本数量,n为D中的样本总数,
计算的是类别Ck中样本的第j个特征的值为X#j的样本数(也即D中类别为Ck且第j个特征的值为X#j的样本的数量)。
另外,在实际应用中,为了防止出现“零概率”(D中不一定有足够的样本数量造成的),实际使用的计算中需要加入平滑处理,如拉普拉斯平滑:
其中,K为标签的种数(即样本的标签共用K种),Aj为X#j所有可能取值的个数(即样本的第j个特征共有Aj种取值),j=1,2, …, m。
. 注意事项
朴素贝叶斯分类器假设特征之间相互独立,虽然这在实际应用中往往不成立,但它在许多情况下仍然表现良好。
对于连续特征,通常假设它们服从某种分布(如高斯分布),并计算该分布的参数(如均值和方差),然后使用这些参数来估计条件概率。
拉普拉斯平滑或其他平滑技术可以帮助处理零概率问题,提高模型的鲁棒性。
示例实验-垃圾信息识别
数据准备
原数据文件:SMSSpamCollection,每行表示一个样本(文本标签,文本单词,用Tab格隔开)。样本总数为5574,分两类(ham、spam分别表示正常短信、垃圾短信)。
SMSSpamCollection部分内容
加载数据集并拆分为训练集、测试集:
上述得到的样本特征数据还只是用单词文本表示的,需要进一步转换为数学特征:
这里介绍完sklearn.feature_extraction.text.CountVectorizer的用法和功能就能更深入了解上述代码在做什么工作。
CountVectorizer 是 scikit-learn(通常简称为 sklearn)库中用于文本数据特征提取的一个工具类。它可以将文本数据(比如句子或文档集合)转换成数值型的特征向量,这些特征向量可以进一步用于机器学习模型的训练。
此次构造CountVectorizer实例使用的两个构造函数的参数:token_pattern和max_feature,分别指定单词转换为特征向量的规则、特征向量的最大长度。
token_pattern参数(有默认值)需要指定一个正则表达式,用于匹配并定义什么是一个“token”(通常指一个词)。这个参数决定了什么样的字符序列会被视为词汇表中的独立项。
max_features参数用于限制词汇表中的最大单词数量。具体来说,它会根据词频(term frequency)对词汇表中的词进行排序,并保留出现频率最高的前max_features个词作为最终的词汇表。
这里还有一个核心参数ngram_range(本文的代码暂时没有指定,使用默认值)。参数类型:tuple (min_n, max_n),默认值:(1, 1);
ngram_range指定了n-gram中n的最小值和最大值。在这个范围内,所有的n值都会被用来生成n-gram。例如,ngram_range=(1, 3)表示同时生成unigrams(单个词)和bigrams(两个连续词组成的词组)。在文本处理任务中,使用n-gram可以帮助捕捉词汇之间的组合信息,从而提高模型的性能。通过调整ngram_range,可以控制生成的特征的复杂度和数量。
举例说明:
示例1
示例1代码:
示例2
模型构建与训练、评估
调用sklearn接口提供的模型
代码:
运行结果:
训练集、测试集样本数量分别为4180、1394,模型在两个数据集的预测准确率分别约为98.97%和98.13%。
调用本文自行实现的模型(速度未优化)
naiveBayes.py源码,根据上述的算法理论自行实现,主要靠for循环一一实现,所以预测新样本的速度会较慢,这里只是为了加深对该算法的理解,速度优化问题(一般要选择更合适的数据结构)暂时先不讨论。
运行结果(运行过程花费时间较长):
类似地,训练集、测试集样本数量分别为4180、1394,模型在两个数据集的预测准确率分别约为99.47%和95.41%。这里每个样本的预测(每个样本有2000个特征)需要约0.74秒,5574个样本的预测花费超过一个小时。
小结
朴素贝叶斯分类是应用了贝叶斯定理和样本特征独立的条件假设,是一种基于统计的、有监督的机器学习方法。
1. 理论思想
贝叶斯定理描述了条件概率之间的关系。在分类问题中,利用贝叶斯定理来计算给定观测数据(样本特征)下,样本属于各个类别的概率,然后选择概率最大的类别作为预测结果。
样本特征之间的条件独立性是一个关键假设,即一个特征的出现与另一个特征的出现无关,仅与类别有关。这个假设大大简化了计算过程,使得联合概率分布的计算分解为各个特征概率的乘积,从而降低了计算复杂度。
2. 优点
- 计算简单,效率高
- 对缺失数据不敏感
- 适合多分类问题
3. 缺点
- 特征条件独立假设具有一定的局限性
- 对输入数据的表达形式敏感:如特征的选择和权重分配等。
- 参数估计的敏感性
4. 应用领域
朴素贝叶斯分类器在信息检索、文本分类、垃圾邮件检测、情感分析等领域有着广泛的应用。主要适用于特征维度高、数据量大的分类问题。
5. 改进方向(了解)
为了克服朴素贝叶斯分类器的局限性,研究者们提出了许多改进方法,如半朴素贝叶斯分类器(放宽特征条件独立假设)、贝叶斯网络(利用特征之间的依赖关系)等。这些方法在一定程度上提高了分类性能,但同时计算复杂度和实现难度更高。
注:关注微信公众号——分享之心,后台回复“机器学习基础实验”获取完整代码和相关文档资料的地址(不断更新)。