scikit-learn--Ensemble methods(集成方法)

集成方法的目的是通过结合很多基学习器来增强泛化和鲁棒性。
两种集成方法:

  • averaging methods,主要原则是独立地建立很多基学习器,然后取预测结果的平均值;联合估计通常比任一单一估计有表现的更好,因为方差减小了。例如:Bagging methods, Forests of randomized trees, ...
  • boosting methods,建立一系列基学习器,每一个都试图去减小联合估计的偏倚;通过结合许多弱模型而产生一个强集合。例如: AdaBoost, Gradient Tree Boosting, ...

Bagging meta-estimator

在集成算法中,bagging方法形成了这样一类算法:在原始训练集中生成随机子集,建立很多黑盒学习器,然后汇总每个学习器的预测结果形成最终的结果。
Bagging 方法有很多种,主要区别在于从训练集中提取随机子集的方法:
1.样本的随机子集,被称作Pasting;
2.有放回的抽样,称作Bagging;
3.特征的随机子集,称作Random Subspaces;
4.样本和特征的子集,称作Random Patches。

随机森林

基于随机决策树有两种集成方法:随机森林和Extra树,这两种算法都是 perturb-and-combine 技术,意味着在分类器构建过程中引进了随机性产生了一套不同的分类器集合。
在随机森林中,每棵树都是建立在训练集有放回抽样基础上的,并且,在节点分裂的过程中,最优分裂也不再基于全部特征,而是特征的随机子集。随机性也导致随机森林的偏倚有所上升,但是通过平均化,方差是下降的,更多地补偿了偏倚的增加,得到更好的模型。
相比原著,sklearn使用了各个分类器预测概率的平均值,代替投票法。

Extremely Randomized Trees

在Extremely Randomized Trees中,随机性在计算分裂的过程中更前进了一步。如在随机森林中一样,使用候选特征的随机子集,但不是寻找最优阈值,而是从每个候选特征中随机抽取阈值,这些阈值中最好的被当作分裂规则。

参数

两个主要参数:n_estimators 和max_features,前者是森林中树的数量,树越多越好,但计算量也越大。另外也要注意到,超出树的数量临界值,结果并没有显著变好。后者是节点分裂的时候需要考虑的随机特征的数量,特征数越少,方差越小,但偏倚越大。
根据经验,在回归问题中,max_features=n_features,在分类中,max_features=sqrt(n_features) 。当设置max_depth=None 和min_samples_split=1 时,通常会得到好的结果,虽然并不是最优结果,而且将耗费很大的内存。
最优的参数来源于交叉验证。
在随机森林中,默认使用有放回抽样(bootstrap=True),但是extra-trees 默认使用全部数据 (bootstrap=False)。
在使用有放回抽样的时候,模型的准确率可以通过未被抽样的样本来计算,可以通过设置 oob_score=True 来实现,默认 False。

*Feature importance evaluation

*Totally Random Trees Embedding

Adaboost

AdaBoost的核心原则是用一系列弱学习器去拟合数据,然后对它们的预测结果加权投票(求和)形成最终结果。在每次boosting迭代过程中,通过给训练样本赋予权重来改变数据。样本初始化权重都设为1/N,因此第一步是在原始数据上训练弱学习器。在每次迭代中,样本权重独立变化,使用重新赋权的数据训练新的算法。在给定的步骤中,用前一步的训练模型预测错误的样本将得到更高的权重,而预测正确的样本权重将下降。在迭代过程中,那些很难预测的样本将不断提高影响。因此,每个后续的弱学习器都将被专注于那些在前一步预测错误的样本。

Gradient Tree Boosting

Gradient Tree Boosting或者 Gradient Boosted Regression Trees (GBRT)是一种利用任意可微损失函数(arbitrary differentiable loss functions)的泛化提升方法。GBRT是一种现成准确有效的方法,用来解决回归和分类问题。Gradient Tree Boosting被用在包括网络搜索排名与生态等的很多领域。
GBRT的优点:
1.自然处理混合类型的数据(各种特征);
2.预测能力强;
3.异常值的鲁棒性(通过损失函数)。
GBRT的不足:
不能并行计算。

分类

GradientBoostingClassifier支持两类及多类分类。
当分类数超过两类时,每次迭代需要 n_classes 回归树,导致最终的树的数量为n_classes * n_estimators。如果数据集有很多类,建议使用 RandomForestClassifier 代替 GradientBoostingClassifier。

回归

GradientBoostingClassifier支持各种回归中使用的损失函数,默认使用最小平方(least squares)。

控制树的规模

回归树基学习器的数量反映了通过Gradient Tree Boosting能获得的变量之间交互水平。一般来说,树的深度 h 能捕获秩 h 的交互。有两种方法能控制回归树的数量:
设置max_depth=h,则最终形成深为h 的二叉树,这样的树最多有2h 个叶子节点以及 2h-1 个分裂节点。
设置max_leaf_nodes 指定叶子节点的数量, 在这种情况下,树将使用最佳优先搜索(best-first search )那些能显著改善不纯度的节点将优先生长。
我们发现,设置 max_leaf_nodes=k 相比 max_depth=k-1 的结果,训练速度显著提高,而训练误差只有轻微上升。在 R 的gbm包中,
max_leaf_nodes == interaction.depth + 1。

损失函数

可以通过参数 loss 来设置损失函数:
*回归:
1.Least squares ('ls'),初始模型给出目标值的均值;
2.Least absolute deviation ('lad'):初始模型给出目标值的中位数;
3.Huber ('huber'):结合 ls 和 lad,用alpha 去控制对异常值的敏感度;
4.Quantile ('quantile'):分位数回归使用的损失函数,用0 < alpha < 1 指定分位数,这个损失函数被用来生成预测区间。
*分类:
1.Binomial deviance ('deviance');
2.Multinomial deviance ('deviance');
3.Exponential loss ('exponential')。

正则化

参数 learning_rate 与参数 n_estimators 有很强的关系。学习率越小,同样的训练误差情况下需要的弱学习器越多。经验表明,学习率越小,越有利于减小测试误差。建议设置小的学习率(<= 0.1)和选择提前终止n_estimators。

解释性

特征重要性
Partial dependence

投票分类器

*Hard Voting
每个分类器给出类标签,最多的类标签即为结果。

*Soft Voting
每个分类器给出预测的类的概率,乘以每个分类器的权重,然后取均值。加权平均概率最高的类标签即为结果。


来源:http://scikit-learn.org/stable/modules/ensemble.html#

你可能感兴趣的:(scikit-learn--Ensemble methods(集成方法))