Naive Bayes

Naive Bayes——Naive在哪?

导读:经典机器学习算法中,Naive Bayes可占一席之地,也是唯一一个纯粹的概率分类算法模型。考虑其原理简单却不失强悍性能,Naive Bayes是个人最喜爱的算法之一——当然,另一个是决策树。

贝叶斯其人,据说只是业余数学家
Naive Bayes,中文译作朴素贝叶斯,这里Naive的原义是幼稚的,常常带有一点贬义的味道,用在这个算法命名中翻译为朴素,也称得上是一种包容了。另一个关键词贝叶斯,则是因为朴素贝叶斯算法的主要理论依据是贝叶斯定理,所以本文首先介绍贝叶斯定理,然后引出朴素贝叶斯算法的基本思想和原理。

01 贝叶斯定理
贝叶斯定理一般用于求解后验概率,核心公式为:

其中:

P(A|B)称作后验概率,为待求目标
P(A)为先验概率,一般用大量数据统计得出,当数据量较少时也可根据经验提供
P(B|A)为条件概率,可根据大量数据统计得出,一般采用极大似然估计的方式给出,实际上也属于先验概率
P(B)实际上当然也属于先验概率,而且仅涉及到单变量,所以与P(A)类似,也可用数据统计得出,但由于P(B)在贝叶斯定理中独立处于分母中,其具体数值的大小不会影响最大后验概率的判定结果,一般无需计算。如果在先验概率未知且确需计算的话,那么一般会引入贝叶斯全概率公式:
即遍历可能触发B的所有条件Ai,得到其最终的P(B)。

在此基础上,贝叶斯定理常用于解决这样一类场景,这里引用一个经典的贝叶斯条件概率问题:

假设在某居民区, 一种罕见的疾病以1‰的概率传染其他人。该疾病有一种检验方法:若有人传染上了这种病,其检验结果有99%的概率呈阳性;同时此检验也会产生一些虚假的阳性,即未传染的患者有2%的概率也呈阳性。问当前一名居民检验呈阳性,传染该病的真实概率有多大?
在这一问题中,简单对应一下几个概率为:

先验概率:P(传染)=0.001,P(未传染)=0.999
条件概率:P(阳性|传染)=0.99,P(阴性|传染)=0.01;P(阳性|未传染)=0.02,P(阴性|未传染)=0.98
待求目标概率:P(传染|阳性)
其中分子的推导即用到全概率公式。带入相应的基础概率值,可以得出在检测为阳性的情况下真实传染的概率仅为4.7%,未传染的概率即为95.3%。

这可能是一个令人大跌眼镜的计算结果,但确实是经过理论计算得出。一个直观的理解是虽然在传染后检测呈阳性的概率很大,但由于传染的基数过小,导致小基数大概率的作用结果未能抵过大基数小概率的影响。

02 朴素贝叶斯算法
在介绍贝叶斯定理的基础上,那么朴素贝叶斯的思想其实已经非常简单:单特征条件下可以应用贝叶斯定理得出不同条件的概率(比如前例中根据检测呈现阳性还是阴性这个特征计算传染和未传染的概率),那么能否根据多维特征来推广这个概率求解公式呢?这就涉及到朴素贝叶斯的一个核心假设:朴素(Naive)!

问题可描述为:

用机器学习语言描述:B1……Bn表示每一列特征取值,A代表分类标签结果。
其中:

P(Ai|B1, B2, …, Bn)是在已知观测特征B1,B2,…,Bn的情况下计算Ai发生的概率,为待求目标
P(B1, B2, …, Bn|Ai)为在Ai条件下出现B1,B2,…,Bn的一组特定特征的条件概率
P(Ai)为A事件的先验概率
P(B1, B2, …, Bn)作为分母,不影响相对大小,其实可以不用求解
那么,为了求出观测特征发生的相对概率大小,则需分别计算P(Ai)和P(B1, B2, …, Bn|Ai)两类概率,其中前者涉及单变量自然比较好求解,难点在于后者。这个概率的求解难度有多大呢?设想一下,假如每个B1……Bn每个事件取值都只有两类,那么对于每个分类标签Ai,要根据数据统计计算的先验概率P(B1, B2, …, Bn|Ai)则有2n个,这是一个随特征列数指数增长的概率结果,还只是一个分类标签,K个分类标签理论上最多有K*2n个先验概率。这是一个不可接受的事实。于是,朴素贝叶斯的关键假设浮出水面:假设各特征间相互独立!进而:

于是,K2^n个先验概率瞬间变为K2*n个先验概率,即可分别对每列特征Bj求解不同分类标签下的先验概率P(Bj|Ai),其中每个分类标签对应的单特征Bj仅需2个先验概率。这是一个可以接受的计算量。

至此,朴素贝叶斯算法训练的过程实际上就是求解各个先验概率P(Ai)和条件概率P(Bj|Ai)的过程,然后在预测分类过程中则仅需将训练过程中得到的各个概率值代入贝叶斯公式中,即可得到当前特征下的各分类标签的相对概率结果。其中相对概率较大的自然就作为预测结果标签。

朴素贝叶斯算法就是这么简单易懂!

03 几个值得注意的点
朴素贝叶斯算法原理简单,实现起来也不复杂,在某些特定场景下也有着较好的算法性能(例如垃圾邮件识别),但以下几点值得注意:

朴素贝叶斯算法仅可用于分类,而不能执行回归任务。可能也是唯一一个仅可用于分类而不能用于回归的算法模型
根据特征数值离散或连续,在求解或拟合条件概率时可分别得到离散下多项式分布或连续条件下高斯分布
在计算条件概率过程中,一个不容忽视的细节是拉普拉斯平滑:即考虑条件概率是由有限的训练样本统计计算得出,那么自然可能存在未覆盖的特殊情况,例如在分类标签Ai下Bj的某特征出现概率为0,那么在Bj出现该特征时作用的所有结果都会是0。这是一个过于简单粗暴的处理,毕竟训练中未曾出现不代表不可能出现。所以,在实际建模中会以最小出现1次参与计算条件概率。类似地,在特征取值连续条件下,也被赋予了一个特定的最小概率来避免0概率出现时的一刀切。
最后,Naive Bayes中的Naive,难道仅表示各特征列相对独立的这一朴素的假设吗?其实不然!还有另外一层隐藏的含义在于:Naive Bayes还假设各特征对标签预测的重要程度(feature_importance)是一致的!

### 朴素贝叶斯算法介绍 朴素贝叶斯是一种基于贝叶斯定理的概率分类方法,假设特征之间相互独立。该算法通过计算给定条件下各个类别的条件概率来预测新样本所属类别[^1]。 #### 贝叶斯定理基础 核心在于利用先验概率和似然度推导后验概率: \[ P(C_k|x_1,x_2,...,x_n)=\frac{P(x_1,x_2,...,x_n|C_k)\cdot P(C_k)}{\sum_{i}^{K}{P(x_1,x_2,...,x_n|C_i)\cdot P(C_i)}} \] 其中 \( C_k \) 表示第 k 类标签;\( x_j \) 是输入向量中的某个属性值。由于分母对于所有类别都是相同的,在实际操作中通常忽略不计。 #### 特征独立性假设 为了简化模型复杂度并提高运算效率,朴素贝叶斯假定各维度上的变量彼此无关。这意味着即使两个或多个因素实际上存在关联关系,也会被视作完全独立处理。尽管这一设定看似不合理,但在许多应用场景下依然能取得不错的效果。 ```python from sklearn.datasets import fetch_20newsgroups from sklearn.feature_extraction.text import CountVectorizer from sklearn.naive_bayes import MultinomialNB from sklearn.pipeline import make_pipeline import numpy as np # 加载数据集 data = fetch_20newsgroups() categories = ['alt.atheism', 'soc.religion.christian'] train_data = fetch_20newsgroups(subset='train', categories=categories) test_data = fetch_20newsgroups(subset='test', categories=categories) # 构建管道 model = make_pipeline(CountVectorizer(), MultinomialNB()) # 训练模型 model.fit(train_data.data, train_data.target) # 预测测试集 predicted_categories = model.predict(test_data.data) accuracy = np.mean(predicted_categories == test_data.target) print(f'Accuracy: {accuracy:.3f}') ``` 此代码片段展示了如何使用 `scikit-learn` 库实现一个多类别文本分类器,并评估其准确性。这里选择了新闻组数据集中关于无神论和社会宗教基督教这两个主题作为例子。 ### 平滑技术的应用 当某些特定单词从未在训练集中出现时,则会导致相应项的概率估计为零,从而影响最终结果。为了避免这种情况发生,可以采用拉普拉斯平滑或其他形式的加权调整策略。具体做法是在分子部分加上一个小常数α(一般取1),同时增加分母基数V*α(V表示词汇表大小)[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值