朴素贝叶斯原理
在所有的机器学习分类算法中,朴素贝叶斯和其他绝大多数的分类算法都不同。对于大多数的分类算法,比如决策树,KNN,逻辑回归,支持向量机等,他们都是判别方法,也就是直接学习出特征输出Y和特征X之间的关系,要么是决策函数Y=f(X)Y=f(X), 要么是条件分布P(Y|X)P(Y|X)。但是朴素贝叶斯却是生成方法,也就是直接找出特征输出Y和特征X的联合分布P(X,Y)P(X,Y),然后用P(Y|X)=P(X,Y)/P(X)P(Y|X)=P(X,Y)/P(X)得出。
1. 定义
先验概率:
在考虑任何新证据之前,基于已有知识或经验对事件发生的概率估计。
例如,在疾病检测中,某疾病的发病率 P(D)就是先验概率。
后验概率:
在观察到新证据后,更新的事件发生概率。
例如,在疾病检测中,已知检测结果为阳性后,患病的概率 P(D∣T)就是后验概率。
2. 数学表达
先验概率:P(Y)
表示事件 Y 在没有任何额外信息下的概率。
后验概率:P(Y∣X)
表示在观察到证据 X 后,事件 Y 的条件概率。
首先,这个名字里的“朴素”是指它做了某种简化的假设。那贝叶斯部分肯定和贝叶斯定理有关。贝叶斯定理是条件概率相关的,所以这个算法是基于条件概率进行分类的。
那贝叶斯定理的公式是什么呢?是P(A|B) = P(B|A) * P(A) / P(B)。也就是说,在B发生的条件下,A发生的概率等于A发生的概率乘以在A发生的条件下B发生的概率,再除以B发生的总体概率。
可是,为什么叫“朴素”呢?应该是因为它在计算的时候做了一些假设来简化问题。假设特征之间是相互独立的,也就是特征之间没有关联。这样在计算联合概率的时候,可以拆分成各个特征概率的乘积,而不需要考虑复杂的条件依赖关系。虽然这在现实中可能不成立,但这样的简化可以让计算变得可行,尤其是当特征数量很多的时候。
朴素贝叶斯分类器具体是怎么工作的呢?
比如说,用天气情况预测是否去打网球。特征可能是天气、温度、湿度、风况等,每个特征有不同的取值,类别是去或不去。训练数据中统计每种特征在去和不去的情况下的条件概率,然后当有一个新的天气情况出现时,计算后验概率,选择较大的那个类别作为预测结果。这时候如果假设各个天气特征之间独立,那么就可以用朴素贝叶斯来分类了。
不过,这里可能要注意处理零概率的问题。比如,如果特征在训练数据中的某个类别里从未出现,那么它的条件概率就会是零,这样整个乘积也会是零,这显然不合理。这时候可能需要用拉普拉斯平滑或者其他方法来调整概率估计,避免零值出现。
应用场景除了文本分类,还有哪些呢?
比如情感分析、垃圾邮件过滤、新闻分类、推荐系统,或者医疗诊断中的分类问题,只要特征可以被合理地独立看待,或者即使不独立但影响不大的情况下,都可以尝试使用朴素贝叶斯。
具体来说训练的过程。先统计每个类别下各个特征的条件概率,以及每个类别的先验概率。比如,先计算垃圾邮件的比例作为先验概率P(垃圾),然后对于每个单词,计算在垃圾邮件中出现的概率P(单词|垃圾),同理正常邮件的概率P(单词|正常)。当有一个新邮件来的时候,里面包含了一些单词,那么就计算P(垃圾)乘以所有单词在垃圾邮件中的条件概率的乘积,同样的计算正常邮件的,然后比较两者的大小,选择较大的那个作为分类结果。
朴素贝叶斯的优缺点是什么呢?
优点:
- 简单、高效,尤其是在高维数据中,比如文本分类,特征数量可能成千上万,但朴素贝叶斯仍然可以处理。而且训练速度很快,因为只需要计算各个概率,不需要复杂的迭代优化过程。
- 它对缺失数据不太敏感,如果某个特征在测试数据中没有出现,可以忽略或者用默认值处理。
缺点:
- 主要是特征条件独立的假设,在现实中往往不成立,比如在文本中,某些词之间可能存在关联,这时候模型可能无法捕捉到这些关系,导致准确率下降。
- 虽然可以通过平滑处理零概率问题,但如果训练数据不足或者分布不均匀,可能对先验概率的依赖较大,影响结果。
拉普拉斯平滑,是一种在概率估计中常用的平滑技术,主要用于处理概率为零的问题。它在朴素贝叶斯分类器、语言模型等场景中被广泛应用,尤其是在处理文本数据时,能够有效避免因某些特征在训练集中未出现而导致的概率为零的问题。
拉普拉斯平滑的核心思想是为每个概率估计加上一个非零的常数(通常是1),以避免零概率问题。具体来说,对于一个离散随机变量 X,其取值范围为 {x1,x2,…,xk},假设我们有 N 个观测值,其中 ni 是 xi 出现的次数。那么,拉普拉斯平滑后的概率估计为:
P(X=xi)=N+kni+1
为什么使用拉普拉斯平滑
避免零概率问题:在实际应用中,尤其是文本数据处理中,某些特征可能在训练集中未出现,但它们在测试集中可能会出现。拉普拉斯平滑通过为每个特征加上一个非零的平滑参数,确保所有特征的概率估计都不为零。
提高模型的鲁棒性:通过平滑处理,模型对未见过的数据有更好的适应性,从而提高模型的泛化能力。
简单易实现:拉普拉斯平滑的实现非常简单,只需在计数时加上一个常数即可。