参考:https://www.cnblogs.com/pinard/p/6131423.html
集成学习
集成学习面对的是一个强学习器,由多个个题学习器,通过一定的策略组合而成。
个体学习器
分为两种:
- 同质学习器(同类算法得到的模型)
通常使用CART决策树和神经网络等,根据模型之间的关联强度分为两种:- 强关联
串行,例子boosting - 弱关联
并行,例子bagging和随机森林
- 强关联
- 异质学习器(不同类算法得到的模型)
boosting
训练步骤:
- 一个样本集m,m样本集具有初始权重D(1),
- 在此基础上训练得到弱学习器L1,
- 根据弱学习器L1的学习误差率(e)更新训练样本权重为D(2),此时的样本权重D(2)应当关注于训练出错的样本点
- 重复123,直到获取到 T个弱学习器
- 按照一定策略组合T个弱学习器为一个强学习器。
所有的boosting算法都需要解决的问题包括:(参考:https://www.cnblogs.com/pinard/p/6133937.html 包含了具体的公式)- 计算学习误差率e
- 计算弱学习器权重系数alpha
- 更新样本权重D
- 采取何种策略
-
adaboost
参考:https://www.cnblogs.com/pinard/p/6133937.html
对于任何学习器都可以使用在adaboost上,但adaboost通常挑选了CART决策树,用于分类和回归问题,分别选择CART分类和CART回归。
为了解决上述问题,在每一步中给出了adaboost解决的公式,看原文公式即可。
另外加入了正则化项,只在原有公式上加入了参数v,通常成为步长。通过对补偿和弱学习器的迭代次数来共同决定算法的拟合程度。 -
优缺点
1.分类精度高. 2.在adaboost框架下,可以使用各种回归分类模型来构建学习器. 3.作为简单的二元分类器,可读性强. 4.不容易发生过拟合.
-1.由于串行的弱学习器,更新权重的初衷为提高上一轮分类误差率大的样本点,而异常样本分错概率较高,故adaboost对异常样本比较敏感。 -
提升树(boosting tree)[待补充]
-
梯度提升树(gradient boosting tree)
参考:https://www.cnblogs.com/pinard/p/6140514.html
GBDT很重要,别名有GBT(Gradient Boosting Tree),GTB(Gradient Tree Boosting),GBRT(Gradient Boosting Regression Tree),MART(Multiple Additive Regression Tree)
GBDT和adaboost相比,也是迭代,使用了前向分布算法,迭代思路不同于adaboost。
GBDT可用于分类和回归。区别仅在于损失函数不同导致了负梯度不同。
可以选择很多损失函数,分类和回归使用不同的损失函数,分类主要分为对数损失函数和指数损失函数;回归主要有均方差,绝对损失,huber损失,分位数损失。
和adaboost一样,也需要加入正则化,不过有三种方式,一种和adaboost相同,控制步长;2.无放回的自采样,取值为(0,1],推荐[0.5,0.8]之间(当使用了自采样的样本之后,可以将采样样本分发出去,类似于bagging,最后形成新的树,可以部分并行计算);3.对弱学习器中的CART树做剪枝。
GBDT好用的库是xgboost,scikit-learn。 -
优缺点
g1. 可以灵活处理各种类型的数据,包括离散值和连续值。
g2. 调参时间较少,相对于SVM来说。
g3. 健壮的损失函数对于异常值的鲁棒性比较好,比如huber和quantile。
b1. 由于boosting的限制,不可以并行,但可以自采样(SGBT),达到部分并行。
bagging
bagging可以用于二分类,多分类,回归。bagging主要关注于降低方差。
- 一个样本集m,进行T次随机采样(boostrap sampling,有放回采样)
- 对T个随机采样的样本集分别训练,得到T个弱学习器
- 按照一定策略组合T个弱学习器为一个强学习器。
结合策略
- 平均法
数值回归预测问题:对T个学习器的结果做(加权)平均。 - 投票法
分类问题:1.少数服从多数 2.在1的基础上过半数,否则拒识 3.加权投票 - 学习法
代表:stacking。使用T个学习器(初级学习器)的输出作为输入,再加一层学习器进行训练。预测时先使用初级学习器预测得到T个结果,再输入到次级学习器(后加的学习器)进行预测得到结果。
随机森林思想
参考: https://blog.csdn.net/qingqingpiaoguo/article/details/53435417
https://blog.csdn.net/yingfengfeixiang/article/details/80210145
随机森林的集成学习方法是上述的bagging。随机森林利用随机的方式将多个决策树组合成一个森林,每个决策树在分类的时候投票共同绝对测试样本的最终结果。
主要包括:
- 样本随机选择
在样本集M上有放回地构建样本 - 特征随机选择
计算特征的ID3或者C4.5,选择一个最大增益的特征作为划分下一个子节点走向的特征。(选择特征为无放回的,即每个特征只选择一次) - 构建一颗决策树
- 重复上述三步,构建H次即得到H棵决策树。对一个测试样本做H次预测,得到H个结果,对H个结果做某种组合,得到最终分类结果。
随机森林的推广
- extra tree
extra tree是rf(random forest)的一个变种,区别在于:
- rf是使用bootstrap有放回地采样构建样本集;extra tree一般采用的是原时训练集。
- rf决策树是通过信息增益,基尼系数,均方差等原则选择一个最有的特征值作为划分点;extra tree是随机选择一个特征值来划分决策树。
由于以上特性,导致extra tree的规模回避rf生成的决策树规模大,
随机森林的优缺点
- 优点
g1. 能够处理高纬度数据并且不需要做特征选择
g2. 由于每次都选择不同的测试集,一定程度上避免了过拟合。
g3. 解决分类和回归问题,由于是集成学习,方差和偏差都比较低,泛化能力强。
g4. 对数据缺失,数据不平衡有较好的应对。
g5. 高度并行化,易于分布式实现。
g6. 由于树形结构,不需要归一化。 - 缺点
b1. 在噪音大的分类或回归问题上过拟合。[不是很清晰]
b2. 对于不同级别的属性的数据,级别划分多的属性会对随机森林会产生更多的影响,所以在这种情况下不可信。[不是很清晰]
b3. 忽略了属性间的相关性。
b4. 分类问题上的表现优于回归。
调参basic
总体上说,由于boosting各个弱学习器串行,而bagging并行,参数之间没有关系,基于bagging的调参要相对容易一些,在时间方面也要少。
AdaBoost
boosting框架参数
- base_estimator(共有): AdaBoostClassifier和AdaBoostRegressor都有,通常为CART决策树或者伸进网络,默认为决策树。
- algorithm(AdaBoostClassifier): 默认为SAMME.R,速度会更快,但base_estimator必须使用支持概率预测的分类器;可以选择SAMME,没有对base_estimator的限制。
- loss(AdaBoostRegressor) : 默认为linear,可选"square",“exponential”,通常线性足够了,看原文有关于三种误差率的计算公式。
- n_estimators(共有):最大迭代次数,默认值为50.
- learning_rate(共有):每个弱学习器的权重缩减系数v。
adaboost在sklearn中的参数
参考:https://www.cnblogs.com/pinard/p/6136914.html
调参分为两大类,以为adaboost的框架(boosting)参数,以及选择的弱分类器参数。在sklearn中体现为AdaBoostClassifier和AdaBoostRegressor。前者为分类算法,使用了SAMME和SAMME.R,后者为回归算法,使用了Adaboost.R2.
弱学习器的参数会根据使用的弱学习器的不同而变化。默认为决策树弱学习器。参数见rf参数。在本链接中包含了实战代码。https://www.cnblogs.com/pinard/p/6136914.html
bagging框架参数
主要需要关注的参数是n_estimators
- n_estimators: 弱学习器的最大迭代次数,或者说是最大的弱学习器个数,过少容易欠拟合,过多提升很小。通常默认100。
- oob_score: 是否采用袋外样本做评估模型的好坏。默认为Fasle,推荐设置为True。
- criterion: CART树做划分时对特征的评价标准。对于分类问题,默认基尼系数gini,可选信息增益;对于回归问题,默认均方差mse,可选绝对插值mae。
gdbt 在sklearn中的参数
参考: https://www.cnblogs.com/pinard/p/6143927.html
- n_estimators 弱学习器的zui’da’die最大迭代次数
- learning_rate 不擦汗给你
- subsample 取值为(0,1],但推荐[0.5,0,8],默认为1,即不采用自采样
4.init 没懂 - loss gdbt中提到的损失函数(http://www.cnblogs.com/pinard/p/6140514.html),具体区别看当前博客
gdbt弱学习器参数
采用了rf中的CART树。
rf参数
参考:https://blog.csdn.net/Kaiyuan_sjtu/article/details/80173417
在bagging框架下完成的rf,主要包括两大类参数,bagging框架参数和CART决策树参数。
CART决策树的重要的参数包括: max_features, max_depth, min_samples_split, min_samples_leaf.
- max_features: 决策树划分时最大特征数,默认为auto。当特征很多时,采用文中提到的技巧。
- max_depth: 决策树最大深度,数据或特征少的情况下,不需要修改。反之设置最大深度,具体取决于数据分布,常用10-100。
- min_samples_split: 内部节点再划分所需要的最小样本树,默认为2,如果特征或数据量很大,推荐增大该值。
- min_samples_leaf: 叶子节点最少样本树,如果叶子节点数目小于该值,则会被剪枝。默认为1,如果样本量很大,推荐增大该值。
- min_weight_fraction_leaf: 叶子节点所有样本的权重和的最小样本值,当某个节点下的所有叶子节点的权重和小于该值,则会被剪枝。默认为0,当有较多样本缺失值时,引入样本权重,则需要注意改值,可以有效去除缺失值的影响。
- max_leaf_nodes: 最大叶子节点数,可以防止过拟合,默认值为None,即不限制。当特征很多时,可以通过交叉验证获取该值。
- min_impurity_split: 最小不纯度,限制了决策树的增长,如果某个节点的不纯度小于该值,则不会继续生长。默认值为1e-7。
rf的方法函数
- apply(X) 预测
返回每棵树预测的叶子节点,结果为二维矩阵,行为样本的第几个样本,列为每棵树预测的叶子节点。 - decesion_path(X)
返回决策中的路劲 - fit(X,y[,sample_weight])
用训练数据来构造森林(训练) - get_params([deep])
获得分类器的参数 - predict(X)
预测X的类别 - predict_log_proba(X)
预测X的类别的概率,类似于predict_proba,多了一个对数。 - score(X,y[,sample_weight])
返回给定数据集的预测准确度。
还有常用属性以及titanic实列,参考链接https://blog.csdn.net/Kaiyuan_sjtu/article/details/80173417
应用场景
参考:https://blog.csdn.net/qq_39842017/article/details/88990831
金融风控,通过对获取到的用户特征建模,进行分类或回归预测,包括信用欺诈,违约概率,风险定价等。
解惑
- adaboost和gbdt在迭代思想上的区别
参考:https://blog.csdn.net/chengfulukou/article/details/76906710
adaboost和gdbt在迭代思想上的区别,adaboost通过对样本的权重进行调整,而gdbt通过改变损失函数。
几句话说完
分为两大阵营,boosting和bagging,前者是串行的弱学习器组成,后者是并行的弱学习器组成。
boosting的代表作有adaboost和gdbt,bagging的代表作有bagging+rf