集成学习的主要思路是先通过一定的规则生成多个学习器,然后用某种特定的规则,将多个学习器进行组合,综合判断输出结果。
很容易得知,除非对所有可能的数据进行训练,否则总会存在多个假设使得错误率不为0,也就是说学习器不能保证和目标函数完全一致,且由于样本是随机选择的,总存在一定的偶然性,使得学习器学习到的与真实分布不同.
因此我们只要求学习学习到一个近似正确的假设,即PAC学习:
在PAC学习框架中,
一个概念如果存在一个多项式的学习算法能够学习它,并且正确率很高,那么就称这个概念是强可学习的.
一个概念如果存在一个多项式的学习算法能够学习它,学习的正确率只比随机猜测略好,则称这个概念是弱可学习的.
理论证明强可学习和弱可学习是等价的,即在PAC学习框架下,一个概念是强可学习的充分必要条件是这个概念是弱可学习的.
AdaBoost、RF、GBDT、XGBoost、LightGBM、CatBoost等.
对一某一问题,发现一个弱学习方法要比强学习方法容易的多,通过弱学习方法训练多个弱分类器,组合这些弱分类器构成一个强分类器.
如何训练多个弱分类器以及如何组合多个弱分类器是集成方法的关键,训练多个弱分类器常用的方法有boosting、bagging.
Boosting从原始训练数据出发,通过调整训练数据的概率分布(权值分布)来生成多个子分类器,多个子分类器的产生是有序的,即一个分类器依赖于前一个分类器,并且着重关注于前一个分类器误分类的样本(提升错误分类样本的权重).
由于新的分类器重点关注错误分类的样本,生成新的分类器的过程中在不断地降低误差,从而降低整个模型的偏差.
经典的boost方法如Adaboost
在原有的规模为n的训练数据集上有放回地随机选取n个数据.
核心思想在于,给定训练集,当你认为给定的训练集太少,不能够很好地反应数据的真实分布时,可以采用重采样的方法,来增大样本.
在原有的训练数据集 D D D上,采用bootstrap的方法选取 m m m个独立的训练集分别训练 m m m个分类器/回归,然后组合成最终的分类器/回归.
训练多个分类器Bagging的方法能够提升不稳定分类器的识别准确率,因为它有效地平均了多个分类器之间的不稳定性,因此常说Bagging的方法能够降低方差.
平均和加权平均,将多个分类器进行线性组合,权重的设置可以有多种不同的策略,如Adaboost中权重计算.
分类问题中,通常多个分类器进行投票,决定最终输出.
stacking的本质是一个分层结构,若在第二层中训练多个模型,则可以进一步进行第三层的模型训练.
对于单个模型,首先进行交叉验证,将每一个Fold的验证集的预测组合成一个新的训练集,每一个Fold的模型对测试集进行预测,将所有Fold的测试集的预测结果取平均得到新的测试集. 多个模型将会产生多个训练集和测试集,将多个模型的预测结果看作是不同的特征,第二层模型则从这些特征上进行训练.
图来源于知乎Kaggle机器学习之模型融合(stacking)心得
blending与staking思路类似,区别在于blending不是通过交叉验证来产生新的数据集,而是直接对原始数据集进行划分,用不相交的数据集训练多个模型,并将模型的预测作为下一层的特征.
随机森林本质上是bagging方法与特征子空间的一种结合,所谓随机表现在两方面:
对不同数据集进行不同的特征选取,根据决策树算法(ID3、C4.5、CART)生成多个决策树,进行vote.
Extra Trees是RF的变种,区别在于:
显然,由于分裂时不是根据最优特征进行分裂,那么决策树的规模自然会超过RF中的决策树,但同时也会带来方差的降低.
参数 | 类型 | 默认值 | 作用 |
---|---|---|---|
n_estimators | int | 10 | 树的棵树 |
criterion | str | ‘gini’ | 分裂算法 |
max_depth | int or None | None | 决策树最大深度 |
min_samples_split | int or float | 2 | 分裂时最小样本数 |
min_samples_leaf | int or float | 1 | 叶节点最小样本数 |
min_weight_fraction_leaf | float | 0 | 叶节点最小样本权重总值 |
max_features | int float str None | ‘auto’ | 切分时最大的特征数量 |
max_leaf_nodes | int or None | None | 最大叶节点个数 |
min_impurity_decrease | float | 0. | 切分点不纯度最小减少程度,若节点不纯度小于该值,则被移除 |
bootstrap | boolean | True | 是否bootstrap |
oob_score | boolean | False | 是否用未采样的数据来验证模型得分 |
n_jobs | int or None | None | 并行数, -1为适用所有进程, 即与内核数相同, None为1 |
random_state | int or None | None | 随机种子 |
verbose | int | 0 | 日志输出间隔 |
warm_start | boolean | False | 是否热启动,对上一个模型采用追加的方式 |
Bagging与随机森林算法原理小结