第4章 分类下
4.2 什么是基于规则的分类器?
面试官:有没有用过基于规则的分类器?它有什么评价标准?
程序员大树:
基于规则分类器是指用if...then...做记录分类的技术。
表示形式是:Rule: (条件)-----> y其中左边称为规则前件或前提,规则右边称为规则后件。
例如:(Blood Type=Warm) ^(Lay Eggs=Yes) —> Birds。恒温和下蛋是鸟儿的前提。
规则的评价标准主要有:
覆盖率(coverage):满足规则前件的记录所占比例。
规则的精度(Accuracy of a rule):同时满足规则的前件和后件的记录所占的比例。
面试官:那基于规则的提取方法有什么?
程序员大树:通常会使用Learn-One-Rule函数 、RIPPER算法等。(1)Learn-One-Rule函数。其目标是提取一个分类规则,该规则覆盖训练集中的大量正例,没有或仅覆盖少量反例。它产生一个初始规则r,并不断对该规则求精,直到满足某种终止条件为止。然后修剪该规则,以改进它的泛化误差。
(2)RIPPER算法。RIPPER算法以多数类作为默认类,并为预测少数类学习规则。算法首先会对类的频率按从低到高排序,为(y1,y2,…,yc)。把属于y1的样例标记为正例,而把其他类的样例标记为反例,使用顺序覆盖算法产生区分正例和反例的规则。接下来,RIPPER提取区分y2和其他类的规则。重复该过程,直到剩下类yc,此时yc作为默认类。
4.3 如何使用K近邻分类器?
面试官:什么是K近邻分类?如何进行计算的?
程序员大树:K近邻分类,即找出和测试样例属性中最接近的K个训练样例。计算步骤:
1、算距离:给定测试对象,计算它与训练集中每个对象的距离
2、找邻居:圈定距离最近的 k个对象,作为测试对象的近邻
3、做分类:根据这k个近邻归属的主要类别,来对测试对象分类
面试官:那k值的选择,对结果的影响是怎样的?
程序员大树:K值越小,整体模型越复杂,容易发生过拟合
K值越大,整体模型越简单,近似误差会增大(误分类)
在实际应用中,k值一般选一个比较小的数值,通常采用交叉验证的方法来选取最优值。
面试官:既然k值影响这么大,那如何降低对k的敏感性?
程序员大树:可以在多数表决中,为降低k的影响,对每个最近邻的距离按其作用进行加权处理,这样能使远离的样例对分类影响性减弱。 权重是:
距离加权表决:
这样,距离较远的最近邻对分类结果的影响就相对较小。
4.4 如何使用贝叶斯分类器?
面试官:贝叶斯分类器的原理是什么?
程序员大树:
朴素贝叶斯法对条件概率分布做了条件独立性假设。它是说,用于分类的特征,在类确定的条件下,都是条件独立的。
贝叶斯分类器主要使用了贝叶斯决策论。要了解贝叶斯决策论,首先得先了解以下几个概念:先验概率、条件概率、后验概率、误判损失、条件风险、贝叶斯判别准则。
先验概率: 所谓先验概率,就是根据以往的经验或者现有数据的分析所得到的概率。条件概率: 所谓条件概率是指事件A在另一事件B发生的条件下发送的概率。用数学符号表示为:P(B|A),即B在A发生的条件下发生的概率。条件概率是有因求果(知道原因推测结果)。
后验概率: 后验概率跟条件概率的表达形式有点相似。数学表达式为p(A|B), 即A在B发生的条件下发生的概率。后验概率是有果求因(知道结果推出原因)
误判损失:
数学表达式:L(j|i),
判别损失表示把一个标记为i类的样本误分类为j类所造成的损失。
朴素贝叶斯分类器:
面试官:你能说说朴素贝叶斯的工作流程是怎么样的吗?
程序员大树:可以分为三个阶段进行,分别是准备阶段、分类器训练阶段和应用阶段。准备阶段:根据具体情况确定特征属性,并对每个特征属性进行适当划分,去除高度相关性的属性,然后由人工对一部分待分类项进行分类,形成训练样本集合。
分类器训练阶段:这个阶段的任务就是生成分类器,主要工作是计算每个类别在训练样本中的出现频率及每个特征属性划分对每个类别的条件概率估计,并将结果记录。
应用阶段:这个阶段的任务是使用分类器对待分类项进行分类,其输入是分类器和待分类项,输出是待分类项与类别的映射关系。
面试官:贝叶斯有什么优缺点?
程序员大树:贝叶斯模型的优点有4个,分别是:(1)贝叶斯模型发源于古典数学理论,有稳定的分类效率。
(2)对缺失数据不太敏感,算法也比较简单,常用于文本分类。
(3)分类准确度高,速度快。
(4)对小规模的数据表现很好,能处理多分类任务,适合增量式训练,当数据量超出内存时,我们可以一批批的去增量训练.
贝叶斯模型的缺点有3个,分别是:
(1)对训练数据的依赖性很强,如果训练数据误差较大,那么预测出来的效果就会不佳。
(2)在实际中,属性个数比较多或者属性之间相关性较大时,分类效果不好。
(3)需要知道先验概率,且先验概率很多时候是基于假设或者已有的训练数据所得的,这在某些时候可能会因为假设先验概率的原因出现分类决策上的错误。
4.5 如何使用人工神经网络?
人工神经网络(ANN)是模拟生物神经系统而产生的。神经网络包括输入层、隐藏层、输出层。程序员大树:首先,计算出输出与标签间的损失函数值,然后计算其相对于每个神经元的梯度,根据梯度方向更新权值。
(1)将训练集数据输入到ANN的输入层,经过隐藏层,最后达到输出层并输出结果,这是ANN的前向传播过程;
(2)由于ANN的输出结果与实际结果有误差,则计算估计值与实际值之间的误差,并将该误差从输出层向隐藏层反向传播,直至传播到输入层;
(3)在反向传播的过程中,根据误差调整各种参数的值;不断迭代上述过程,直至收敛。
面试官:每一层的输出向量如何表示?ANN网络的公式推导?
程序员大树: 输入层:
隐藏层二:
···
输出层:
ANN计算的过程:
步骤1: 前向计算
For k
1,2,...,K
For k
For k K,K-1,...,1
面试官:有哪些常用的激活函数?
程序员大树:
(1)sigmoid函数。该函数是将取值为 (−∞,+∞)的数映射到(0,1) 之间。sigmoid函数的公式以及图形如下:
%3D%5Cfrac%7Be%5E%7Bz%20%7D-e%5E%7B-z%20%7D%7D%7Be%5E%7Bz%20%7D%2Be%5E%7B-z%20%7D%20%7D)
%3D%5Cbegin%7Bcases%7Dz%2C%5Cquad%20if%5C%20z%20%3E0%0A%20%5C%5C%0A0%2C%5Cquad%20if%5C%20z%20%3C0%0A%5Cend%7Bcases%7D)

(2) tanh函数。tanh函数相较于sigmoid函数要常见一些,该函数是将取值为 (−∞,+∞)的数映射到 (−1,1) 之间,其公式与图形为:

(3) ReLU函数。ReLU函数又称为修正线性单元(Rectified Linear Unit),是一种分段线性函数,其弥补了sigmoid函数以及tanh函数的梯度消失问题。ReLU函数的公式以及图形如下:

面试官:什么是梯度消失和爆炸?如何解决?
程序员大树:
梯度不稳定问题:深度神经网络中的梯度不稳定性,前面层中的梯度会产生消失,爆炸的问题。
原因:由于前面层上的梯度是来自于后面层上梯度的乘乘积。当存在过多的层次时,就出现了内在本质上的不稳定场景,如梯度消失和梯度爆炸。
现在假设我们需要更新参数
,那么我们就要求出损失函数对参数
的导数,根据链式法则,可以写成下面这样:
然而,sigmoid方程的导数曲线为:
可以看到,sigmoid导数的最大值为1/4,通常abs(w)<1,则:
前面的层比后面的层梯度变化更小,故变化更慢,从而引起了梯度消失问题。
当权值过大,前面层比后面层梯度变化更快,会引起梯度爆炸问题。
解决梯度消失、爆炸主要有以下几种方案:
- 预训练加微调。在各层预训练完成后,再利用BP算法对整个网络进行训练。此思想相当于是先寻找局部最优,然后整合起来寻找全局最优。
- 梯度剪切、权重正则(针对梯度爆炸)。思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。这可以防止梯度爆炸。
- 使用ReLU,maxout等替代sigmoid。sigmoid函数的梯度随着x的增大或减小和消失,而ReLU不会。
- 使用batch norm,逐层规范化成均值和方差一致,消除来w带来的放大缩小的影响。
- 使用残差结构。残差可以轻松构建成百上千层网络,利用内部“短路机制”,使梯度可以无损地传播,而不用担心梯度消失过快的问题。式子的第一个因子
表示的损失函数到达 L 的梯度,小括号中的1表明短路机制可以无损地传播梯度,有1的存在不会导致梯度消失。所以残差学习会更容易。
6. 使用LSTM网络。长短期记忆网络不容易产生梯度消失,是因为内部有复杂的“门”,更新时可以通过内部的门记住前几次训练的“残留记忆”,而不会发生梯度消失。
面试官:神经网络有哪些优化算法?
程序员大树:
(1)梯度下降法。通过梯度下降法,使得网络参数不断收敛到全局(或者局部)最小值。
梯度下降法的迭代公式如下:
其中w是待训练的网络参数,𝛼α是学习率,是一个常数,dw是梯度。
(2)Momentum算法。Momentum算法又叫做冲量算法,其迭代更新公式如下:
𝑑𝑤是我们计算出来的原始梯度,𝑣则是用指数加权平均计算出来的梯度。这相当于对原始梯度做了一个平滑,然后再用来做梯度下降。相比于标准梯度下降算法,Momentum算法具有更快的收敛速度。
如上图所示,蓝线是标准梯度下降法,可以看到收敛过程中产生了一些震荡。这些震荡在纵轴方向上是均匀的,几乎可以相互抵消,也就是说如果直接沿着横轴方向迭代,收敛速度可以加快。Momentum通过对原始梯度做了一个平滑,正好将纵轴方向的梯度抹平了(红线部分),使得参数更新方向更多地沿着横轴进行,因此速度更快。
(3)RMSprop算法。对于上面的这个椭圆形的抛物面(图中的椭圆代表等高线),沿着横轴收敛速度是最快的,所以我们希望在横轴方向步长大一些,在纵轴方向步长小一些。通过RMSprop,我们可以调整不同维度上的步长,加快收敛速度。
RMSprop迭代公式如下,其中s是对梯度的平方做了一次平滑。
𝛽的典型值是0.999。公式中还有一个ϵ,这是一个很小的数,典型值是
。
(4)Adam算法。Adam算法是以上二者的结合。Adam算法相当于先把原始梯度做一个指数加权平均,再做一次归一化处理,然后再更新梯度值。
典型值:
。
4.6 如何使用支持向量机?
面试官:SVM的原理是什么?
程序员大树:SVM是一种二类分类模型。它的基本模型是在特征空间中寻找间隔最大化的分离超平面的线性分类器。
(1)当训练样本线性可分时,通过硬间隔最大化,学习一个线性分类器,即线性可分支持向量机;
(2)当训练数据近似线性可分时,引入松弛变量,通过软间隔最大化,学习一个线性分类器,即线性支持向量机;
(3)当训练数据线性不可分时,通过使用核技巧及软间隔最大化,学习非线性支持向量机。
面试官:请对SVM算法公式推导
程序员大树:对数据集T和超平面
,超平面关于样本点
的几何间隔是:
间隔最小值:
同时除γ,得到: 令
即求解最优化问题:
那么可以构建拉格朗日函数:
令L(w,b,α)对w和b的偏导为0,可得:
带入,有:
可以得到:
面试官:SVM怎么防止过拟合?
程序员大树:解决过拟合的办法引入“软间隔”的概念,即允许某些点不满足约束。具体做法是,为SVM引入了松弛变量ξ。
其中,hinge损失函数为:
面试官:SVM相比于其他的分类器,有哪些优缺点?
程序员大树:(1)SVM的优点:
• 能够处理大型特征空间
• 能够处理非线性特征之间的相互作用
• 无需依赖整个数据集
• 少数支持向量决定了最终结果,这样既能避免了维数灾难,又能有较强的鲁棒性。
(2)SVM的缺点:• 当观测样本很多时,效率并不是很高
• 有时候很难找到一个合适的核函数
4.7 组合方法有哪些?
面试官:有没有使用过组合方法构造分类器?有哪些方法?
程序员大树:组合方法的基本思想是,在原始数据集上构建多个分类器,在分类未知样本时聚集预测结果。构建分类器的方法有:
(1)抽样处理训练数据集。可以通过对原始数据再抽样得到多个数据集,并用特定的学习算法为每个训练集建立一个分类器。
(2)使用Bagging和Boosting方法构造组合模型。
(3)通过处理输入特征。在输入特征特别多时,可以选择输入特征的子集形成训练集。随机森林是一种处理输入特征的组合方法。(4)通过处理类标号。适用于类标号非常多的情况,可以将类标号随机划分成两个不相交子集;类标号属于子集A0的样本指派到类0,属于A1的子集指派到类1,然后训练基分类器。通过重复重新标记和构建模型多次,最后统计选票,选择得票最高的一个类。
(5)通过处理学习的算法。在同一个数据集上,执行不同算法,可以得到不同的模型。比如,在树生成时加入随机性,可以得到决策树的组合分类器。
面试官:bagging和bosting有何区别?
程序员大树:
装袋(bagging),是一种根据均匀概率分布从数据集中重复抽样(有放回)的技术。步骤如下:
(1)从原始样本集中抽取训练集。每轮从原始样本集中使用Bootstraping的方法抽取n个训练样本(在训练集中,有些样本可能被多次抽取到,而有些样本可能一次都没有被抽中)。共进行k轮抽取,得到k个训练集。(k个训练集之间是相互独立的)(2)每次使用一个训练集得到一个模型,k个训练集共得到k个模型。
(3)对分类问题:将上步得到的k个模型采用投票的方式得到分类结果;对回归问题,计算上述模型的均值作为最后的结果。(所有模型的重要性相同)
提升(boosting),是一个迭代的过程,可以自适应地改变训练样本的分布,是分类器聚焦在难分类的样本上。
boosting每次使用的是全部的样本,每轮训练改变样本的权重。下一轮训练的目标是找到一个函数f 来拟合上一轮的残差。当残差足够小或者达到设置的最大迭代次数则停止。Boosting会减小在上一轮训练正确的样本的权重,增大错误样本的权重。(对的残差小,错的残差大)
boosting每一次迭代都得到了一个弱分类起,需要使用策略将其组合,从而形成最终的模型。
1)样本选择上:
Bagging:训练集是在原始集中有放回选取的,从原始集中选出的各轮训练集之间是独立的。
Boosting:每一轮的训练集不变,只是训练集中每个样例在分类器中的权重发生变化。而权值是根据上一轮的分类结果进行调整。
2)样例权重:
Bagging:使用均匀取样,每个样例的权重相等
Boosting:根据错误率不断调整样例的权值,错误率越大则权重越大。
3)预测函数:
Bagging:所有预测函数的权重相等。
Boosting:每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重。
4)并行计算:
Bagging:各个预测函数可以并行生成
Boosting:各个预测函数只能顺序生成,因为后一个模型参数需要前一轮模型的结果。
面试官:为什么说bagging是减少variance,而boosting是减少bias?
程序员大树:
偏差:描述的是预测值(估计值)的期望与真实值之间的差距。偏差越大,越偏离真实数据,如下图第二行所示。
方差:描述的是预测值的变化范围,离散程度,也就是离其期望值的距离。方差越大,数据的分布越分散,如下图右列所示。
由于
所以bagging后的bias和单个子模型的接近,一般来说不能显著降低bias。另一方面,若各子模型独立,则有
此时可以显著降低variance。
boosting是在sequential地最小化损失函数,所以bias自然逐步下降。但是由于采用sequential、adaptive的策略,各子模型之间是强相关的,于是子模型之和并不能显著降低variance。所以说boosting主要还是靠降低bias来提升预测精度。
4.8 怎么解决不平衡类问题?
准确率经常用来比较分类器性能,然而并不适合从不平衡类得到模型。例如刷单反作弊,可能1%的订单是刷单的,但我们不能说模型判定合法有99%的准确率。我们需要检测稀有类。面试官:在不平衡问题中,如何进行二元分类?有哪些衡量指标?
程序员大树:通常把稀有类记为正类,多数类记为负类。
指标中,T/F是正确/失败预测,P/N是预测的结果是正/负类。
TP: 正确预测的正样本数。
FN: 错误预测为负类的正样本数。
FP: 错误预测为正类的负样本数。
TN: 正确预测的负样本数。
TPR:模型正确预测的正样本比例:
TPR=TP/(TP+FN)
TNR:模型正确预测的负样本比例:
TNR=TN/(TN+FP)
FPR:模型错误预测为正类的负样本比例:
FPR=FP/(TN+FP)
FNR:模型错误预测为负类的正样本比例:
FNR=FN/(TN+FP)
精度(p),可以确定断言为正类的记录中,预测为正类,实际也为正类的记录所占的比例:
召回率(r),为被分类器正确预测的正样本比例。
原则上,F_1表示召回率和精度的调和平均值,即:
另外,ROC曲线是显示分类器TPR和FPR的一种图形化方法。ROC曲线下方面积为AUC,是一种评价模型平均性能的方法,若模型完美,则面积为1。
面试官:如何解决数据不平衡问题?
1. 从数据角度。
(1)主动获取:获取更多的少量样本数据。比如负样本很少,我们去搜集更多负样本。
(2)合成数据。使用上采样、下采样,生成合成数据。
(3)数据增强。加噪音,增强模型的鲁棒性。
(4)改变权重。设定惩罚因子,如libsvm等算法里,设置正负样本权重等。
2. 从算法角度。
(1)选择对数据倾斜相对不敏感的算法。如树模型等。
(2)集成学习。首先从多数类中独立随机抽取出若干子集,将每个子集与少数类数据联合起来训练生成多个基分类器,再加权组成新的分类器。
(3)将任务转换成异常检测问题。比如反作弊项目,不如将其转换为无监督的异常检测算法,不用过多的去考虑将数据转换为平衡问题来解决。