机器学习面试题之NB
1.简述朴素贝叶斯算法原理和工作流程
朴素贝叶斯分类是一种十分简单的分类算法,叫它朴素贝叶斯分类是因为这种方法的思想真的很朴素,朴素贝叶斯的思想基础是这样的:对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,哪个最大,就认为此待分类项属于哪个类别。
(公式自己也知道啊,图片太麻烦了,就不写了,以后可以自己再查)
整个朴素贝叶斯分类分为三个阶段:
第一阶段——准备工作阶段,这个阶段的任务是为朴素贝叶斯分类做必要的准备,主要工作是根据具体情况确定特征属性,并对每个特征属性进行适当划分,然后由人工对一部分待分类项进行分类,形成训练样本集合。这一阶段的输入是所有待分类数据,输出是特征属性和训练样本。这一阶段是整个朴素贝叶斯分类中唯一需要人工完成的阶段,其质量对整个过程将有重要影响,分类器的质量很大程度上由特征属性、特征属性划分及训练样本质量决定。
第二阶段——分类器训练阶段,这个阶段的任务就是生成分类器,主要工作是计算每个类别在训练样本中的出现频率及每个特征属性划分对每个类别的条件概率估计,并将结果记录。其输入是特征属性和训练样本,输出是分类器。这一阶段是机械性阶段,根据前面讨论的公式可以由程序自动计算完成。
第三阶段——应用阶段。这个阶段的任务是使用分类器对待分类项进行分类,其输入是分类器和待分类项,输出是待分类项与类别的映射关系。这一阶段也是机械性阶段,由程序完成。
2.什么是先验概率和后验概率?
先验概率是指根据以往经验和分析得到的概率。后验概率是基于新的信息,修正原来的先验概率后所获得的更接近实际情况的概率估计。
3.什么是条件概率?
条件概率是指事件A在另外一个事件B已经发生下发生的概率。
4.为什么朴素贝叶斯如此“朴素”?
因为它假定所有的特征在数据集中的作用是独立同分布的,但这个假设在现实生活中很不真实,因此很“朴素”。
5.什么是贝叶斯决策理论?
将分类看做决策,进行贝叶斯决策时考虑各类的先验概率和类条件概率,也即后验概率。考虑先验概率意味着对样本总体的认识,考虑类条件概率是对每一类中某个特征出现频率的认识。由此不难发现,贝叶斯决策的理论依据就是贝叶斯公式。
理论依据
- 最小错误率贝叶斯决策
贝叶斯决策的基本理论依据就是贝叶斯公式,判决遵从最大后验概率。这种仅根据后验概率作决策的方式称为最小错误率贝叶斯决策,可以从理论上证明这种决策的平均错误率是最低的。 - 最小风险贝叶斯决策
另一种方式是考虑决策风险,加入了损失函数,称为最小风险贝叶斯决策。
6.朴素贝叶斯算法的前提假设是什么?
特征条件独立假设
7.为什么属性独立性假设在实际情况中很难成立,但朴素贝叶斯仍能取得较好的效果?
- 对于分类任务来说,只要各类别的条件概率排序正确、无需精准概率值即可导致正确分类;
- 如果属性间依赖对所有类别影响相同,或依赖关系的影响能相互抵消,则属性条件独立性假设在降低计算开销的同时不会对性能产生负面影响。
8.朴素贝叶斯可以做多分类吗?
9.什么是朴素贝叶斯中的零概率问题?如何解决?
在概率估计时,通常解决这个问题的方法是要进行平滑处理,常用拉普拉斯修正。
拉普拉斯修正的含义是,在训练集中总共的分类数,用 N 表示;di 属性可能的取值数用 Ni 表示,因此
原来的先验概率 的计算公式由:
被拉普拉斯修正为:
类的条件概率P(x | c) 的计算公式由:
被拉普拉斯修正为:
10.朴素贝叶斯中概率计算的下溢问题如何解决?
经过计算后的分类向量概率值有可能都很低,比如出现0.023和0.078,这个样的情况对区分度有很大的影响,所以可以通过log运算增大概率的绝对值。log运算不会影响函数的趋势和极值只是扩大值得范围。
可以发现取对数之后并不影响其变化趋势。将小数的乘法操作转化为取对数后的加法操作,规避了变为零的风险同时并不影响分类结果。
11.朴素贝叶斯分类器对异常值敏感吗?
朴素贝叶斯是一种对异常值不敏感的分类器,保留数据中的异常值,常常可以保持贝叶斯算法的整体精度,如果对原始数据进行降噪训练,分类器可能会因为失去部分异常值的信息而导致泛化能力下降。
为什么对异常值不敏感呢,可能是因为朴素贝叶斯分类器是一个概率模型,如果输入是一个正常的样本,则异常值并不会影响到正常样本的后验概率,因为对于正常样本而言,其都是正常的,并不会使用到异常的。如果是一个异常的,反而已有的异常值可以帮助到该异常样本更好的分类。
对于类别变量根据频率去估计时就如上所述——异常值的存在反而会提高分类器的泛化能力。但如果是对于连续型属性的异常值则会产生对分类器产生一定的影响,因贝叶斯对连续值的处理往往是通过估计其概率分布的参数,若有异常值存在则其概率分布将会产生偏移。若是分类变量则之间统计出现次数是不会产生偏移的。
12.当数据的属性是连续型变量时,朴素贝叶斯算法如何处理?
当朴素贝叶斯算法数据的属性为连续型变量时,有两种方法可以计算属性的类条件概率。
第一种方法是把一个连续的属性离散化,然后用相应的离散区间替换连续属性值,之后用频率去表示类条件概率。但这种方法不好控制离散区间划分的粒度。如果粒度太细,就会因为每个区间内训练记录太少而不能对做出可靠估计,如果粒度太粗,那么有些区间就会有来自不同类的记录,因此失去了正确的决策边界。
第二种方法是假设连续变量服从某种概率分布,然后使用训练数据估计分布的参数,例如可以使用高斯分布来表示连续属性的类条件概率分布。
,为类的所有训练记录关于的样本均值估计,为类的所有训练记录关于的样本方差估计。通过高斯分布估计出类条件概率。
13.朴素贝叶斯算法对缺失值敏感吗?
不敏感,朴素贝叶斯算法能够处理缺失的数据,在算法的建模时和预测时数据的属性都是单独处理的。因此如果一个数据实例缺失了一个属性的数值,在建模时将被忽略,不影响类条件概率的计算,在预测时,计算数据实例是否属于某类的概率时也将忽略缺失属性,不影响最终结果。
14.朴素贝叶斯有哪几种常用的分类模型?
朴素贝叶斯的三个常用模型:高斯、多项式、伯努利。
- 高斯模型主要处理包含连续型变量的数据,使用高斯分布概率密度来计算类的条件概率密度。
- 多项式模型:在多项式模型中, 设某文档d=(t1,t2,…,tk),tk是该文档中出现过的单词,允许重复,则
先验概率P( c )= 类c下单词总数/整个训练样本的单词总数
类条件概率P(tk|c)=(类c下单词tk在各个文档中出现过的次数之和+1)/(类c下单词总数+|V|)
V是训练样本的单词表(即抽取单词,单词出现多次,只算一个),|V|则表示训练样本包含多少种单词。在这里,m=|V|, p=1/|V|。
P(tk|c)可以看作是单词tk在证明d属于类c上提供了多大的证据,而P©则可以认为是类别c在整体上占多大比例(有多大可能性)。
| docID | doc | 类别 In c=China? |
| 1 | Chinese Beijing Chinese | yes |
| 2 | Chinese Chinese Shanghai | yes |
| 3 | Chinese Macao | yes |
| 4 | Tokyo Japan Chinese | no |
给定一个新样本Chinese Chinese Chinese Tokyo Japan,对其进行分类。该文本用属性向量表示为d=(Chinese, Chinese, Chinese, Tokyo, Japan),类别集合为Y={yes, no}。
类yes下总共有8个单词,类no下总共有3个单词,训练样本单词总数为11,因此P(yes)=8/11, P(no)=3/11。类条件概率计算如下:
P(Chinese | yes)=(5+1)/(8+6)=6/14=3/7
P(Japan | yes)=P(Tokyo | yes)= (0+1)/(8+6)=1/14
P(Chinese|no)=(1+1)/(3+6)=2/9
P(Japan|no)=P(Tokyo| no) =(1+1)/(3+6)=2/9
分母中的8,是指yes类别下textc的长度,也即训练样本的单词总数,6是指训练样本有Chinese,Beijing,Shanghai, Macao, Tokyo, Japan 共6个单词,3是指no类下共有3个单词。
有了以上类条件概率,开始计算后验概率:
P(yes | d)=(3/7)3×1/14×1/14×8/11=108/184877≈0.00058417
P(no | d)= (2/9)3×2/9×2/9×3/11=32/216513≈0.00014780
比较大小,即可知道这个文档属于类别china。
另:也有这种说法
,其中项为拉普拉斯平滑,加和的是属性出现的总次数,比如文本分类问题里面,不光看词语是否在文本中出现,也得看出现的次数,如果总词数为n,出现词数为m的话,说起来有点像掷骰子n次出现m次这个词的场景。
3. 伯努利模型:伯努利模型特征的取值为布尔型,即出现为true没有出现为false,在文本分类中,就是一个单词有没有在一个文档中出现。
15.朴素贝叶斯算法中使用拉普拉斯平滑,拉普拉斯因子的大小如何确定?
朴素贝叶斯中的拉普拉斯因子无法通过公式求出最优大小,需要根据程序员的经验去设置,使用交叉验证的方式求取最优大小。
16.为什么说朴素贝叶斯是高偏差低方差?
首先,假设你知道训练集和测试集的关系。简单来讲是我们要在训练集上学习一个模型,然后拿到测试集去用,效果好不好要根据测试集的错误率来衡量。但很多时候,我们只能假设测试集和训练集的是符合同一个数据分布的,但却拿不到真正的测试数据。这时候怎么在只看到训练错误率的情况下,去衡量测试错误率呢?
由于训练样本很少(至少不足够多),所以通过训练集得到的模型,总不是真正正确的。(就算在训练集上正确率100%,也不能说明它刻画了真实的数据分布,要知道刻画真实的数据分布才是我们的目的,而不是只刻画训练集的有限的数据点)。而且,实际中,训练样本往往还有一定的噪音误差,所以如果太追求在训练集上的完美而采用一个很复杂的模型,会使得模型把训练集里面的误差都当成了真实的数据分布特征,从而得到错误的数据分布估计。这样的话,到了真正的测试集上就错的一塌糊涂了(这种现象叫过拟合)。但是也不能用太简单的模型,否则在数据分布比较复杂的时候,模型就不足以刻画数据分布了(体现为连在训练集上的错误率都很高,这种现象较欠拟合)。过拟合表明采用的模型比真实的数据分布更复杂,而欠拟合表示采用的模型比真实的数据分布要简单。
在统计学习框架下,大家刻画模型复杂度的时候,有这么个观点,认为Error = Bias + Variance。这里的Error大概可以理解为模型的预测错误率,是有两部分组成的,一部分是由于模型太简单而带来的估计不准确的部分(Bias),另一部分是由于模型太复杂而带来的更大的变化空间和不确定性(Variance)。
所以,这样就容易分析朴素贝叶斯了。它简单的假设了各个数据之间是无关的,是一个被严重简化了的模型。所以,对于这样一个简单模型,大部分场合都会Bias部分大于Variance部分,也就是说高偏差而低方差。
在实际中,为了让Error尽量小,我们在选择模型的时候需要平衡Bias和Variance所占的比例,也就是平衡over-fitting和under-fitting。
17.朴素贝叶斯增量计算?
传统的贝叶斯方法在有新的训练样本加入时,需要重新学习已经学习过的样本,耗费大量时间。增量计算就是在原有分类器的基础之上,自主选择学习新的文本来修正分类器。因为朴素贝叶斯在训练过程中实际只需要计算出各个类别的概率(先验)和各个特征的类条件概率,这些概率值可以快速的根据增量数据进行更新,无需重新全量训练,所以其十分适合增量计算,该特性可以使用在超出内存的大量数据计算和随时间等(流数据)获取数据的计算中。
18.高度相关的特征对朴素贝叶斯有什么影响?
假设有两个特征高度相关,相当于该特征在模型中发挥了两次作用(计算两次条件概率),使得朴素贝叶斯获得的结果向该特征所希望的方向进行了偏移,影响了最终结果的准确性,所以朴素贝叶斯算法应先处理特征,把相关特征去掉。
19.朴素贝叶斯的应用场景有哪些?
- 文本分类/垃圾文本过滤/情感判别:这大概是朴素贝叶斯应用最多的地方了,即使在现在这种分类器层出不穷的年代,在文本分类场景中,朴素贝叶斯依旧坚挺地占据着一席之地。因为多分类很简单,同时在文本数据中,分布独立这个假设基本是成立的。而垃圾文本过滤(比如垃圾邮件识别)和情感分析(微博上的褒贬情绪)用朴素贝叶斯也通常能取得很好的效果。
- 多分类实时预测:对于文本相关的多分类实时预测,它因为上面提到的优点,被广泛应用,简单又高效。
- 推荐系统:朴素贝叶斯和协同过滤是一对好搭档,协同过滤是强相关性的,但是泛化能力略弱,朴素贝叶斯和协同过滤一起,能增强推荐的覆盖度和效果。
**20.朴素贝叶斯有什么优缺点? **
优点:
对数据的训练快,分类也快。
能够很容易处理多分类任务。
对缺失数据不敏感,对异常值也不太敏感,算法也比较简单。
对小规模的数据表现很好,能够处理多分类任务,适合增量式训练,尤其是数据量超出内存时,可以
缺点:
理论上,朴素贝叶斯模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为朴素贝叶斯模型假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。而在属性相关性较小时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进。
需要知道先验概率,且先验概率很多时候取决于假设,假设的模型可以有很多种,因此在某些时候会由于假设的先验模型的原因导致预测效果不佳。
由于我们是通过先验和数据来决定后验的概率从而决定分类,所以分类决策存在一定的错误率。
对输入数据的表达形式很敏感。(离散的类别之间统计频率即可,连续值就要估计概率分布。)
21. 贝叶斯分类器与贝叶斯学习不同:
前者:通过最大后验概率进行单点估计;后者:进行分布估计。
22. Navie Bayes和Logistic回归区别是什么?
联系:
- Logistic regression和Naive bayes都是对特征的线性表达。不过并不是所有的朴素贝叶斯分类器都是线性分类器,只有某些具有特定属性的朴素贝叶斯分类器才是线性分类器,如连续特征的朴素贝叶斯分类器中方差不相同。
- Logistic regression和Naive bayes建模的都是条件概率 ,对所最终求得的不同类的结果有很好的解释性。而不像SVM,神经网络这样解释性不高。
区别:
- Naive Bayes是一个生成模型,在计算P(y|x)之前,先要从训练数据中计算P(x|y)和P(y)的概率,从而利用贝叶斯公式计算P(y|x),实际上优化的是联合likelihood 。Logistic Regression是一个判别模型,它通过在训练数据集上最大化判别函数P(y|x)学习得到,不需要知道P(x|y)和P(y),优化的后验likelihood 。
- Naive Bayes是建立在条件独立假设基础之上的,设特征X含有n个特征属性,那么在给定Y的情况下,是条件独立的。Logistic Regression的限制则要宽松很多,如果数据满足条件独立假设,Logistic Regression能够取得非常好的效果;当数据不满足条件独立假设时,Logistic Regression仍然能够通过调整参数让模型最大化的符合数据的分布,从而训练得到在现有数据集下的一个最优模型。
- 当数据集比较小的时候,应该选用Naive Bayes,为了能够取得很好的效果,数据的需求量为O(log n)。当数据集比较大的时候,应该选用Logistic Regression,为了能够取得很好的效果,数据的需求量为O(n)。Naive Bayes运用了比较严格的条件独立假设,为了计算P(y|x),我们可以利用统计的方法统计数据集中P(x|y)和P(y)出现的次数,从而求得P(x|y)和P(y),因而其所需的数据量要小一些,为O(log n)。Logistic Regression在计算时,是在整个参数空间进行线性搜索的,需要的数据集就更大,为O(n)。数据量小的时候使用LR无法得到充足的训练因而效果不如朴素贝叶斯,当数据量大的时候LR可以得到充分的训练因而会比相对更为简单的NB性能更优。这也是因为Naive bayes是生成模型,在有prior的情况下模型能够把数据fit的更好,而Logistic regression属于判别模型,目标驱动化,不去建模联合概率,通过训练数据直接预测输出,因此在数据足够多的情况下能够得到更好一些的效果。
- Logistic regression在有相关性feature上面学习得到的模型在测试数据的performance更好。也就是说,logistic regression在训练时,不管特征之间有没有相关性,它都能找到最优的参数。而在Naive bayes中,由于我们给定特征直接相互独立的严格设定,在有相关性的feature上面学习到的权重同时变大或变小,它们之间的权重不会相互影响。从这方面来说,如果能够在对参数较好地控制,在损失项方面处理的很好的话,Logistic regression相对Naive bayes在应用时更不会限制在特征工程(feature engineering)上面。Naive bayes的好处是我没有优化参数这一步,通过训练数据我直接得到一个counting table,这些有助于并行化。不过现在LR也已经发展出了较多的并行化技术。
版本2:
- 朴素贝叶斯是生成模型,根据已有样本进行贝叶斯估计学习出先验概率P(Y)和条件概率P(X|Y),进而求出联合分布概率P(XY),最后利用贝叶斯定理求解P(Y|X), 而LR是判别模型,根据极大化对数似然函数直接求出条件概率P(Y|X);
- 朴素贝叶斯是基于很强的条件独立假设(在已知分类Y的条件下,各个特征变量取值是相互独立的),而LR则对此没有要求;
- 朴素贝叶斯适用于数据集少的情景,而LR适用于大规模数据集。
前者是生成式模型,后者是判别式模型,二者的区别就是生成式模型与判别式模型的区别。
1)首先,Navie Bayes通过已知样本求得先验概率P(Y), 及条件概率P(X|Y), 对于给定的实例,计算联合概率,进而求出后验概率。也就是说,它尝试去找到底这个数据是怎么生成的(产生的),然后再进行分类。哪个类别最有可能产生这个信号,就属于那个类别。
优点:样本容量增加时,收敛更快;隐变量存在时也可适用。
缺点:时间长;需要样本多;浪费计算资源
2)相比之下,Logistic回归不关心样本中类别的比例及类别下出现特征的概率,它直接给出预测模型的式子。设每个特征都有一个权重,训练样本数据更新权重w,得出最终表达式。梯度法。
优点:直接预测往往准确率更高;简化问题;可以反应数据的分布情况,类别的差异特征;适用于较多类别的识别。
缺点:收敛慢;不适用于有隐变量的情况。
23. 网页搜索中的拼写检查可以基于贝叶斯实现,你怎么理解?
表示正确词出现的概率,拼写错误的词。对大文本进行和的统计,对当前拼写错误词的所有候选正确词,取最大的排序列表。