算法工程师-机器学习面试高频知识点
基本概念
1.判别模型主要有:K近邻,感知机、SVM,决策树,逻辑斯蒂回归(LR),最大熵模型,提升方法(boost)和条件随机场
生成模型,比如朴素贝叶斯,隐马尔可夫模型判别模型的特点:直接面对预测,准确率高;可以简化学习问题,对数据进行各种程度的抽象,定义特征等
生成模型的特点:可以还原出联合概率密度;收敛速度快,当样本容量增加时也能很快的收敛;存在隐变量时,仍可以使用
2.集成学习是指用某种策略将多个分类器预测的结果集成起来,作为最终的预测结果,有boost和bagging两种方法(boosting 各分类器之间有依赖关系,bagging各分类器之间没有依赖关系,可并行)
分类问题评价指标
精确率表示的是,预测为正例的样本中,有多少比例是预测对的。对应前面例子,类似挑的瓜里面多少比例是好瓜。
准确率:预测分类对的样本占全部样本的比例。
召回率表示的是,真实为正例的样本中,有多少比例被预测对了
重视精确率,就意味着“宁缺毋滥”,适用于对精度要求高的场景,如商品推荐。而重视召回率,意味着“宁可错杀一百,不能放过一个”,适用于类似反欺诈等场景
将样本按照预测为正例的概率值从大到小进行排序,从第一个开始,逐个将当前样本点的预测值设置为阈值,有了阈值之后,即可得出混淆矩阵各项的数值,然后计算出P和R,以R为横坐标,P为纵坐标,绘制于图中,即可得出P-R曲线
当一个模型a的P-R曲线完全包住另一个模型b的P-R曲线时,即可认为a优于b。其他情况下,可以使用平衡点,也即F1值,或者曲线下的面积来评估模型的好坏
真正率(TPR)和假正率(FPR)定义如下:TPR表示的是,正例的样本被正确预测为正例的比例。
FPR表示的是,反例的样本中被错误预测为正例的比例。
将样本排好序后,从第一个开始,逐渐的将其和其之前的点预测为正例,其他的预测为反例,这样就能计算出TPR和FPR,以FPR为横坐标,TPR为纵坐标,即可绘制出ROC(Receiver Operating Characteristic)曲线,示意图如下。ROC曲线下面覆盖的面积称为AUC(Area Under ROC Curve)
1. 当召回率不等于0时,P-R曲线的点和ROC曲线的点都能一一对应
2. 当一个模型a在P-R上优于b时,a在ROC曲线上也同样会优于b,反过来也同样成立。
3. 一般情况下,两者都能很好的完成模型的评估工作,效果相差也不大。但是,当正样本个数严重小于负样本个数,收据严重倾斜时,P-R曲线相比较于ROC曲线更加适合
xgboost相关
1.xgboost怎么处理缺失值?
在节点分裂时不考虑的缺失值的数值。缺失值数据会被分到左子树和右子树分别计算损失,选择较优的那一个。如果训练中没有数据缺失,预测时出现了数据缺失,那么默认被分类到右子树。2.为什么xgboost要用二阶泰勒展开,优势在哪里?
1)xgboost使用了一阶和二阶偏导,二阶导数有利于梯度下降的更快更准。3.XGBOOST和GBDT的区别
1) 传统GBDT以CART作为基分类器,xgboost还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。
2) 节点分裂的方式不同,gbdt是用gini系数,xgboost是经过优化推导后的。
3) 传统的GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。
4) xgboost在代价函数里加入了正则项,用于控制模型得复杂度,降低了过拟合的可能性。正则项里包含了树的叶子节点的个数、每个叶子节点上输出的score的L2模的平方和。
5) shrinkage(缩减),相当于学习速率(XGBoost中的eta)。XGBoost在进行完一次迭代时,会将叶子节点的权值乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。(GBDT也有学习速率);
6) 列抽样。XGBoost借鉴了随机森林的做法,支持列抽样,不仅防止过 拟合,还能减少计算;
7) 对缺失值的处理。对于特征的值有缺失的样本,XGBoost还可以自动学习出它的分裂方向;
8) xgboost工具支持并行。注意xgboost的并行并不是tree粒度的并行,xgboost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征值进行排序(因为要确定最佳分割点),xgboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复的使用这个结构,大大减小计算量。这个block结构也使得并行成为可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
9) xgboosst借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算,这也是xgboost异于传统gbdt的一个特性。4.xgboost与LightGBM的区别
1)切分算法(切分点的选取)
占用的内存更低,只保存特征离散化后的值,而这个值一般用8位整型存储就足够了,内存消耗可以降低为原来的1/8
LightGBM直接支持类别特征
2)决策树生长策略不同
XGBoost采用的是带深度限制的level-wise生长策略。level-wise过一次数据可以能够同时分裂同一层的叶子,容易进行多线程优化,不容易过拟合;但不加区分的对待同一层叶子,带来了很多没必要的开销(实际上很多叶子的分裂增益较低,没必要进行搜索和分裂)
如何解决类别不平衡问题?
(1)对大类进行欠采样(减少数据,或者分成不同数据集,使用多个模型),对小类进行过采样(重复使用数据)
(2)阈值调整,将默认的0.5调整成 较少类别/(较少+较多)
(3) 设置不同的学习率,大类权值小,小类权值大
(4) 使用一些对样本分布不敏感的评价指标F1、AUC等
(5)可以尝试不同的算法,决策树(对不平衡数据表现不错),集成算法
(6)可以对模型进行惩罚,增加正则项
(7)如果小类很小,可将问题转化为异常点检测
过拟合及正则化
1.为什么会出现过拟合现象?
1)训练数据集样本单一,样本不足。2)训练数据中噪声干扰过大。噪声指训练数据中的干扰数据。过多的干扰会导致记录了很多噪声特征,忽略了真实输入和输出之间的关系。
3)模型过于复杂。
2.如何避免过拟合
1)获取和使用更多的数据(数据集增强)2)降低特征的数量
3)L1 / L2 正则化
3.dropout为什么有助于防止过拟合呢?
1)在训练过程中会产生不同的训练模型,不同的训练模型也会产生不同的的计算结果。随着训练的不断进行,计算结果会在一个范围内波动,但是均值却不会有很大变化,因此可以把最终的训练结果看作是不同模型的平均输出。
2)它消除或者减弱了神经元节点间的联合,降低了网络对单个神经元的依赖,从而增强了泛化能力。
4.L1/L2正则化
L1正则化是指权值向量w中各个元素的绝对值之和
L2正则化是指权值向量w中各个元素的平方和然后求平方根
5. 为什么 L1 正则容易产生稀疏解
从解空间形状方面考虑:
L2正则化相当于为参数定义了一个圆形的解空间,而L1正则化相当于为参数定义了一个菱形的解空间。L1“棱角分明”的解空间显然更容易与目标函数等高线在脚点碰撞。更容易在棱角取得交点,从而导致出现参数为0的情况,从而产生稀疏解
从贝叶斯先验角度考虑
从贝叶斯角度来看,L1正则化相当于对模型参数w引入了拉普拉斯先验,L2正则化相当于引入了高斯先验
当均值为0时,高斯分布在极值点处是平滑的,也就是高斯先验分布认为w在极值点附近取不同值的可能性是接近的。但对拉普拉斯分布来说,其极值点处是一个尖峰,所以拉普拉斯先验分布中参数w取值为0的可能性要更高
6. L2为什么能降低过拟合
核函数
(1) 线性核
(2) 多项式核
(3) 高斯核(RBF核函数)
(4) 如果特征的数量大到和样本数量差不多,选用线性核SVM或LR
(5) 如果特征的数量少,样本数量正常,选用RBF核函数
SVM的原理是什么?
SVM是一种二类分类模型。它的基本模型是在特征空间中寻找间隔最大化的分离超平面的线性分类器。(间隔最大是它有别于感知机)
(1)当训练样本线性可分时,通过硬间隔最大化,学习一个线性分类器,即线性可分支持向量机;
(2)当训练数据近似线性可分时,引入松弛变量,通过软间隔最大化,学习一个线性分类器,即线性支持向量机;
(3)当训练数据线性不可分,通过使用核技巧及软间隔最大化,学习非线性支持向量机。
激活函数
(1) Sigmoid函数
特点:
它能够把输入的连续实值变换为0和1之间的输出,特别的,如果是非常大的负数,那么输出就是0;如果是非常大的正数,输出就是1.
缺点:
[1] 在深度神经网络中梯度反向传递时导致梯度爆炸和梯度消失,其中梯度爆炸发生的概率非常小,而梯度消失发生的概率比较大
[2] 如果我们初始化神经网络的权值为[0,1] 之间的随机值,由反向传播算法的数学推导可知,梯度从后向前传播时,每传递一层梯度值都会减小为原来的0.25倍,如果神经网络隐层特别多,那么梯度在穿过多层后将变得非常小接近于0,即出现梯度消失现象;当网络权值初始化为 (1,+∞) 区间内的值,则会出现梯度爆炸情况。
[3] Sigmoid 的 output 不是0均值,导致后一层的神经元将得到上一层输出的非0均值的信号作为输入,反向传播的过程中w要么都往正方向更新,要么都往负方向更新,导致有一种捆绑的效果,使得收敛缓慢
[4] 其解析式中含有幂运算,计算机求解时相对来讲比较耗时。对于规模比较大的深度网络,这会较大地增加训练时间。
(2) Tanh函数
[1] 解决了Sigmoid函数的不是zero-centered输出问题,
[2] 梯度消失的问题和幂运算的问题仍然存在
(3) ReLu函数
[1] 解决了梯度消失问题 (在正区间)
[2] 计算速度非常快,只需要判断输入是否大于0
[3] 收敛速度远快于sigmoid和tanh
[4] ReLU的输出不是zero-centered
某些神经元可能永远不会被激活,导致相应的参数永远不能被更新损失函数
损失函数用来评价模型的预测值和真实值不一样的程度,损失函数越好,通常模型的性能越好。不同的模型用的损失函数一般也不一样。
(1) 平方损失函数
经常应用与回归问题
(2) 对数损失函数
[1] 对数损失函数能非常好的表征概率分布,在很多场景尤其是多分类,如果需要知道结果属于每个类别的置信度,那它非常适合。
[2] 健壮性不强,相比于hinge loss对噪声更敏感。
[3] 逻辑回归的损失函数就是对数损失函数。
(3) HingeLoss
SVM就是使用这个损失函数;健壮性相对较高,对异常点、噪声不敏感,但它没太好的概率解释。
(4) 指数损失函数
对离群点、噪声非常敏感。经常用在AdaBoost算法中。
(5) 0-1损失函数
0-1损失是指预测值和目标值不相等为1, 否则为0
(6) 绝对值损失函数
绝对值损失函数是计算预测值与目标值的差的绝对值
(7) 交叉熵损失函数
1)本质上也是一种对数似然函数,可用于二分类和多分类任务中。
2)当使用sigmoid作为激活函数的时候,常用交叉熵损失函数而不用均方误差损失函数,因为它可以完美解决平方损失函数权重更新过慢的问题,具有“误差大的时候,权重更新快;误差小的时候,权重更新慢”的良好性质(8) 交叉熵函数与最大似然函数的联系和区别?
区别:交叉熵函数使用来描述模型预测值和真实值的差距大小,越大代表越不相近;似然函数的本质就是衡量在某个参数下,整体的估计和真实的情况一样的概率,越大代表越相近。
联系:交叉熵函数可以由最大似然函数在伯努利分布的条件下推导出来,或者说最小化交叉熵函数的本质就是对数似然函数的最大化。
LR模型
LR 的优点
(1) 实现简单
(2) 形式简单,模型的可解释性非常好
(3) 训练速度快。分类的时候,计算量仅仅和特征的数目相关
(4) 资源占用小,尤其是内存。因为只需要存储各个维度的特征值
(5) 方便输出结果调整。LR 可以方便的得到最后分类的结果,因为输出的是每个样本的概率分数,我们可以很容易的对这些概率分数进行阈值划分,然后归属到对应的类别中。
LR 的缺点
(1) 很难处理数据不平衡的问题。比如:假如正负样本比为:10000:1,我们把所有样本的都预测为正的话,也能让损失函数的值很小。但是作为一个分类器,它对正负样本的区分能力不会很好。
(2) 处理非线性数据比较麻烦。LR 在不引入其他方法的情况下,只能处理线性可分的数据(或者进一步说,只能处理二分类的问题)。
(3) LR 本身无法进行特征筛选。所有有的时候会利用 GBDT 来选择特征,然后在利用 LR 来进行分类。
(4) 原始的 LR 只能处理二分类问题
LR和线性回归的区别、联系:
(1) LR与线性回归都是属于广义的线性回归
(2) 线性回归用来做预测,LR用来做分类。
(3) 线性回归用最小二乘法来计算参数,LR用最大似然估计来计算参数。
LR和最大熵模型之间的关系
(1) Logistic回归模型与最大熵模型都属于对数线性模型。
(2) 逻辑回归跟最大熵模型没有本质区别。逻辑回归是最大熵对应类别为二类时的特殊情况
(3) 指数簇分布的最大熵等价于其指数形式的最大似然。
(4) 二项式分布的最大熵解等价于二项式指数形式(sigmoid)的最大似然;
(5) 多项式分布的最大熵等价于多项式分布指数形式(softmax)的最大似然
逻辑回归的损失函数为什么要使用极大似然函数作为损失函数
(1) 对数损失函数的训练求解参数的速度是比较快的,和sigmod函数本身的梯度是无关的。这样更新的速度是可以自始至终都比较的稳定
LR为什么使用sigmoid函数
(1)Sigmoid 函数自身的性质
sigmoid 函数连续,单调递增
sigmiod 函数关于(0,0.5) 中心对称
对sigmoid函数求导
p ′ = p ∗ ( 1 − p ) p′=p∗(1−p)p′=p∗(1−p)
计算sigmoid函数的导数非常的快速