首先来说一下集成学习。集成学习在学术界和工业界都有很高的热度,例如Kaggle竞赛中神挡杀神佛挡杀佛的XGBoost就是一个典型的例子。那么什么是集成学习?最通俗易懂的理解就是:"三个臭皮匠,顶个诸葛亮"。把"臭皮匠"组合起来,其决策能力可能超过"诸葛亮"。
根据其训练基学习器的特点将其分为2大类:Boosting和Bagging。
Boosting
Boosting采用串行的方式训练基学习器,各学习器之间相互依赖。与人类的学习过程类似,人们学习的时候总是不断犯错不断去更正,降低下次犯错的概率,Boosting也是Learn from your mistakes。
Bagging
Bagging的主要思想是:集体投票决策。Bagging各基学习器之间无强依赖,可以进行并行训练。随机森林(Random Forest)就是一种比较著名的以决策树为基学习器的Bagging算法。因为各个学习器之间无强依赖,所以在训练过程中,随机森林将训练集分为若干子集。
结合策略
有了基学习器,我们怎么进行组合呢?这就要说到结合策略了。主要是平均法,投票法和学习法三个结合策略。
平均法
对于数值类的回归预测问题,通常使用的结合策略是平均法,也就是说,对于若干个弱学习器的输出进行平均得到最终的预测输出。可以是一般的mean也可以加权平均。
投票法
对于分类问题的预测,我们通常使用的是投票法。最简单的投票法是相对多数投票法,即少数服从多数。绝对多数投票法稍微复杂一点,在相对多数投票法的基础上,还要求票过半数。否则会拒绝预测。更加复杂的是加权投票法,每个弱学习器的分类票数要乘以一个权重,最终将各个类别的加权票数求和,最大的值对应的类别为最终类别。
学习法
以上两种方法相对比较简单,但是可能学习误差较大。于是就有了学习法,典型代表就是stacking,当使用stacking结合策略时, 我们不是对弱学习器的结果做简单的逻辑处理,而是再加上一层学习器,也就是说,我们将训练集弱学习器的学习结果作为输入,将训练集的输出作为输出,重新训练一个学习器来得到最终结果。在这种情况下,我们将弱学习器称为初级学习器,将用于结合的学习器称为次级学习器。对于测试集,我们首先用初级学习器预测一次,得到次级学习器的输入样本,再用次级学习器预测一次,得到最终的预测结果。
随机森林
理解了bagging算法,随机森林(Random Forest)就好理解了。它是Bagging算法的进化版。首先,RF使用了CART决策树作为弱学习器。第二,在使用决策树的基础上,RF对决策树的建立做了改进,对于普通的决策树,我们会在节点上所有的n个样本特征中选择一个最优的特征来做决策树的左右子树划分,但是RF通过随机选择节点上的一部分样本特征,这个数字小于n,为m,然后在这些随机选择的m个样本特征中,选择一个最优的特征来做决策树的左右子树划分。这样进一步增强了模型的泛化能力。
由于RF在实际应用中的良好特性,基于RF,有很多变种算法,应用也很广泛,不光可以用于分类回归,还可以用于特征转换,异常点检测等。extra trees是RF的一个变种, 原理几乎和RF一模一样。仅有区别有:
- 对于每个决策树的训练集,RF采用的是随机采样bootstrap来选择采样集作为每个决策树的训练集,而extra trees一般不采用随机采样,即每个决策树采用原始训练集
- 在选定了划分特征后,RF的决策树会基于基尼系数,均方差之类的原则,选择一个最优的特征值划分点,这和传统的决策树相同。但是extra trees比较的激进,他会随机的选择一个特征值来划分决策树。因此在某些时候,extra trees的泛化能力比RF更好。
随机森林优缺点
- 优点
1、采用并行方法训练因此可以高度并行化,对于大数据的大样本训练速度有优势。
2、由于可以随机选择决策树节点划分特征,这样在样本特征维度很高的时候,仍然能高效的训练模型。
3、在训练后,可以给出各个特征对于输出的重要性。
4、由于采用了随机抽样,训练出来的模型的方差小,泛化能力强。
5、相对于Boosting系列的Adaboost和GBDT,RF实现比较简单。
6、对部分特征缺失不敏感。
- 缺点
1、在某些噪音比较大的样本集上,RF模型容易陷入过拟合。
2、取值划分比较多的特征容易对RF的决策产生更大的影响,从而影响拟合的模型的效果。
sklearn参数解释
n_estimators:基学习器的数量,越大越好,但是训练时间会越长。
criterion:寻找最有切分点的依据,默认采用Gini index。
max_features:随机特征子集的大小,默认是"auto",一般默认就可以,如果特征纬度特别大,可以灵活改变最大特征数,以控制决策树的生成时间。
max_depth:最大深度默认"None",当样本和特征都很多的情况下可以控制深度。
min_samples_split:节点最小样本数量,当某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。默认为2,若样本数量大,可以考虑增大这个值。
min_samples_leaf:叶子节点最少样本数。若某叶子节点数目小于min_samples_leaf,则会和兄弟节点一起被剪枝。默认是1,当样本量增大的时候推荐增大这个值。
min_weight_fraction_leaf:叶子节点最小的样本权重和。若叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。默认是0,缺失值较多,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。
max_leaf_nodes:最大叶子节点数。通过限制最大叶子节点数,可以防止过拟合。默认为"None"。
min_impurity_split:节点划分最小不纯度。如果某节点的不纯度小于这个值,就不再生成子结点。
应用
当数据维度相对低(几十维),同时对准确性有较高要求时,我们可以选用随机森林,同时它不需要很多参数调整就可以达到不错的效果,基本上不知道用什么方法的时候都可以先试一下随机森林。