https://blog.csdn.net/a2524289/article/details/78888480
1.支持向量机(SVM)的优缺点:
VM的优缺点
优点:
(1)非线性映射是SVM方法的理论基础,SVM利用内积核函数代替向高维空间的非线性映射;
(2)对特征空间划分的最优超平面是SVM的目标,最大化分类边际的思想是SVM方法的核心;
(3)支持向量是SVM的训练结果,在SVM分类决策中起决定作用的是支持向量。
(4)SVM 是一种有坚实理论基础的新颖的小样本学习方法。它基本上不涉及概率测度及大数定律等,因此不同于现有的统计方法。从本质上看,它避开了从归纳到演绎的传统过程,实现了高效的从训练样本到预报样本的“转导推理”,大大简化了通常的分类和回归等问题。
(5)SVM 的最终决策函数只由少数的支持向量所确定,计算的复杂性取决于支持向量的数目,而不是样本空间的维数,这在某种意义上避免了“维数灾难”。
(6)少数支持向量决定了最终结果,这不但可以帮助我们抓住关键样本、“剔除”大量冗余样本,而且注定了该方法不但算法简单,而且具有较好的“鲁棒”性。这种“鲁棒”性主要体现在:
①增、删非支持向量样本对模型没有影响;
②支持向量样本集具有一定的鲁棒性;
③有些成功的应用中,SVM 方法对核的选取不敏感
缺点:
(1) SVM算法对大规模训练样本难以实施
由于SVM是借助二次规划来求解支持向量,而求解二次规划将涉及m阶矩阵的计算(m为样本的个数),当m数目很大时该矩阵的存储和计算将耗费大量的机器内存和运算时间。针对以上问题的主要改进有有J.Platt的SMO算法、T.Joachims的SVM、C.J.C.Burges等的PCGC、张学工的CSVM以及O.L.Mangasarian等的SOR算法
(2) 用SVM解决多分类问题存在困难
经典的支持向量机算法只给出了二类分类的算法,而在数据挖掘的实际应用中,一般要解决多类的分类问题。可以通过多个二类支持向量机的组合来解决。主要有一对多组合模式、一对一组合模式和SVM决策树;再就是通过构造多个分类器的组合来解决。主要原理是克服SVM固有的缺点,结合其他算法的优势,解决多类问题的分类精度。如:与粗集理论结合,形成一种优势互补的多类问题的组合分类器。
2.SVM基本思想:
基本思想:试图寻找一个超平面来对样本分割,把样本中的正例和反例用超平面分开,并尽可能的使正例和反例之间的间隔最大。
3. 为什么要转为对偶问题?(阿里面试)
(a) 目前处理的模型严重依赖于数据集的维度d,如果维度d太高就会严重提升运算时间;
(b) 对偶问题事实上把SVM从依赖d个维度转变到依赖N个数据点,考虑到在最后计算时只有支持向量才有意义,所以这个计算量实际上比N小很多。
3. 松弛向量与软间隔最大化:
原因:一些离群点或者噪声点影响分界面;
解决方法:允许某些样本不满足约束:
解释:引入松弛变量后,就允许某些样本点的函数间隔小于1,即在最大间隔区间里面,或者函数间隔是负数,即样本点在对方的区域中。C是离群点的权重,值越大说明离群点对目标函数影响越大,这时候间隔就会很小。
(4)核函数
原因:原始空间线性不可分,可以使用一个非线性映射将原始数据x变换到另一个高维特征空间,在这个空间中,样本变得线性可分。线性核,高斯核,拉普拉斯核等。
优点:避免了高维空间的计算,计算核函数的复杂度和计算原始样本内积的复杂度没有实质性的增加。
SVM的原理是什么?
SVM是一种二类分类模型。它的基本模型是在特征空间中寻找间隔最大化的分离超平面的线性分类器。(间隔最大是它有别于感知机)
(1)当训练样本线性可分时,通过硬间隔最大化,学习一个线性分类器,即线性可分支持向量机;
(2)当训练数据近似线性可分时,引入松弛变量,通过软间隔最大化,学习一个线性分类器,即线性支持向量机;
(3)当训练数据线性不可分时,通过使用核技巧及软间隔最大化,学习非线性支持向量机。
注:以上各SVM的数学推导应该熟悉:硬间隔最大化(几何间隔)---学习的对偶问题---软间隔最大化(引入松弛变量)---非线性支持向量机(核技巧)。
SVM为什么采用间隔最大化?
当训练数据线性可分时,存在无穷个分离超平面可以将两类数据正确分开。
感知机利用误分类最小策略,求得分离超平面,不过此时的解有无穷多个。
线性可分支持向量机利用间隔最大化求得最优分离超平面,这时,解是唯一的。另一方面,此时的分隔超平面所产生的分类结果是最鲁棒的,对未知实例的泛化能力最强。
然后应该借此阐述,几何间隔,函数间隔,及从函数间隔—>求解最小化1/2 ||w||^2 时的w和b。即线性可分支持向量机学习算法—最大间隔法的由来。
为什么要将求解SVM的原始问题转换为其对偶问题?
一、是对偶问题往往更易求解(当我们寻找约束存在时的最优点的时候,约束的存在虽然减小了需要搜寻的范围,但是却使问题变得更加复杂。为了使问题变得易于处理,我们的方法是把目标函数和约束全部融入一个新的函数,即拉格朗日函数,再通过这个函数来寻找最优点。)
二、自然引入核函数,进而推广到非线性分类问题。
为什么SVM要引入核函数?
当样本在原始空间线性不可分时,可将样本从原始空间映射到一个更高维的特征空间,使得样本在这个特征空间内线性可分。
引入映射后的对偶问题:
在学习预测中,只定义核函数K(x,y),而不是显式的定义映射函数ϕ。因为特征空间维数可能很高,甚至可能是无穷维,因此直接计算ϕ(x)·ϕ(y)是比较困难的。相反,直接计算K(x,y)比较容易(即直接在原来的低维空间中进行计算,而不需要显式地写出映射后的结果)。
核函数的定义:K(x,y)=<ϕ(x),ϕ(y)>,即在特征空间的内积等于它们在原始样本空间中通过核函数K计算的结果。
除了 SVM 之外,任何将计算表示为数据点的内积的方法,都可以使用核方法进行非线性扩展。
为什么SVM对缺失数据敏感?
这里说的缺失数据是指缺失某些特征数据,向量数据不完整。SVM没有处理缺失值的策略(决策树有)。而SVM希望样本在特征空间中线性可分,所以特征空间的好坏对SVM的性能很重要。缺失特征数据将影响训练结果的好坏。
SVM是用的是哪个库?Sklearn/libsvm中的SVM都有什么参数可以调节?
用的是sklearn实现的。采用sklearn.svm.SVC设置的参数。本身这个函数也是基于libsvm实现的(PS: libsvm中的二次规划问题的解决算法是SMO)。
SVC函数的训练时间是随训练样本平方级增长,所以不适合超过10000的样本。
对于多分类问题,SVC采用的是one-vs-one投票机制,需要两两类别建立分类器,训练时间可能比较长。
SVM如何处理多分类问题?
一般有两种做法:一种是直接法,直接在目标函数上修改,将多个分类面的参数求解合并到一个最优化问题里面。看似简单但是计算量却非常的大。
另外一种做法是间接法:对训练器进行组合。其中比较典型的有一对一,和一对多。
一对多,就是对每个类都训练出一个分类器,由svm是二分类,所以将此而分类器的两类设定为目标类为一类,其余类为另外一类。这样针对k个类可以训练出k个分类器,当有一个新的样本来的时候,用这k个分类器来测试,那个分类器的概率高,那么这个样本就属于哪一类。这种方法效果不太好,bias比较高。
svm一对一法(one-vs-one),针对任意两个类训练出一个分类器,如果有k类,一共训练出C(2,k) 个分类器,这样当有一个新的样本要来的时候,用这C(2,k) 个分类器来测试,每当被判定属于某一类的时候,该类就加一,最后票数最多的类别被认定为该样本的类。
如何选择核函数:
在选取核函数解决实际问题时,通常采用的方法有:一是利用专家的先验知识预先选定核函数;二是采用Cross-Validation方法,即在进行核函数选取时,分别试用不同的核函数,归纳误差最小的核函数就是最好的核函数.如针对傅立叶核、RBF核,结合信号处理问题中的函数回归问题,通过仿真实验,对比分析了在相同数据条件下,采用傅立叶核的SVM要比采用RBF核
的SVM误差小很多.三是采用由Smits等人提出的混合核函数方法,该方法较之前两者是目前选取核函数的主流方法,也是关于如何构造核函数的又一开创性的工作.将不同的核函数结合起来后会有更好的特性,这是混合核函数方法的基本思想.
https://blog.csdn.net/red_stone1/article/details/80755144
https://blog.csdn.net/u013185349/article/details/81052767
二、ROC和AUC
2.1 真正例率和假正例率
真正例率TPR的意义是,真实label为+的样本里,预测为+的样本比例(就是召回率)
TPR=TPTP+FN
TPR=TPTP+FN
假正例率FPR的意义是,真实label为-的样本里,预测为+的样本比例
FPR=FPFP+TN
FPR=FPFP+TN
ROC曲线和AUC
ROC的全称是Receiver Operating Characteristic曲线,它是以FPR为横轴,TPR为纵轴绘制的曲线,它越靠近左上角,表明模型的性能越好。如果模型A的ROC曲线能完全“包住”模型B的ROC曲线,则可断言A的性能比B好,但是两个模型的ROC往往是相交的,这时为了比较性能就需要用到AUC。
AUC的全称是Area Under Curve,就是ROC曲线和x轴(FPR轴)之间的面积。AUC考虑的是模型预测的排序质量,反映了模型把正例排在反例前面的比例(如果AUC=1,说明模型100%将所有正例排在反例前面)。
ROC曲线绘制
对于一个特定的分类器和测试数据集,显然只能得到一个分类结果,即一组FPR和TPR结果,而要得到一个曲线,我们实际上需要一系列FPR和TPR的值才能得到这样的曲线,这又是如何得到的呢?
可以通过分类器的一个重要功能“概率输出”,即表示分类器认为某个样本具有多大的概率属于正样本(或负样本),来动态调整一个样本是否属于正负样本
假如我们已经得到了所有样本的概率输出(属于正样本的概率),现在的问题是如何改变这个阈值(概率输出)?我们根据每个测试样本属于正样本的概率值从大到小排序。下图是一个示例,图中共有20个测试样本,“Class”一栏表示每个测试样本真正的标签(p表示正样本,n表示负样本),“Score”表示每个测试样本属于正样本的概率。
接下来,我们从高到低,依次将“Score”值作为阈值,当测试样本属于正样本的概率大于或等于这个阈值时,我们认为它为正样本,否则为负样本。举例来说,对于图中的第4个样本,其“Score”值为0.6,那么样本1,2,3,4都被认为是正样本,因为它们的“Score”值都大于等于0.6,而其他样本则都认为是负样本。每次选取一个不同的阈值,我们就可以得到一组FPR和TPR,即ROC曲线上的一点。这样一来,我们一共得到了20组FPR和TPR的值,将它们画在ROC曲线的结果如下图:
AUC是指:从一堆样本中随机抽一个,抽到正样本的概率比抽到负样本的概率大的可能性!
为什么AUC和logloss比accuracy更常用呢?
因为很多机器学习的模型对分类问题的预测结果都是概率,如果要计算accuracy,需要先把概率转化成类别,这就需要手动设置一个阈值,如果对一个样本的预测概率高于这个预测,就把这个样本放进一个类别里面,低于这个阈值,放进另一个类别里面。所以这个阈值很大程度上影响了accuracy的计算。使用AUC或者logloss可以避免把预测概率转换成类别。
https://blog.csdn.net/Chenzhi_2016/article/details/79451201
一、PCA
1、思想
主成分分析(Principal components analysis),是一种降维方法,在数据压缩消除冗余和数据噪音消除等领域都有广泛的应用,需要我们找出数据里最主要的方面,然后来代替原始数据。比如我们希望将数据从二维降低到一维,那么这里就存在了一个映射关系,通常这个映射关系我们用矩阵表示。而我们的工作便是找到这个矩阵,这里我们要思考矩阵是用哪些向量来表示的呢?带着这个问题我们来解决二维数据降维到一维的具体问题。数据如下图。我们希望找到某一个维度方向,它可以代表这两个维度的数据。图中列了两个向量方向,U1和U2那么哪个向量可以更好的代表原始数据集呢?从直观上也可以看出,U1比U2好。为什么答案是这样呢?
我们是这样解释的,因为我们希望降维后 ,样本点在这个向量(或者是超平面)上的投影尽可能的分开,也就是说基于最大化投影方差。为什么标准是这个样子呢?请试想,如果投影后的数据点全都集中到一个地方了,那么很多点就无法看到了,也就是说失去了很多有效的信息,如果我们将数据点尽可能的分开让大家都能看到,这样的话,信息保留的会最多。
PCA的弱点
(1)它是运用于非监督的情况下的,对于有类别的数据则无法分辨出来,造成负面的影响。
(2)它只适用于非线性的情况下。
首先我们解决第二个弱点,当遇到非线性的情况怎么办呢?
既然工作是降维,但为什么不可以先升再降呢?我们知道当数据是非线性的,可以先把数据集从n维映射到线性可分的高维N>n,然后再从N维降维到一个低纬度n',这里的维度之间满足n' 使用了核函数的主成分分析一般称之为核主成分分析(Kernalized PCA,简称KPCA)。通过在高维空间进行协方差的特征值分解,然后用和PCA一样的方法进行降维。一般来说,映射向量不用显式的计算,而是在需要计算的时候用过核函数完成。由于KPCA需要核函数的运算,因此它的计算量要比PCA大很多。 下面我们来解决PCA第一个弱点,当遇到数据样本是标签类别的,PCA就不适用了呀,所以我们引进监督学习下的降维算法LDA。 二、LDA 何为LDA,线性判别分析(Linear Discriminant Analysis,以下简称LDA),在模式识别领域有广泛应用(人脸识别等图像识别领域),注意,这里有必要将其与自然语言处理领域的LDA(Latent Dirichlet Allocation)区别开来。 1、LDA的思想 它是一种监督学习的降维技术,也就是说它的数据集的每个样本是有类别输出的(PCA是不考虑样本类别输出的的无监督降维技术)。LDA的思想用一句话概括就是“投影后类间方差最大,类内方差最小”(有点像分类的感觉哈),也就是说数据投影在低维度空间后,投影点尽可能的接近,而不同类别的投影点群集的中心点彼此之间的离得尽可能大。 三、LDA和PCA对抗赛 1、相同点 (1)两者的作用是用来降维的 (2)两者都假设符合高斯分布 2、不同点 (1)LDA是有监督的降维方法,PCA是无监督的。 (2)LDA降维最多降到类别数K-1的维数,PCA没有这个限制。 (3)LDA更依赖均值,如果样本信息更依赖方差的话,效果将没有PCA好。 (4)LDA可能会过拟合数据。 缺失值问题可以从三个方面来考虑 1. 在选择分裂属性的时候,训练样本存在缺失值,如何处理?(计算分裂损失减少值时,忽略特征缺失的样本,最终计算的值乘以比例(实际参与计算的样本数除以总的样本数)) 假如你使用ID3算法,那么选择分类属性时,就要计算所有属性的熵增(信息增益,Gain)。假设10个样本,属性是a,b,c。在计算a属性熵时发现,第10个样本的a属性缺失,那么就把第10个样本去掉,前9个样本组成新的样本集,在新样本集上按正常方法计算a属性的熵增。然后结果乘0.9(新样本占raw样本的比例),就是a属性最终的熵。 2. 分类属性选择完成,对训练样本分类,发现样本属性缺失怎么办?(将该样本分配到所有子节点中,权重由1变为具有属性a的样本被划分成的子集样本个数的相对比率,计算错误率的时候,需要考虑到样本权重) 比如该节点是根据a属性划分,但是待分类样本a属性缺失,怎么办呢?假设a属性离散,有1,2两种取值,那么就把该样本分配到两个子节点中去,但是权重由1变为相应离散值个数占样本的比例。然后计算错误率的时候,注意,不是每个样本都是权重为1,存在分数。 3. 训练完成,给测试集样本分类,有缺失值怎么办?(分类时,如果待分类样本有缺失变量,而决策树决策过程中没有用到这些变量,则决策过程和没有缺失的数据一样;否则,如果决策要用到缺失变量,决策树也可以在当前节点做多数投票来决定(选择样本数最多的特征值方向)。) (U)如果有单独的缺失分支,使用此分支。(c)把待分类的样本的属性a值分配一个最常出现的a的属性值,然后进行分支预测。(S)根据其他属性为该待分类样本填充一个属性a值,然后进行分支处理。(F)在决策树中属性a节点的分支上,遍历属性a节点的所有分支,探索可能所有的分类结果,然后把这些分类结果结合起来一起考虑,按照概率决定一个分类。(H)待分类样本在到达属性a节点时就终止分类,然后根据此时a节点所覆盖的叶子节点类别状况为其分配一个发生概率最高的类。 随机森林是一个包含多个决策树的分类器,构建过程如下:https://www.cnblogs.com/zhaochunhua/p/6834728.html 2)那随机森林具体如何构建呢?有两个方面:数据的随机性选取,以及待选特征的随机选取。 先说说bootstrap, bagging,boosting 的含义。 该思想的应用有两方面:bagging和boosting 4.GBDT(Gradient Boost Decision Tree 梯度提升决策树) GBDT是以决策树(CART)为基学习器的GB算法,是迭代树,而不是分类树。 GBDT的核心就在于:每一棵树学的是之前所有树结论和的残差,这个残差就是一个加预测值后能得真实值的累加量。比如A的真实年龄是18岁,但第一棵树的预测年龄是12岁,差了6岁,即残差为6岁。那么在第二棵树里我们把A的年龄设为6岁去学习,如果第二棵树真的能把A分到6岁的叶子节点,那累加两棵树的结论就是A的真实年龄;如果第二棵树的结论是5岁,则A仍然存在1岁的残差,第三棵树里A的年龄就变成1岁,继续学习。 Xgboost: https://blog.csdn.net/yingfengfeixiang/article/details/80210145 事实上,如果不考虑工程实现、解决问题上的一些差异,xgboost与gbdt比较大的不同就是目标函数的定义,Xgboost是GB算法的高效实现,xgboost中的基学习器除了可以是CART(gbtree)也可以是线性分类器(gblinear)。下面所有的内容来自原始paper,包括公式。 (1). xgboost在目标函数中显示的加上了正则化项,基学习为CART时,正则化项与树的叶子节点的数量T和叶子节点的值有关。 (2). GB中使用Loss Function对f(x)的一阶导数计算出伪残差用于学习生成fm(x),xgboost不仅使用到了一阶导数,还使用二阶导数。 (3). 上面提到CART回归树中寻找最佳分割点的衡量标准是最小化均方差,xgboost寻找分割点的标准是最大化,lamda,gama与正则化项相关 xgboost算法的步骤和GB基本相同,都是首先初始化为一个常数,gb是根据一阶导数ri,xgboost是根据一阶导数gi和二阶导数hi,迭代生成基学习器,相加更新学习器。 xgboost与gdbt除了上述三点的不同,xgboost在实现时还做了许多优化: 数据挖掘面试题之SVM和LR的不同 1、样本点对模型的作用不同。SVM中,只有关键的样本点(支持向量)对模型结果有影响,而LR中,每一个样本点都对模型有影响。 2、损失函数不同。SVM是hinge损失函数,LR是log损失函数 3、理论基础不同。SVM基于严格的数学推导,LR基于统计 4、输出不同。LR可以对每个样本点给出类别判断的概率值,SVM无法做到。 5、可处理的特征空间维度不同。LR在特征空间维度很高时,表现较差。SVM则可以通过对偶求解高效应对这一挑战。 6、防过拟合能力不同。SVM模型中内含了L2正则,可有效防止过拟合。LR要自己添加正则项。 7、处理非线性分类问题能力不同。SVM可通过核函数灵活地将非线性问题转化为线性分类问题。LR如果要做到这一点,需要自己手动地进行特征转换。 8、处理分类问题能力不同。SVM只能处理二类分类问题,如果要处理多类别分类,需要进行 one VS one 或one VS all建模。LR可以直接进行多类别分类。 9、计算复杂度不同。对于海量数据,SVM的效率较低,LR效率比较高。 10、对数据要求不同。SVM依赖于数据表达出的距离测度,所以需要对数据进行标准化处理,而LR不需要。 13、抗噪声数据能力不同。SVM的损失函数基于距离测度,抗噪声能力要强于LR。 随机森林怎么取最后的结果? 随机森林是怎样避免ID3算法信息增益的缺点的? GBDT一些调参的方式: 树的个数 100~10000 精度高 不太适合并发执行 都是由多棵树组成 组成随机森林的树可以是分类树,也可以是回归树;而GBDT只由回归树组成 显式的把树模型复杂度作为正则项加到优化目标中。 2.传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。顺便提一下,xgboost工具支持自定义代价函数,只要函数可一阶和二阶求导。 —对损失函数做了改进(泰勒展开,一阶信息g和二阶信息h) GBDT正则化有三种办法: ft(x)=ft−1(x)+ηht(x)ft(x)=ft−1(x)+ηht(x) 利用(xi,rti)(xi,rti)来构建cart回归树的时候,GBDT分裂会选取使得误差下降最多(如果cart树采用的是均方差作为损失,那么就是最小均方差)的特征进行分裂,如果这棵树不能拟合好,那么就要通过负梯度计算出新的残差向量来拟合新的cart回归树。对初始cart树可以直接用0,也可以采用样本的均值。既然已经有了分裂规则,那么如何停止继续分裂呢?主要可以通过以下手段进行操作:1、节点分裂时的最小样本数;2、树的最大深度;3、树的最大叶子节点数;4、loss满足约束条件。 前面提到,在构建cart树时使用了损失函数的负梯度,而不是所谓的残差=真值-预测值;实际上是一种更宽广的概念,但是在平方损失的情况下,上面等式是成立的。另外使用损失函数的梯度可以保证损失函数最小值。所以GBDT的梯度提升体现在构建cart树的所需的负梯度阶段,其利用最速下降的近似方法。 特征j的全局重要度通过特征j在单颗树中的重要度的平均值来衡量 J2j^=1M∑m=1MJ2j^(Tm)Jj2^=1M∑m=1MJj2^(Tm) 其中M是树的数量。特征j在单颗树中的重要度的如下 J2j^(T)=∑t=1L−1i2t^I(vt=j)Jj2^(T)=∑t=1L−1it2^I(vt=j) 其中,L为树的叶子节点数量,L−1即为树的非叶子节点数量(构建的树都是具有左右孩子的二叉树)vtvt和节点t相关联的特征,i2t^it2^是节点t分裂之后平方损失的减少值。 GBDT主要是利用残差逼近的方式,这就意味每棵树的值是连续的可叠加的,这一点和回归树输出连续值不谋而合,如果采用分类树,那么残差逼近进行叠加就会使得这种叠加没有意义,比如男+男+女=到底是男是女。这个是GBDT基本原理决定的。 对于机器学习来说,泛化误差可以理解为两部分,分别是偏差(bias)和方差(variance);偏差指的是算法的期望预测与真实预测之间的偏差程度,反应了模型本身的拟合能力;方差度量了同等大小的训练集的变动导致学习性能的变化,刻画了数据扰动所导致的影响。当模型越复杂时,拟合的程度就越高,模型的训练偏差就越小;但此时如果换一组数据可能模型的变化就会很大,即模型的方差很大,所以模型过于复杂的时候会导致过拟合。对于RF来说由于并行训练很多不同的分类器的目的就是降低这个方差(variance)。所以对于每个基分类器来说,目标就是如何降低这个偏差(bias),所以我们会采用深度很深甚至不剪枝的决策树。而对于GBDT来说由于利用的是残差逼近的方式,即在上一轮的基础上更加拟合原数据,所以可以保证偏差(bias),所以对于每个基分类器来说,问题就在于如何选择 variance 更小的分类器,即更简单的分类器,所以我们选择了深度很浅的决策树。 1、计算每个样本的负梯度; 相同点: 在讲两者的区别时,我们首先要知道XGBoost针对GBDT做了那些改进,首先,XGBoost在计算损失函数的时候,针对损失函数做了一次二阶泰勒展开,具体如下: L(y,ft(x))=L(y,ft−1(x)+ht(x))≃L(y,ft−1(x))+[∂L(y,ft−1(x))∂ft−1(x)]ht(x)+12[∂2L(y,ft−1(x))∂2ft−1(x)]h2t(x)L(y,ft(x))=L(y,ft−1(x)+ht(x))≃L(y,ft−1(x))+[∂L(y,ft−1(x))∂ft−1(x)]ht(x)+12[∂2L(y,ft−1(x))∂2ft−1(x)]ht2(x) 令g(x)=∂L(y,ft−1(x))∂ft−1(x)g(x)=∂L(y,ft−1(x))∂ft−1(x) , h(x)=∂2L(y,ft−1(x))∂2ft−1(x)h(x)=∂2L(y,ft−1(x))∂2ft−1(x) 那么: L(y,ft(x))≃L(y,ft−1(x))+g(x)ht(x)+h(x)h2t(x)L(y,ft(x))≃L(y,ft−1(x))+g(x)ht(x)+h(x)ht2(x) 从上式可以看出,因为L(y,ft−1(x))L(y,ft−1(x))是前一次迭代最小损失,对于本次迭代而言,主要是对: L̃ =g(x)ht(x)+h(x)h2t(x)L~=g(x)ht(x)+h(x)ht2(x) 进行拟合,以达到最小损失的结果,如果加入正则化项那么: L̃ =g(x)ht(x)+h(x)h2t(x)+Ω(ht(x))L~=g(x)ht(x)+h(x)ht2(x)+Ω(ht(x)) 其中 Ω(ht(x))=ηht(x)+12λ∑j=1Jw2tjΩ(ht(x))=ηht(x)+12λ∑j=1Jwtj2 是正则化项,在这里我们可以将ht(x)ht(x)理解成树,它是关于wtjwtj的函数,wtjwtj是参数(权重),通过L̃ L~对wtjwtj求导可以解出wtjwtj。那么节点是如何分裂的呢?有两种办法: 实际上对损失函数的优化就是对第t棵树结构进行分裂,启发式的找到最优树结构的过程。而每次分裂,对应于将属于一个叶结点(初始情况下只有一个叶结点,即根结点)下的训练样本分配到分裂出的两个新叶结点上,每个叶结点上的训练样本都会对应一个模型学出的概率值,而损失函数本身满足样本之间的累加特性,所以,可以通过将分裂前的叶结点上样本的损失函数和与分裂之后的两个新叶结点上的样本的损失函数之和进行对比,从而找到可用的分裂特征以及特征分裂点。 XGBoost的创新 【问】xgboost/gbdt在调参时为什么树的深度很少就能达到很高的精度? 模型复杂度与偏差方差的关系图 也就是说,当我们训练一个模型时,偏差和方差都得照顾到,漏掉一个都不行。 boost的核心思想不同于bagging,它在基于样本预测结果对照与真实值得差距,进行修正,再预测再修正,逐步靠近正确值。 我对adaboost和gbdt了解的也不算很全面:大概的梳理如下: 亮点: https://www.cnblogs.com/zuochongyan/p/5407053.html 如何判断函数凸或非凸?什么是凸优化? 如何解决类别不平衡问题? 解释对偶的概念。 如何进行特征选择? 为什么会产生过拟合,有哪些方法可以预防或克服过拟合? 什么是偏差与方差? 神经网络的原理,如何进行训练 介绍卷积神经网络,和 DBN 有什么区别 采用 EM 算法求解的模型有哪些,为什么不用牛顿法或梯度下降法 用 EM 算法推导解释 Kmeans 用过哪些聚类算法,解释密度聚类算法。 聚类算法中的距离度量有哪些? 解释贝叶斯公式和朴素贝叶斯分类 L1和L2正则化的作用,解释 TF-IDF是什么 文本中的余弦距离是什么,有哪些作用决策树处理缺失值
随机森林,GBDT,XGBoost的对比
1)决策树相当于一个大师,通过自己在数据集中学到的知识对于新的数据进行分类。但是俗话说得好,一个诸葛亮,玩不过三个臭皮匠。随机森林就是希望构建多个臭皮匠,希望最终的分类效果能够超过单个大师的一种算法。
第一,从原始的数据集中采取有放回的抽样,构造子数据集,子数据集的数据量是和原始数据集相同的。不同子数据集的元素可以重复,同一个子数据集中的元素也可以重复。
第二,利用子数据集来构建子决策树,将这个数据放到每个子决策树中,每个子决策树输出一个结果。最后,如果有了新的数据需要通过随机森林得到分类结果,就可以通过对子决策树的判断结果的投票,得到随机森林的输出结果了。如下图,假设随机森林中有3棵子决策树,2棵子树的分类结果是A类,1棵子树的分类结果是B类,那么随机森林的分类结果就是A类。
与数据集的随机选取类似,随机森林中的子树的每一个分裂过程并未用到所有的待选特征,而是从所有的待选特征中随机选取一定的特征,之后再在随机选取的特征中选取最优的特征。这样能够使得随机森林中的决策树都能够彼此不同,提升系统的多样性,从而提升分类性能。
Bootstrap是一种有放回的抽样方法思想。
虽然都是有放回的抽样,但二者的区别在于:Bagging采用有放回的均匀取样,而Boosting根据错误率来取样(Boosting初始化时对每一个训练例赋相等的权重1/n,然后用该学算法对训练集训练t轮,每次训练后,对训练失败的训练例赋以较大的权重),因此Boosting的分类精度要优于Bagging。Bagging的训练集的选择是随机的,各轮训练集之间相互独立,而Boostlng的各轮训练集的选择与前面各轮的学习结果有关。
Boost是"提升"的意思,一般Boosting算法都是一个迭代的过程,每一次新的训练都是为了改进上一次的结果。
对于分类任务,随机森林是多数表决;
对于回归任务,随机森林是简单平均
首先说下信息增益的过程,决策树算法本质上就是要找出每一列的最佳划分以及不同列划分的先后顺序及排布。信息增益的缺点是比较偏向选择取值多的属性。而gini系数每次都是二分,所以跟属性多少没有关系。
叶子的深度 3~8
学习速率 0.01~1
叶子上最大节点树 20
训练采样比例 0.5~1
训练特征采样比例 (n−−√n)
GBDT的优势:
能处理非线性数据
能处理多特征类型
适合低维稠密数据
模型可解释性好
不需要做特征的归一化,可以自动选择特征
能适应多种损失函数
GBDT的劣势:
计算复杂度高
不适用高维稀疏特征
RF和GBDT的比较
相同点:
最终的结果都是由多棵树一起决定
不同点:
组成随机森林的树可以并行生成;而GBDT只能是串行生成
对于最终的输出结果而言,随机森林采用多数投票等;而GBDT则是将所有结果累加起来,或者加权累加起来
随机森林对异常值不敏感,GBDT对异常值非常敏感,RF对异常值不敏感,原因是多棵树表决,而GBDT对异常值比较敏感,原因是当前的错误会延续给下一棵树。
随机森林对训练集一视同仁,GBDT是基于权值的弱分类器的集成
随机森林是通过减少模型方差提高性能,GBDT是通过减少模型偏差提高性能
XgBoost:
简单来说xgBoost是GBDT的一种高效实现,主要具有以下几个优势
公式推导中用到了二阶导数,用了二阶泰勒展开。
实现了分裂点寻找近似算法。
可以并行执行
1.xgboost在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。从Bias-variance tradeoff角度来讲,正则项降低了模型variance,使学习出来的模型更加简单,防止过拟合.GBDT如何正则化
GBDT分裂规则
GBDT的“梯度提升”体现在那个阶段
GBDT如何做特征选择
GBDT为什么使用cart回归树而不是使用分类树
为什么GBDT的树深度较RF通常都比较浅
GBDT那些部分可以并行
2、分裂挑选最佳特征及其分割点时,对特征计算相应的误差及均值时;
3、更新每个样本的负梯度时;
4、最后预测过程中,每个样本将之前的所有树的结果累加的时候。GBDT与RF的区别
1、GBDT与RF都是采用多棵树组合作为最终结果;这是两者共同点。
不同点:
1、RF的树可以是回归树也可以是分类树,而GBDT只能是回归树。
2、RF中树是独立的,相互之间不影响,可以并行;而GBDT树之间有依赖,是串行。
3、RF最终的结果是有多棵树表决决定,而GBDT是有多棵树叠加组合最终的结果。
4、RF对异常值不敏感,原因是多棵树表决,而GBDT对异常值比较敏感,原因是当前的错误会延续给下一棵树。
5、RF是通过减少模型的方差来提高性能,而GBDT是减少模型的偏差来提高性能的。(原理之前分析过)
6、RF不需要进行数据预处理,即特征归一化。而GBDT则需要进行特征归一化。GBDT与XGBoost的区别
GBDT以cart回归树作为基分类器,XGBoost还支持线性分类器,这个时候XGBoost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。
用xgboost/gbdt在在调参的时候把树的最大深度调成6就有很高的精度了。但是用DecisionTree/RandomForest的时候需要把树的深度调到15或更高。用RandomForest所需要的树的深度和DecisionTree一样我能理解,因为它是用bagging的方法把DecisionTree组合在一起,相当于做了多次DecisionTree一样。但是xgboost/gbdt仅仅用梯度上升法就能用6个节点的深度达到很高的预测精度,使我惊讶到怀疑它是黑科技了。请问下xgboost/gbdt是怎么做到的?它的节点和一般的DecisionTree不同吗?
【答】
这是一个非常好的问题,题主对各算法的学习非常细致透彻,问的问题也关系到这两个算法的本质。这个问题其实并不是一个很简单的问题,我尝试用我浅薄的机器学习知识对这个问题进行回答。
一句话的解释,来自周志华老师的机器学习教科书( 机器学习-周志华):Boosting主要关注降低偏差,因此Boosting能基于泛化性能相当弱的学习器构建出很强的集成;Bagging主要关注降低方差,因此它在不剪枝的决策树、神经网络等学习器上效用更为明显。
随机森林(random forest)和GBDT都是属于集成学习(ensemble learning)的范畴。集成学习下有两个重要的策略Bagging和Boosting。
Bagging算法是这样做的:每个分类器都随机从原样本中做有放回的采样,然后分别在这些采样后的样本上训练分类器,然后再把这些分类器组合起来。简单的多数投票一般就可以。其代表算法是随机森林。Boosting的意思是这样,他通过迭代地训练一系列的分类器,每个分类器采用的样本分布都和上一轮的学习结果有关。其代表算法是AdaBoost, GBDT。
其实就机器学习算法来说,其泛化误差可以分解为两部分,偏差(bias)和方差(variance)。这个可由下图的式子导出(这里用到了概率论公式D(X)=E(X^2)-[E(X)]^2)。偏差指的是算法的期望预测与真实预测之间的偏差程度,反应了模型本身的拟合能力;方差度量了同等大小的训练集的变动导致学习性能的变化,刻画了数据扰动所导致的影响。这个有点儿绕,不过你一定知道过拟合。
如下图所示,当模型越复杂时,拟合的程度就越高,模型的训练偏差就越小。但此时如果换一组数据可能模型的变化就会很大,即模型的方差很大。所以模型过于复杂的时候会导致过拟合。
当模型越简单时,即使我们再换一组数据,最后得出的学习器和之前的学习器的差别就不那么大,模型的方差很小。还是因为模型简单,所以偏差会很大。
对于Bagging算法来说,由于我们会并行地训练很多不同的分类器的目的就是降低这个方差(variance) ,因为采用了相互独立的基分类器多了以后,h的值自然就会靠近.所以对于每个基分类器来说,目标就是如何降低这个偏差(bias),所以我们会采用深度很深甚至不剪枝的决策树。
对于Boosting来说,每一步我们都会在上一轮的基础上更加拟合原数据,所以可以保证偏差(bias),所以对于每个基分类器来说,问题就在于如何选择variance更小的分类器,即更简单的分类器,所以我们选择了深度很浅的决策树。
不足:
1.adaboost存在异常点敏感的问题
2.gbdt一定程度上优化了adaboost异常点敏感的问题,但是存在难以并行的缺点
3.两者的目标都是优化bias,必然导致训练出来的数据var的不稳定
1.发现非线性的特征关系,网格化的切分feature
2.拟合的效果相较于其他分类器更加精准,且训练参数较少