这些算法中有着千丝万缕的联系

说明:
(部分文字来自网络,由于是之前记的笔记,忘记来源了,特此向作者抱歉)

Bootstraping

Bootstraping: 名字来自成语“pull up by your own bootstraps”,意思是依靠你自己的资源,称为自助法,它是一种有放回的抽样方法,

boostraping 不是一种机器学习的算法,而是一种自助采样的算法。是生成一系列 boostrap伪样本,每一个样本是初始数据有放回的抽样。
用小样本数据集估计整体的非参数的方法。初始样本足够大的情况下,bootstrap抽样能够无偏得接近总体的分布。
  应该说Bootstrap是现代统计学较为流行的一种统计方法,在小样本时效果很好。通过方差的估计可以构造置信区间等,其运用范围得到进一步延伸。

Bootstraping思想的一种应用。

下面的常见的算法都是Boostraping方法的应用。

Bagging

bagging:bootstrap aggregating的缩写。aggregate:聚集,聚合的意思。

让该学习算法训练多轮,每轮的训练集由从初始的训练集中随机取出的n个训练样本组成,某个初始训练样本在某轮训练集中可以出现多次或根本不出现,训练之后可得到一个预测函数序列h_1,_n ,最终的预测函数H对分类问题采用投票方式,对回归问题采用简单平均方法对新示例进行判别。

Boosting

boosting属于一种算法框架,它会产生一系列对的分类器,然后对这些算法进行加权融合。虽然单个分类器的分类效果不好,但是经过多个基分类器的结果融合,可以获得更高的准确率。
Boosting算法比较常见的主要有:AdaBoost
Adaboost是Adaptive boosting的缩写。意思是自适应增强
其具体做法是:
对于一个数据集,先用任一弱分类算法训练得到一弱分类器,根据对训练集分对分错情况,对训练集样本分配权重,分错的样本权重更高。根据这个权重对训练集进行挑选得到新的训练集,权重大的样本更可能被选到,以此来侧重对于之前分错的样本的训练,得到第二个分类器。以此类推,不断训练多个基分类器,最后根据各个基分类器的准确率赋予分类器权重。当需要判别时,加权投票得最终判断结果
(类似Bagging方法,但是训练是串行进行的,第k个分类器训练时关注对前k-1分类器中错分的文档,即不是随机取,而是加大取这些文档的概率。)

Bagging与Boosting的区别:

Bagging算法的训练集往往是从原始数据集中有放回的抽样得到的(原数据集的一部分),每个基分类器是相互独立的、并列的。因为每个基分类器训练方法独立且相同,最后分类器进行等权重投票
而在boosting算法中,基分类器是依次训练的,因为分错的点在接下来的训练时权重被增加,也就是说,每个基分类器的训练都是建立在之前基分类器的表现基础之上的。最后分类器加权投票

bagging和boosting都可以有效地提高分类的准确性。在大多数数据集中,boosting的准确性比bagging高。在有些数据集中,boosting会引起退化--- Overfit。
Boosting思想的一种改进型AdaBoost方法在邮件过滤、文本分类方面都有很好的性能。

Gradient Boosting

gradient boosting(又叫Mart, Treenet):Boosting是一种思想,Gradient Boosting是一种实现Boosting的方法,它主要的思想是,每一次建立模型是在之前建立模型损失函数的梯度下降方向。也可以说Gradient Boost的没一次计算是为了减少上一次的残差,而为了消除残差可以在残差减少的梯度方向上建立一个新的模型。

损失函数(loss function)描述的是模型的不靠谱程度,损失函数越大,则说明模型越容易出错。如果我们的模型能够让损失函数持续的下降,则说明我们的模型在不停的改进,而最好的方式就是让损失函数在其梯度(Gradient)的方向上下降。

Gradient Boost 其实是一个框架,里面可以套入很多不同的算法。这里比较常见的是GBDT

GBDT :Gradient Boosting Decision Tree

Gradient Boost 是一个残差迭代树,认为每一课树都在学习前N-1颗树的残差,每一棵回归树在学习前N-1颗书的梯度下降值。

Random Forest

Rand forest: 随机森林,顾名思义,是用随机的方式建立一个森林,森林里面有很多的决策树组成,随机森林的每一棵决策树之间是没有关联的。
在得到森林之后,当有一个新的输入样本进入的时候,就让森林中的每一棵决策树分别进行一下判断,看看这个样本应该属于哪一类(对于分类算法),然后看看哪一类被选择最多,就预测这个样本为那一类。
随机森林的每棵树训练过程,主要是两大点,采样和全分裂。
随机森林的采样又包括行采样和列采样,对于行采样是采取有放回的采样,采样的个数等于样本总个数,列采样是随机的采样,对于列采样的个数n1是要小于总列数n(特征数)的。
之后就是对采样之后的数据使用完全分裂的方式建立出决策树,这样决策树的某一个叶子节点要么是无法继续分裂的,要么里面的所有样本的都是指向的同一个分类。
一般很多的决策树算法都一个重要的步骤 - 剪枝,但是这里不这样干,由于之前的两个随机采样的过程保证了随机性,所以就算不剪枝,也不会出现over-fitting。

Random forest与bagging的区

  • Randon forest是选与输入样本的数目相同多的次数(可能一个样本会被选取多次,同时也会造成一些样本不会被选取到),而bagging一般选取比输入样本的数目少的样本;
  • bagging是用全部特征来得到分类器,而random forest是需要从全部特征中选取其中的一部分来训练得到分类器; 一般Rand forest效果比bagging效果好!

Xgboost算法

Xgboost 是Gradient boosting 的一种比较高效的实现。

xgboost算法的步骤和GB基本相同,都是首先初始化为一个常数,gb是根据一阶导数ri,xgboost是根据一阶导数gi和二阶导数hi,迭代生成基学习器,相加更新学习器。
xgboost与gdbt除了上述三点的不同,xgboost在实现时还做了许多优化:

1、在寻找最佳分割点时,考虑传统的枚举每个特征的所有可能分割点的贪心法效率太低,xgboost实现了一种近似的算法。大致的思想是根据百分位法列举几个可能成为分割点的候选者,然后从候选者中根据上面求分割点的公式计算找出最佳的分割点。
2、xgboost考虑了训练数据为稀疏值的情况,可以为缺失值或者指定的值指定分支的默认方向,这能大大提升算法的效率,paper提到50倍。
特征列排序后以块的形式存储在内存中,在迭代中可以重复使用;虽然boosting算法迭代必须串行,但是在处理每个特征列时可以做到并行。
按照特征列方式存储能优化寻找最佳的分割点,但是当以行计算梯度数据时会导致内存的不连续访问,严重时会导致cache miss,降低算法效率。paper中提到,可先将数据收集到线程内部的buffer,然后再计算,提高算法的效率。
3、xgboost 还考虑了当数据量比较大,内存不够时怎么有效的使用磁盘,主要是结合多线程、数据压缩、分片的方法,尽可能的提高算法的效率。

  • xgboost在目标函数中显示的加上了正则化项,基学习为CART时,正则化项与树的叶子节点的数量T和叶子节点的值有关。
  • GB中使用Loss Function对f(x)的一阶导数计算出伪残差用于学习生成fm(x),xgboost不仅使用到了一阶导数,还使用二阶导数。
  • 上面提到CART回归树中寻找最佳分割点的衡量标准是最小化均方差,xgboost寻找分割点的标准是最大化,lamda,gama与正则化项相关。

xgboost 优于GBDT的地方:
二阶泰勒展开 、节点分数惩罚 、增益计算不同,gbdt是gini,xgb是优化推导公式

你可能感兴趣的:(这些算法中有着千丝万缕的联系)