常见的机器学习面试问题(持续更新中)

卷积神经网络中的权值共享

  输入层和隐层之间若按照全连接方式去连接,权值w的维数太大,为了减少权值w的维数,可以采用隐层的每个神经元与输入层中的10*10个神经元相连,这样就大大减少了w的维数。进一步,如果我们让隐层每个神经元对用的10*10的权重w都相同,那么最后我们的权重w就只有10*10,但是这样子做未免也太粗糙了,提取的特征肯定很少,在此基础上,可以多加几个10*10大小的w就可以了,比如50个,那就可以提取50次特征了,总的w的维度就变成50*10*10个。这就是权值共享。

统计学习(传统机器学习)和深度学习的区别和联系

  区别:传统机器学习需要人工设计特征,需要做特征工程,并且特征工程很关键。而深度学习可以自动学习特征,特别是在图像、语言、文本方面,这些数据都有局部和整体的关系,深度学习能发挥很大的作用,但是调参也是一个很繁琐的事情。
  
  联系:深度学习 是一种实现机器学习的技术。

LR和SVM的异同

相同点:

  • LR和SVM都是分类算法
  • 如果不考虑核函数,LR和SVM都是分类算法,也就是说他们的决策面都是线性的
  • LR和SVM都是监督学习算法
  • LR和SVM都是判别模型
  • LR和SVM在学术界都广为人知并且应用广泛

不同点:

  • 本质上是其loss function不同。不同的loss function代表不同的假设前提,也就代表了不用的分类原理。 简单来说,逻辑回归方法是基于概率理论,假设样本为1的概率可以用sigmoid函数来表示,然后通过极大似然的方法可以估计出参数的值。支持向量则是基于几何间隔最大的原理,认为存在最大几何间隔的分类为最优分类面。
  • 支持向量只考虑局部边界线附近的点,而逻辑回归考虑全局。从这一点可以得知:线性SVM不直接依赖于数据分布,分类平面不受一类点影响;LR则受所有数据点的影响,如果数据不同类别strongly unbalance,一般需要先对数据做balancing。
  • 在解决非线性问题时,支持向量机采用核函数的机制,而LR通常不采用核函数的方法。 这个问题理解起来非常简单。分类模型的结果就是计算决策面,模型训练的过程就是决策面的计算过程。通过上面的第二点不同点可以了解,在计算决策面时,SVM算法里只有少数几个代表支持向量的样本参与了计算,也就是只有少数几个样本需要参与核计算(即kernal machine解的系数是稀疏的)。然而,LR算法里,每个样本点都必须参与决策面的计算过程,也就是说,假设我们在LR里也运用核函数的原理,那么每个样本点都必须参与核计算,这带来的计算复杂度是相当高的。所以,在具体应用时,LR很少运用核函数机制。​
  • 线性SVM依赖数据表达的距离测量,所以需要对数据先做normalization,LR不受其影响。(一个基于概率,一个基于距离)
  • SVM的损失函数就自带正则项,这就是问什么SVM是结构风险最小化算法的原因。而LR必须在损失函数上添加正则项 下式是SVM的损失函数
    L(ω,b,α)=12ω2i=1nαi(yi(ωTxi+b)1)

特征缩放(数据标准化)(概率模型不需要)

  特征缩放技术是指面对多维特征时,将特征数据标准化到一个特定的范围,保证这些特征具有相近的尺度,将其进行归一化,这将帮助梯度下降法反向传播时更快的收敛。

  • min-max标准化(Min-Max Normalization)(它把原始数据映射到[0-1]之间)

x=xmaxmaxmin

  • 0均值标准化(z-score标准化)(去均值除以标准差)

x=xμσ

两种方法的适用场景

  • 在不涉及距离度量、协方差计算、数据不符合正太分布的时候,可以使用第一种方法或其他归一化方法。比如图像处理中,将RGB图像转换为灰度图像后将其值限定在[0 255]的范围
  • 在分类、聚类算法中,需要使用距离来度量相似性的时候、或者使用PCA技术进行降维的时候,第二种方法(Z-score standardization)表现更好。

特征工程一般如何做

  特征工程的目的是获取更好的训练数据,把原始数据转变成特征。从数学的角度来看,特征工程就是人工的去设计输入变量X。主要分为三个步骤:1、特征构建;2、特征提取;3、特征选择

1、特征构建
   特征构建是指从原始数据中人工的找出一些具有物理意义的特征。需要花时间去观察原始数据,思考问题的潜在形式和数据结构,对数据敏感性和机器学习实战经验能帮助特征构建。

2、特征提取

  • PCA(Principal component analysis, 主成分分析)
  • LDA(Linear Discriminant Analysis, 线性判别分析)
  • ICA(Independent component analysis, 独立成分分析)

3、特征选择
  从给定的特征集合中选择出相关特征子集的过程,称为特征选择。

原因:

  • 维数灾难
  • 去除不相关的特征往往会降低学习任务的难度

主要选择方式:

  • 过滤式选择(先选择特征再训练)
  • 包裹式选择(根据要使用的学习器选择特征、期间进行多次训练、开销大,但是效果优于前者)
  • 嵌入式选择与L1正则化(不同于前两个将学习器的训练和特征选择分开,该方法边训练边选择)

解释什么是降维,在哪里会用到降维,它的好处是什么?

  降维是指通过保留一些比较重要的特征,去除一些冗余的特征,减少数据特征的维度。而特征的重要性取决于该特征能够表达多少数据集的信息,也取决于使用什么方法进行降维。使用哪种降维方法则是通过反复的试验和每种方法在该数据集上的效果。一般情况会先使用线性降维方法再使用非线性的降维方法。

好处:

  • 节省存储空间
  • 加速计算速度,维度越少,计算量越少,并且能够使用那些不适合高维度的算法
  • 去除一些冗余特征,比如降维后使得数据不会即保存平方米又保存平方英里的表示地形大小的特征
  • 将数据维度降到2维或者3维使之能可视化,便于观察和挖掘信息
  • 特征太多或者太复杂会使得模型过拟合
    常见的机器学习面试问题(持续更新中)

PCA和LDA

  两者都可用于将维,区别是PCA是一种无监督的映射方法,而LDA是有监督的映射方法。

  PCA将整组数据整体映射到最方便表示这组数据的坐标轴上,映射时没有利用任何数据内部的分类信息。用主要的特征代替其他相关的非主要的特征,所有特征之间的相关度越高越好。经过PCA处理后,整组数据在表示上更加方便(降低了维数并将信息损失降到最低),但在分类上也许会变得更加困难。

  LDA主要求一个映射,使得类别内的点距离越近越好(集中),类别间的点越远越好。其简要原理就是求取一个线性变换,使得不同类数据间的协方差矩阵和同一类数据内部的各个数据间协方差矩阵之比的达到最大。

如何处理缺失值

  处理方法有两种,一种是删除整行或者整列的数据,另一种则是使用其他值去填充。

如何解决过拟合

  • 获取更多的数据,数据越多越接近整体(数据集扩增)
  • 使用简单的模型
  • 训练时间,提前结束训练(Early stopping)(训练集误差不停下降,但是测试数据是先下降后上升,选择哪个临界点)
  • 正则化(限制权值)
  • 神经网络可以采用Dropout

ROC和AUC

  AUC(Area Under ROC Curve),即在ROC曲线下的面积。ROC曲线就是根据学习器的预测结果对样例进行排序,按此顺序逐个把样本作为正例进行预测,每次计算出两个重要的量,一个是真正例率,一个是假正例率(假例中预测为正例的比率),真正例率(正例中预测为正例的比率)作为纵轴,假正例率作为横轴,作图,就得到ROC曲线。

解释K-means原理

K-means算法针对聚类所得的簇划分最小化平方误差。找到最优解需考察样本集D所有可能的簇划分,这是一个NP难问题。k-means采用了贪心策略,通过迭代优化来近似求解。

  • 1、从D中随机选择k个样本作为初始均值向量,类别k是人为设定的。
  • 2、计算各个样本与各个均值向量的距离,根据距离最近的均值向量确定样本的簇标记,并化入相应的簇。
  • 3、更新均值向量,如果新的均值向量不等于之前的均值向量,则更新均值向量,否则保持不变。
  • 4、重复2~3,直到当前均值向量均未更新,得到最终的簇划分。

DBSCAN

  全称为“Density-Based Spatial Clustering of Applications with Noise”,属于密度聚类。此类算法假设聚类结构能通过样本分布的紧密程度确定。
  
定义以下几个概念:

  • ϵ-邻域:对xjDϵ邻域包含样本集D中与xj的距离不大于ϵ的样本,即Nϵ(xj)={xiD|dist(xi,xj)ϵ}
  • 核心对象:若xjϵ-邻域中至少包含MinPts个样本,则xj是一个核心对象。
  • 密度直达:若xj位于xiϵ-邻域中,且xi是核心对象,则称xjxi密度直达。
  • 密度可达:对xixj,若存在样本序列p1,p2,,pn,其中p1=xip1=xipi+1pi密度直达,则称xjxi密度可达。

簇”定义为:由密度可达关系导出的最大密度相连样本集合。

判别模拟和生成模型

  判别模型会生成一个表示P(Y|X)的判别函数(或预测模型),而生成模型先计算联合概率p(Y,X)然后通过贝叶斯公式转化为条件概率。简单来说,在计算判别模型时,不会计算联合概率,而在计算生成模型时,必须先计算联合概率。或者这样理解:生成算法尝试去找到底这个数据是怎么生成的(产生的),然后再对一个信号进行分类。基于你的生成假设,那么哪个类别最有可能产生这个信号,这个信号就属于那个类别。判别模型不关心数据是怎么生成的,它只关心信号之间的差别,然后用差别来简单对给定的一个信号进行分类。常见的判别模型有:KNN、SVM、LR,条件随机场(待定),常见的生成模型有:朴素贝叶斯,隐马尔可夫模型。当然,这也是为什么很少有人问你朴素贝叶斯和LR以及朴素贝叶斯和SVM有什么区别。
  
  简单的说:判别模型是直接学习p(y|x),或者直接从特征空间学习类别标签;生成模型是对类别模型进行学习,实际上,生成模型是对联合概率分布p(x,y)=p(x|y)p(y)进行学习的。

L1、L2正则化的区别

  相同点:都用于避免过拟合
  
  不同点:L1可以让一部分特征的系数缩小到0,从而间接实现特征选择。所以L1适用于特征之间有关联的情况,并且可以用来做特征选择。 L2让所有特征的系数都缩小,但是不会减为0,它会使优化求解稳定快速。所以L2适用于特征之间没有关联的情况。
  
  对于L1正则化:当w为正时,更新后的w变小。当w为负时,更新后的w变大——因此它的效果就是让w往0靠,使网络中的权重尽可能为0,也就相当于减小了网络复杂度,防止过拟合。
  
  另外,上面没有提到一个问题,当w为0时怎么办?当w等于0时,|W|是不可导的,所以我们只能按照原始的未经正则化的方法去更新w,这就相当于去掉η*λ*sgn(w)/n这一项,所以我们可以规定sgn(0)=0,这样就把w=0的情况也统一进来了。(在编程的时候,令sgn(0)=0,sgn(w>0)=1,sgn(w<0)=-1)

什么是梯度消散和梯度爆炸

  如果网络使用sigmod**函数,误差在向前传递的时候,经过sigmod单元,需要乘sigmod的梯度,而sigmod的梯度最大是0.25,因此越向前传递,误差就越小了,这就是梯度消散,但是梯度爆炸是什么?注意误差在经过全连接或者卷积层时,也要乘以权重w,如果w都比较大,大过sigmod造成的减小,这样越往前误差就越来越大,梯度爆炸了!

对于BN层的理解

  Batchnorm是深度学习发展以来提出的最重要的成果之一了,目前已经被广泛的应用到了各大网络中,具有加速网络收敛速度,提升训练稳定性的效果,Batchnorm本质上是解决反向传播过程中的梯度问题。batchnorm全名是batch normalization,简称BN,即批规范化,通过规范化操作将输出信号x规范化保证网络的稳定性。

1、防止梯度消失,加快训练速度

  BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正太分布,其实就是把越来越偏的分布强制拉回比较标准的分布,这样使得**输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,意思是这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。
  
  通俗来说,随着网络的训练,出了输入数据,中间数据的的分布在不断的发生变化,这就给网络的学习带来了一定的困难,此现象称之为Internal Covariate Shift。BN层即将每个隐层神经元,把逐渐向非线性函数映射后向取值区间极限饱和区靠拢的输入分布强制拉回到均值为0方差为1的比较标准的正态分布,使得非线性变换函数的输入值落入对输入比较敏感的区域,以此避免梯度消失问题。

2、防止过拟合

  大概意思是:在训练中,BN的使用使得一个mini-batch中的所有样本都被关联在了一起,因此网络不会从某一个训练样本中生成确定的结果。
  
  这句话什么意思呢?意思就是同样一个样本的输出不再仅仅取决于样本本身,也取决于跟这个样本属于同一个mini-batch的其它样本。同一个样本跟不同的样本组成一个mini-batch,它们的输出是不同的(仅限于训练阶段,在inference阶段是没有这种情况的)。我把这个理解成一种数据增强:同样一个样本在超平面上被拉扯,每次拉扯的方向的大小均有不同。不同于数据增强的是,这种拉扯是贯穿数据流过神经网络的整个过程的,意味着神经网络每一层的输入都被数据增强处理了。

为什么正则化可以防止过拟合

  正则化可以是权值衰减,为什么w“变小”可以防止overfitting?一个所谓“显而易见”的解释就是:更小的权值w,从某种意义上说,表示网络的复杂度更低,对数据的拟合刚刚好(这个法则也叫做奥卡姆剃刀)
  
  另外一种理解:过拟合的时候,拟合函数的系数往往非常大,为什么?如下图所示,过拟合,就是拟合函数需要顾忌每一个点,最终形成的拟合函数波动很大。在某些很小的区间里,函数值的变化很剧烈。这就意味着函数在某些小区间里的导数值(绝对值)非常大,由于自变量值可大可小,所以只有系数足够大,才能保证导数值很大。而正则化是通过约束参数的范数使其不要太大,所以可以在一定程度上减少过拟合情况。

Random forest 原理

   Random forest是Bagging的一个扩展变体。以决策树为基学习器。在决策树的训练过程中引入了随机属性选择。
  
1. 假如m个训练样本,自助采样一个训练集
2. 当每个样本有d个属性,在决策树的每个节点需要分裂时,随机从这d个属性中选取出k个属性,满足条件k << d。推荐值k=log2d,再从这个k个属性值中采取某种策略(比如说信息增益)来选择一个属性作为该节点的分裂属性。
3. 决策树形成过程的每个节点都要按照步骤2来分裂,一直到不能够再分裂位置。整个决策树形成过程没有剪枝。
4. 按照步骤1~3建立大量的决策树,再对训练出来的弱决策树进行集成,这样就构成了随机森林。

xgboost/gbdt在调参时为什么树的深度很少就能达到很高的精度?但是用DecisionTree/RandomForest的时候需要把树的深度调到15或更高。

   一句话的解释,来自周志华老师的机器学习教科书( 机器学习-周志华):Boosting主要关注降低偏差,因此Boosting能基于泛化性能相当弱的学习器构建出很强的集成;Bagging主要关注降低方差,因此它在不剪枝的决策树、神经网络等学习器上效用更为明显。
  
   Bagging算法是这样做的:每个分类器都随机从原样本中做有放回的采样,然后分别在这些采样后的样本上训练分类器,然后再把这些分类器组合起来。简单的多数投票一般就可以。其代表算法是随机森林。Boosting的意思是这样,他通过迭代地训练一系列的分类器,每个分类器采用的样本分布都和上一轮的学习结果有关。其代表算法是AdaBoost, GBDT。
  
   对于Bagging算法来说,由于我们会并行地训练很多不同的分类器的目的就是降低这个方差(variance) ,因为采用了相互独立的基分类器多了以后,h的值自然就会靠近.所以对于每个基分类器来说,目标就是如何降低这个偏差(bias),所以我们会采用深度很深甚至不剪枝的决策树。
  
  对于Boosting来说,每一步我们都会在上一轮的基础上更加拟合原数据,所以可以保证偏差(bias),所以对于每个基分类器来说,问题就在于如何选择variance更小的分类器,即更简单的分类器,所以我们选择了深度很浅的决策树。

集成学习介绍(boosting、bagging、stacking原理)

  集成学习器通过构建并结合多个学习器(弱学习器)来完成学习任务,常可获得比单一学习器显著优越的泛化性能。
主要集成学习方法可以分为两大类:

  1. 个体学习器之间存在强依赖关系,必须串行生成序列化方法。(Boosting)
  2. 体学习器间不存在强依赖关系,可同时生成的并行化算法。(Bagging和Random Forest)

Boosting

  先从初始训练集训练出一个基学习器,再根据基学习器的表现对样本分布进行调整,使得先前基学习做错的训练样本在后续受到更多的关注,然后基于调整后的样本分布来训练下一个基学习器;如此反复进行,直到基学习器数目达到事先指定的值T,最终将这个T个基学习器进行加权组合。

Bagging

  基于自助采样法(booststrap sampling)。
  采样出T个含m个训练样本的采样集,然后基于每个采样集训练出一个基学习器,在将这些基学习器进行结合。结合时分类任务常使用简单投票法,回归任务使用简单平均法。

Stacking

  Stacking其实是一种结合策略(本身也是一种著名的集成学习算法),即基学习器的结合策略。把个体学习器成为初级学习器,用于结合的学习器称为次级学习器或元学习器。
  
  Stacking先从初始数据集训练出初级学习器,然后生成一个新的数据集用于训练次级学习器,初级学习器的输出被当做样例特征,而初始样本的标记仍被当作样例标记。
  
  使用交叉验证或者留一法,用初级学习器为使用的样本来产生次级学习器的训练样本。
  
  次级学习算法一般使用多响应线性回归效果较好。

随机梯度下降法和牛顿法的区别和定义

  随机梯度下降是使用的一阶导,实现简单。当目标函数是凸函数时,梯度下降法的解是全局最优解,一般情况下,其解不保证是全局最优解。收敛速度未必是很快的。
  
  牛顿法和拟牛顿法有收敛速度快的优点。需要求解目标函数的海赛矩阵的逆矩阵,计算比较复杂。拟牛顿法通过正定矩阵近似海赛矩阵的逆矩阵或海赛矩阵,简化了这一计算过程。主要是使用二阶导数。

常见的**函数有哪些

  加入**函数是用来加入非线性因素的,解决线性模型所不能解决的问题。
(1) sigmoid
  函数表达式:f(x)=11+ex
  存在梯度消失、不是关于原点对称、计算exp比较耗时等问题

(2) tanh
  函数表达式:f(x)=exexex+ex=1e2x1+e2x
  收敛速度比sigmoid快
  解决了原点对称问题,但是梯度弥散(梯度消失)没有解决

(3)ReLU
  函数表达式:f(x)=max(0,x)
  能够有效缓解梯度消失问题。
  提供神经网络的稀疏表达能力。
  ReLU在x<0时,权重无法更新,会导致“神经元死亡”。

(4) Leaky-ReLu
  函数表达式:

f(x)=ax(x<0)
f(x)=x(x>=0)

(5) PReLU(parametric ReLU)
  对于Leaky ReLU中的α作为一个参数进行训练。

  一般如何选择?
  答:首先尝试ReLU

  更详细内容,请参考 常用**函数的总结与比较

反向传播中,怎么做梯度检验?

  对于一个函数来说,通常有两种计算梯度的方式:

  • 数值梯度
  • 解析题都

      经网络算法使用反向传播计算目标函数关于每个参数的梯度,由于神经网络中函数都是可导的,所以求的是解析梯度。由于计算过程中涉及到的参数很多,反向传播计算的梯度很容易出现误差。
      为了确认代码中反向传播计算的梯度是否正确,可以采用梯度检验(gradient check)的方法。通过计算数值梯度,得到梯度的近似值,然后和反向传播算法进行比较,若两者相差很小的话则证明反向传播的代码是正确的。
    数值梯度:

ddθJ(θ)=J(θ+ϵ)J(θ+ϵ)2ϵ

  ϵ是一个很小的值,比如10(4)。所以我们可以通过计算损失函数的数值梯度来检验解析梯度,如果二者很接近的话,则验证解析方法得到的梯度是正确的。

SVM调参

  最重要的两个:
(1)C: 目标函数的惩罚系数C,用来平衡分类间隔margin和错分样本的,default C = 1.0。C一般可以选择为:10^t , t=[- 4,4]就是0.0001 到10000。其中 C是惩罚系数,即对误差的宽容度。C越高,说明越不能容忍出现误差,容易过拟合。C越小,容易欠拟合。C过大或过小,泛化能力变差

(2)gamma:核函数的系数(‘Poly’, ‘RBF’ and ‘Sigmoid’), 默认是gamma = 1 / n_features; gamma是选择RBF函数作为kernel后,该函数自带的一个参数。隐含地决定了数据映射到新的特征空间后的分布,gamma越大,支持向量越少,gamma值越小,支持向量越多。支持向量的个数影响训练与预测的速度。

总结:
  C表示模型对误差的惩罚系数;gamma反映了数据映射到高维特征空间后的分布,gamma越大,支持向量越多,gamma值越小,支持向量越少。C越大,模型越容易过拟合;C越小,模型越容易欠拟合。gamma越小,模型的泛化性变好,但过小,模型实际上会退化为线性模型;gamma越大,理论上SVM可以拟合任何非线性数据。

  为维持模型在过拟合和欠拟合之间的平衡,往往最佳的参数范围是C比较大,gamma比较小;或者C比较小,gamma比较大。也就是说当模型欠拟合时,我们需要增大C或者增大gamma,不能同时增加,调节后如果模型过拟合,我们又很难判断是C过大了,还是gamma过大了;同理,模型欠拟合的时候,我们需要减小C或者减小gamma。

  还有一些其他的:比如每个类的权重,最大地带次数等等。

lr调参

(1)正则化参数的选择:L1 L2等;
(2)优化算法:牛顿,拟牛顿,SGD等;
(3)分类方式选择:ovr(one-vs-rest)和MvM(many-vs-many)

  OvR的思想很简单,无论你是多少元逻辑回归,我们都可以看做二元逻辑回归。具体做法是,对于第K类的分类决策,我们把所有第K类的样本作为正例,除了第K类样本以外的所有样本都作为负例,然后在上面做二元逻辑回归,得到第K类的分类模型。其他类的分类模型获得以此类推。
  
  而MvM则相对复杂,这里举MvM的特例one-vs-one(OvO)作讲解。如果模型有T类,我们每次在所有的T类样本里面选择两类样本出来,不妨记为T1类和T2类,把所有的输出为T1和T2的样本放在一起,把T1作为正例,T2作为负例,进行二元逻辑回归,得到模型参数。我们一共需要T(T-1)/2次分类。
  
  从上面的描述可以看出OvR相对简单,但分类效果相对略差(这里指大多数样本分布情况,某些样本分布下OvR可能更好)。而MvM分类相对精确,但是分类速度没有OvR快。

(4)一些权重参数。

更详细内容,请参考 klearn逻辑回归(Logistic Regression,LR)类库使用小结

贝叶斯分类中朴素贝叶斯和半朴素贝叶斯的理解

贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。而朴素朴素贝叶斯分类是贝叶斯分类中最简单,也是常见的一种分类方法。

朴素贝叶斯分类

1、假设特征之间相互独立,再去做贝叶斯分类。假设独立的原因有两点(1、每个特征有多个属性,多个特征的联合概率分布总数过多; 2、)

详细内容参考: 【机器学习】贝叶斯分类(通过通俗的例子轻松理解朴素贝叶斯与半朴素贝叶斯)
机器学习笔记贝叶斯分类器(IV)半朴素贝叶斯分类器

机器学习算法中GBDT和XGBOOST的区别有哪些?

  • 传统GBDT以CART作为基分类器,xgboost还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑回归(分类问题)或者线性回归(回归问题)。
  • 传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。顺便提一下,xgboost工具支持自定义代价函数,只要函数可一阶和二阶求导。
  • Shrinkage(缩减),相当于学习速率(xgboost中的eta)。xgboost在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。实际应用中,一般把eta设置得小一点,然后迭代次数设置得大一点。(补充:传统GBDT的实现也有学习速率)
  • 列抽样(column subsampling)即特征抽样。xgboost借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算,这也是xgboost异于传统gbdt的一个特性。
  • 对缺失值的处理。对于特征的值有缺失的样本,xgboost可以自动学习出它的分裂方向。
  • xgboost工具支持并行。boosting不是一种串行的结构吗?怎么并行的?注意xgboost的并行不是tree粒度的并行,xgboost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。xgboost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),xgboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
  • 可并行的近似直方图算法。树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有可能的分割点。当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以xgboost还提出了一种可并行的近似直方图算法,用于高效地生成候选的分割点。