1.11. Ensemble methods(集成学习)
目标:
相对于当个学习器,集成学习通过使用多个基学习器的预测结果来来提高学习预测的泛化性能以及鲁棒性;
集成学习的两个思路:
1)、通过使用并行的学习,得到多个学习模型然后取其平均结果目的在于减少方差,代表算法有随机森林。通常来说多个学习器的集成要比单个学习器的效果要好多。
2)、采用串行的方式生成多个学习器目的在于减少偏差(bias),使用多个弱分类器组合成为一个强分类器,代表算法adaBoosting以及boosting tree、GDBT。
1.11.1. Bagging meta-estimator
集成学习中,bagging方法使用训练集的一个随机子集来进行训练多个黑盒分类器,然后将不同的黑盒分类器集成到一起得到一个最终的预测模型。在生成训练模型的过程中引入随机化并在最后集成结果的方式可以减少整个训练模型的方差,同时不用因为底层的学习器的不同而发生改变。随机森林通过引入随机性来避免过拟合因此在生成基学习器时可以考虑完成生成即基学习器越强越好,对于boosting的方法则是相反,要求基学习器要弱一点才好。(boosting减少偏差,因为越强越吻合3反而容易出现过拟合)。
随机森林根据训练数据不同的生成方式包括一下:
1)、又放回的抽取,称作bagging
2)、针对特征进行随机化,成为随机子空间random subspace
3)、针对特征和样本都做随机化,称为随机patchs(补丁、块)
4)、随机抽取样本,称为 Pasting
scikit-learn框架中,sklearn.ensemble中有BaggingClassifier和BaggingRegressor两个对象可以实现Bagging方法。方法中可以通过参数指定模型使用基学习器的类型,以及抽取子集的策略。通用的参数为一下几个参数:
max_sample:指定随机子集的规模;小于1表示比例,大于1则为样本数
max_features:指定训练数据的特征规模;小于1表示比例,大于1则为样本数
boostrap:指定是否又放回的抽样;true/false;
boostrap_features:指定特征是否又放回的抽样;true/false;
oob_score = true:表示使用带外数据衡量泛化能力,数据越大越好;
一下实例中基学习器采用K近邻算法,样本规模为原样本的50%,特征为50%
from sklearn.ensemble import BaggingClassifier from sklearn.neighbors import KNeighborsClassifier bagging = BaggingClassifier(KNeighborsClassifier(),max_samples=0.5, max_features=0.5)
1.11.2. Forests of randomized trees
基于随机化的决策树算法,sklearn.ensemble包含了两种平均结果的算法:随机森林和Extra-Tree。在构建分类器时通过引入随机性生成了一系列不相同的树,然后将不同的分类树的结果进行平均作为最终的输出结果。
树算法的训练和其他的算法一样,都是使用两个数组作为参数:X承载训练特征, Y承载训练数据的标签值。如下例所示:
from sklearn.ensemble import RandomForestClassifier X = [[0, 0], [1, 1]] Y = [0, 1] clf = RandomForestClassifier(n_estimators=10) clf = clf.fit(X, Y)
如果扩展成为多分类的问题,那么将Y扩展成为[n_samples, outputs]
1.11.2.1. Random Forests
随机森林的使用主要包括这两个类:RandomForestClassifier
and RandomForestRegressor;一个负责分类一个负责回归。在随机森林生成过程中数据采用又放回的抽取,同时在选择划分时选中的划分只是在相应的特征子集上的最优而不是全部特征的最优,这样就会使得最终的bias会有所增大,但是通过多棵树的平均使得方差varience减少很多,因此这种方法还是很有效的。在最终预测结果时,现有版本采取的方式是平均所有类别的输出的概率,然后选择最大的输出(只在最后产生一个结果),抛弃了原有的对类别的投票(在每棵树上都有一个分类结果);
1.11.2.2. Extremely Randomized Trees(省略)应该是计算划分点的计算方式发生变化。
1.11.2.3. Parameters
n_estimators:生成的基学习器的数量,越多越好,但是越费时间;
max_features:抽样后样本的最大值,在回归问题中一般直接等于原有的特征数,在分类问题中一般采用sqrt(原有特征);
max_depth=None:生成基学习器树的最大深度;
min_samples_split=1:选择划分最小的样本数,越小生成的树就越完全,通常和max_depth搭配使用产生一个发育完全的树;
bootstrap=False:同上面说的;
oob_score = true:同上(当然在使用又放回抽样时使用);
n_jobs = k:设置并行化计算参数,任务被分成k分,使用机器的k个核心计算,当k=1时使用机器的全部核心,可以提升计算速度,但是不是线性关系。
1.11.2.5. Feature importance evaluation
在决策树的生成过程中特征使用的先后顺序可以作为一个特征相对重要性判断的一个指标,越先使用的特征对结果的贡献就越大因次该特征也就相对来说比较重要,因此可以使用该特征对最后结果的贡献度来表示该特征的相对重要性。
在实际的使用中,使用feature_importances_属性来存储每个特征的重要性指标,维度就是特征的数量,其总和为1;