集成学习 ensemble learning 是经过构建多个学习器来完成学习任务,在实际应用以及各大竞赛中应用很是普遍。根据学习器的生成方式,集成学习方法大概能够分做两类:html
Bagging 是借助于 bootstrap 算法来采样。给定包含 N 个样本的数据集,步骤是:node
初始训练集中有的样本在采样集中屡次出现,有的则从未出现。一个样本始终不在采样集中出现的几率是 。根据
,所以初始训练集中约有 63.2% 的样原本训练,剩下的约 36.8% 的样本可用做验证集来对泛化性能进行包外估计。python
使用 M 个学习器的 Bagging 的基本流程:算法
使用 Bagging 学习器进行预测时,分类任务采起简单投票法,取每一个基学习器的预测类别的众数;回归任务使用简单平均法,取每一个基学习器的预测值的平均。bootstrap
Bagging 算法能够下降方差,在非剪枝决策树、神经网络等容易受到样本扰动的算法上效果很明显。而 Boosting 算法能够用来下降误差,它能将一些弱学习器提高为强学习器。所以它在 svm、knn 等不容易受到样本扰动的学习器上效果更为明显。网络
在 sklearn 中使用 bagging 代码以下,其中 n_estimators
表明使用 500 个决策树学习器进行集成学习,max_samples
表明每一个学习器最多 100 个样本,max_features
表明决策树每个节点最多使用两个特征,oob_score=True
表明使用剩余的 1/3 样本进行评估。dom
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import BaggingClassifier
bagging_clf = BaggingClassifier(DecisionTreeClassifier(), n_estimators=500, max_samples=1000, max_features=2, bootstrap=True, oob_score=True, n_jobs=-1)
bagging_clf.fit(X, y)
复制代码
随机森林 Random Forest 是 Bagging 的一个演变算法。随机森林对 Bagging 作了一些改进。函数
听着有些抽象,实际上就是在随机森林中,对基决策树的每一个结点,先从该结点的属性集合中随机选择一个包含 k 个属性的子集,而后再从这个子集中选择一个最优属性用于划分:性能
随着树的数量的增长,随机森林能够有效缓解过拟合。由于随着树的数量增长,模型的方差会显著下降。可是树的数量增长并不会纠正误差,所以随机森林仍是会有过拟合。学习
在 sklearn 中使用随机森林很是简单,注意随机森林拥有 DecisionTreeClassifier 和 BaggingClassifier 的全部参数,好比:
rf_clf2 = RandomForestClassifier(n_estimators=500, max_leaf_nodes=16, max_depth=10, min_samples_split=2, min_samples_leaf=2, max_leaf_nodes=None, oob_score=True, n_jobs=-1)
rf_clf2.fit(X, y)
rf_clf2.oob_score_
复制代码
由于 RandomForestClassifier/RandomForestRegression 在 kaggle/天池这样的比赛用的比较多,下面将一些重要的参数列一下:
提高方法(boosting) 是一种经常使用的统计学习方法。在分类问题中,它经过改变训练样本的权重学习多个分类器,并将这些分类器们进行线性组合来提升分类的能力。提高方法的基本思想是:对于一个复杂任务来讲,将多个专家的判断进行适当的综合所得出的判断,要比其中任何一个专家单独的判断要好。用一句古话说就是”三个臭皮匠顶一个诸葛亮“。
boosting 算法的一个大概流程是:
boosting 算法中最著名的是 AdaBoost 算法。AdaBoost 算法有两个核心概念:
AdaBoost 算法不改变所给的训练数据,而不断改变训练数据权值的分布,使得训练数据在基本分类器的学习中起不一样做用。所以 AdaBoost 要求基本学习器可以对特定的数据分布进行学习,这通常是在学习的时候为每一个训练样本赋予一个权重。Adaboost 算法的基本公示以下,下面一节作一个详细的介绍。
现有训练数据集:
初始化训练数据的权值分布 。
假设有 m 个学习器,对于 ,步骤以下:
构建基本分类器的线性组合: 。获得集成分类器:
。
sklearn 中 adaboost 使用以下:
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import AdaBoostClassifier
ada_clf = AdaBoostClassifier(
DecisionTreeClassifier(max_depth=4), n_estimators=500)
ada_clf.fit(X_train, y_train)
ada_clf.score(X_test, y_test)
复制代码
假定集成包含 M 个基学习器 。一般有三种集成策略:
平均法一般用于回归任务中。
一般若是个体学习器性能相差较大时,适合使用加权平均法;个体学习器性能相差较近时,适合使用简单平均法。
投票法一般用于分类任务中。
后续补充一下 gbdt 和 stacking 两种集成学习算法。