笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值,找寻数据的秘密,笔者认为,数据的价值不仅仅只体现在企业中,个人也可以体会到数据的魅力,用技术力量探索行为密码,让大数据助跑每一个人,欢迎直筒们关注我的公众号,大家一起讨论数据中的那些有趣的事情。
我的公众号为:livandata
Ø 集成算法分为:
Ø bagging算法(套袋法):
从原始样本集中使用随机抽样方法有放回的抽取n个训练样本,共进行k轮抽取,得到k个训练集(独立且等量);
对于k个训练集,训练k个模型,具体的模型视具体情况而定(可以是knn、决策树等);
通过对训练样本重新采样的方法得到不同的训练样本集,在这些新的训练样本集上分别训练学习器,最终合并每一个学习器的结果,作为最终的学习结果,Bagging方法的具体过程如下图所示:
在Bagging方法中,最重要的算法为随机森林Random Forest算法。由以上的图中可以看出,在Bagging方法中,b 个学习器之间彼此是相互独立的,这样的特点使得Bagging方法更容易并行。
Ø bagging+决策树=随机森林;
常用的Bagging方法为——随机森林:
Ø 假设有N个样本,有放回的取样,构建子决策树;
Ø 每个样本有M个属性,随机选取一部分属性,作为决策树的分枝属性;
Ø 对于单个决策树模型,假设训练样本特征的个数为n,那么每次分裂时根据信息增益/信息增益比/基尼指数等进行分裂;
Ø 每棵树都这样分裂,直到所有样本都属于同一类;
Ø 将多个树组合成随机森林。对于分类问题,按照多棵树分类器投票决定最终分类结果;对于回归问题,由多棵树预测值的均值决定最终预测结果;
优点:
准确度高、抗噪能力强、能处理高纬度、容易并行化;
缺点:
训练时间、空间较多,随机森林类似于黑盒测试;
Ø Boosting算法(提升法):
对训练集中的每个样本建立权值w,表示对每个样本的关注度,当某个样本被误分类的概率很高时,需要加大对该样本的权值;
进行迭代的过程中,每一步迭代都是一个弱分类器,需要用某种策略将其组合,作为最终模型;
学习器之间是存在先后顺序的,同时,每一个样本是有权重的,初始时,每一个样本的权重是相等的。首先,第1个学习器对训练样本进行学习,当学习完成后,增大错误样本的权重,同时减小正确样本的权重,再利用第2个学习器对其进行学习,依次进行下去,最终得到b个学习器,最终,合并这b个学习器的结果,同时,与Bagging中不同的是,每一个学习器的权重也是不一样的。Boosting方法的具体过程如下图所示:
在Boosting方法中,最重要的方法包括:AdaBoost和GBDT。
Ø AdaBoost+决策树=提升树;
Ø Gradient Boosting+决策树=GBDT;
首先介绍一下GDBT:
GBDT的具体步骤为:
其次介绍一下AdaBoost:
ü 权重D(t)是指m个样本的权重,共m个;
ü 共循环T次,共有T组;
最后比较一下XGBoost:
xgboost算法的步骤和GB基本相同,都是首先初始化为一个常数,gb是根据一阶导数ri,xgboost是根据一阶导数gi和二阶导数hi,迭代生成基学习器,相加更新学习器。
xgboost的优势:
Ø 正则化
标准GBM的实现没有像XGBoost这样的正则化步骤。正则化对减少过拟合也是有帮助的。
实际上,XGBoost以“正则化提升(regularized boosting)”技术而闻名。
Ø 并行处理
XGBoost可以实现并行处理,相比GBM有了速度的飞跃,LightGBM也是微软最新推出的一个速度提升的算法。 XGBoost也支持Hadoop实现。
Ø 高度的灵活性
XGBoost 允许用户定义自定义优化目标和评价标准。
Ø 缺失值处理
XGBoost内置处理缺失值的规则。用户需要提供一个和其它样本不同的值,然后把它作为一个参数传进去,以此来作为缺失值的取值。XGBoost在不同节点遇到缺失值时采用不同的处理方法,并且会学习未来遇到缺失值时的处理方法。
Ø 剪枝
当分裂时遇到一个负损失时,GBM会停止分裂。因此GBM实际上是一个贪心算法。XGBoost会一直分裂到指定的最大深度(max_depth),然后回过头来剪枝。如果某个节点之后不再有正值,它会去除这个分裂。
这种做法的优点,当一个负损失(如-2)后面有个正损失(如+10)的时候,就显现出来了。GBM会在-2处停下来,因为它遇到了一个负值。但是XGBoost会继续分裂,然后发现这两个分裂综合起来会得到+8,因此会保留这两个分裂。
Ø 内置交叉验证
XGBoost允许在每一轮boosting迭代中使用交叉验证。因此,可以方便地获得最优boosting迭代次数。
而GBM使用网格搜索,只能检测有限个值。
Ø 在已有的模型基础上继续
XGBoost可以在上一轮的结果上继续训练。
sklearn中的GBM的实现也有这个功能,两种算法在这一点上是一致的。