文章目录
前言
机器学习面试关于算法方面的内容,对网络上的内容进行整合,方便日后自己复习以及给大家面试的时候来用。以下内容均来自于网络上的资源,会在文末统一标明出处。
正文
1、简单介绍一下SVM
SVM,全称是support vector machine,支持向量机,其目标是确定一个分类超平面,从而将数据分割开来。
支持向量机学习方法包括构建由简至繁的模型:
- 线性可分支持向量机:当训练数据线性可分时,通过硬间隔最大化,学习一个线性的分类器,又称为硬间隔支持向量机;
- 线性支持向量机:当训练数据近似线性可分时,通过软间隔最大化,也学习一个线性的分类器,即线性支持向量机,又称为软间隔支持向量机;
- 非线性支持向量机:当训练数据线性不可分时,通过使用核技巧及软间隔最大化,学习非线性支持向量机。
2、请问GBDT和XGBoost的区别是什么
XGBoost类似于GBDT的优化版,不论是精度还是效率上都有了提升。与GBDT相比,具体的优点有:
- 损失函数是用泰勒展式二项逼近,而不是像GBDT里的就是一阶导数;
- 对树的结构进行了L2正则化约束,防止模型过度复杂,降低了过拟合的可能性;
- 节点分裂的方式不同,GBDT是用的基尼系数,XGBoost是经过优化推导后的。
xgboost与gdbt除了上述三点的不同,xgboost在实现时还做了许多优化:
- 在寻找最佳分割点时,考虑传统的枚举每个特征的所有可能分割点的贪心法效率太低,xgboost实现了一种近似的算法。大致的思想是根据百分位法列举几个可能成为分割点的候选者,然后从候选者中根据上面求分割点的公式计算找出最佳的分割点。
- xgboost考虑了训练数据为稀疏值的情况,可以为缺失值或者指定的值指定分支的默认方向,这能大大提升算法的效率,paper提到50倍。
- xgboost借鉴了随机森林中的列(特征)采样技术,即在某个节点分裂时,不是在当前节点中所有属性中选取最佳分裂属性,而是在当前属性集合中的某些属性中来选择最优分裂属性。这种方法降低了过拟合的可能性。
- 特征列排序后以块的形式存储在内存中,在迭代中可以重复使用;虽然boosting算法迭代必须串行,但是在处理每个特征列时可以做到并行。
- 按照特征列方式存储能优化寻找最佳的分割点,但是当以行计算梯度数据时会导致内存的不连续访问,严重时会导致cache miss,降低算法效率。paper中提到,可先将数据收集到线程内部的buffer,然后再计算,提高算法的效率。
- xgboost还考虑了当数据量比较大,内存不够时怎么有效的使用磁盘,主要是结合多线程、数据压缩、分片的方法,尽可能的提高算法的效率。
3、简单介绍下Boosting
Boosting是一个迭代提升的过程,所以它肯定是串行的算法(尽管xgboost可以在节点分裂属性选择上做并行计算)。基于训练集,先训练弱学习器,然后根据前一个弱学习器分错的样本,改变样本的概率分布构成新的训练集,从而可以训练出一个更强的学习器。这样反复迭代提升,就能得到一系列分类器。最后,将这些分类器组合起来,就能构成一个很强的学习器,代表算法有AdaBoost, gbdt, xgboost。
4、简单介绍下AdaBoost
给定一个二分类的训练数据集
T={(x1,y1),…,(xN,yN)}
其中,x_i 是n维的, 类标y_i={-1,+1}
AdaBoost算法的步骤:
(1) 初始化训练数据的权值分布:D1=(w11,…,wi1,…,w1N),w1i=1/N,i=1,2,…,N(即初始时,每个样本视为一样的)
(2) 对m=1,2,…,M
(2a) 对具有权值分布Dm的训练数据集学习,得到一个基本分类器Gm(x)
(2b) 计算Gm(x)在训练数据集上的分类错误率:em=P(Gm(xi)!=yi)
(2c) 根据分类错误率计算Gm(x)的加权系数