关于集成学习的总结(二) Bagging思想

Bagging 方法

本篇博客的关于随机森林的优缺点参考了https://blog.csdn.net/zhongjunlang/article/details/79488955

来自上篇投票法的启示,我们想要得到泛化性较强的集成,集成中的分类器应尽可能的相互独立。这个独立可能显示任务中很难做到,于是人们设法给基学习器较大的差异,那么怎么做呢?一种可能的方法就是对基分类器进行采样,让他产生不同的数据子集,再从每一个数据子集中训练出一个基分类器。同时我们还希望基分类器个体的效果不能太差,如果我们采样出来的每个分类器都完全不同,这就让每一个基分类只是用了一小部分数据集,难以充分利用数据集中的信息,所以我们采用了bostrap有放回的采样方法来分割实例。

集成算法中,bagging 方法会在原始训练集的随机子集上构建一类黑盒估计器的多个实例,然后把这些估计器的预测结果结合起来形成最终的预测结果。 该方法通过在构建模型的过程中引入随机性,来减少基估计器的方差(例如,决策树)。 在多数情况下,bagging 方法提供了一种非常简单的方式来对单一模型进行改进,而无需修改背后的算法。 因为 bagging 方法可以减小过拟合,所以通常在强分类器和复杂模型上使用时表现的很好(例如,完全决策树,fully developed decision trees),相比之下 boosting 方法则在弱模型上表现更好(例如,浅层决策树,shallow decision trees)。

 

我们用sklearn去实现 bagging 方法做的时候

from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier

bag_clf = BaggingClassifier(
    DecisionTreeClassifier(random_state=42), n_estimators=500,
    max_samples=100, bootstrap=True, n_jobs=-1, random_state=42)
bag_clf.fit(X_train, y_train)
y_pred = bag_clf.predict(X_test)
print('Bagging method',accuracy_score(y_pred,y_test))

输出结果:Bagging method 0.904 和之前投票法相比,准确率又提高了

Bootstrap 在每个预测器被训练的子集中引入了更多的分集,所以 Bagging 结束时的偏差比 Pasting 更高,但这也意味着预测因子最终变得不相关,从而减少了集合的方差。总体而言,Bagging 通常会导致更好的模型,这就解释了为什么它通常是首选的。然而,如果你有空闲时间和 CPU 功率,可以使用交叉验证来评估 Bagging 和 Pasting 哪一个更好。

Bagging方法之随机森林

随机森林是bagging思想的一种体现,在随机森林中 集成模型中的每棵树构建时的样本都是由训练集经过有放回抽样得来的(。 另外,在构建树的过程中进行结点分割时,选择的分割点不再是所有特征中最佳分割点,而是特征的一个随机子集中的最佳分割点。 由于这种随机性,森林的偏差通常会有略微的增大(相对于单个非随机树的偏差),但是由于取了平均,其方差也会减小,通常能够补偿偏差的增加,从而产生一个总体上更好的模型

随机森林的关键性体现在俩个有放回,第一个是instance 案例的抽取有放回,另一个是选取的特征有放回,都是boostrap方法。

sklearn 中有的 RandomForestClassifier 和 RandomForestRegressor 类,一个是用来分类一个是用来进行回归。

Bagging 方法的好处并不止于此,对于决策树而言,我们知道决策树的算法优点是很容易理解和解释,易于使用且功能丰富而强大。然而,它也有一些限制,决策树很喜欢设定正交化的决策边界,(所有边界都是和某一个轴相垂直的),这使得它对训练数据集的旋转很敏感,也就是说模型的泛化能力不够强。例如对于一个简单的线性可分数据集。决策树可以轻易的将数据分隔开,但是当我们把数据旋转了 45° 之后,决策树的边界看起来变的格外复杂。尽管俩种决策树都拟合了数据,但是他们所划分的属性和相应的属性值是不同的。用bagging就解决了这一点,他牺牲了一部分偏差,来获得了更小的方差。

上图是俩种决策边界的比较。可以看到随机森林的泛化能力明显变强了。

极端随机树

我们刚才提到随机森林的做法是俩个boostrap随机,这样是为了保证基分类器既有一定的不同,也能有一定的准确率。现在还有一种更极端的做法就是极端随机树。

我们知道随机森林是由很多棵子树构成的,子树就是决策树或者回归树。我们选取分割节点的时候分类的时候用(信息增益率、信息增益、基尼系数) 回归的时候用(最小方差)

当我们采用极端随机树的时候,意味着再一次用高偏差换低方差。它还使得比规则的随机森林更快地训练,因为在每个节点上找到每个特征的最佳阈值是生长树最耗时的任务之一。

极端随机树在sklearn中也有专门的api,参数和随机森林类似

现在让我们试着回答以下几个问题:

随机森林的流程?

  随机森林的分为三个步骤,第一步骤是用boostrap采样出实例,第二步骤还是用boostrap采样出特征 第三步骤是基于采样得到的实例和特征构建一个个小的决策树,然后用投票法进行预测。
随机森林如何选择和构建特征 ?

    随机森林选择特征有俩个步骤,第一是boostrap采样出子树所需要的特征,第二个是决策树用信息增益、基尼系数等来计算分割该特征值的阈值
随机森林如何用于分类或回归?

随机森林是一种并行的方式,分类的方式还是投票法,回归的方法是简单平均法
随机森林通过什么方式减少误差 ?

   随机森林用上篇投票法的证明的思路,去提高基分类器的独立性,所以减小了误差。同时每一个小的子分类器通过高偏差换取了低方差,最终也使整个模型比较稳定。


随机森林的效果相比于传统的LR,SVM效果为什么好一些 ?

   随机森林的效果在于他充分利用了树的的特性,既可以用来做分类,也可以用来做回归。树的特性呢就是缺点在容易过拟合,边界一般都是正交化,这点由随机森林很完美的解决了。传统的svm 由于要找一个尽可能宽的超平面将数据分开,所以对数据的特征的大小比较敏感。而树模型就没有这个缺点,他甚至可以对有些存在缺失值的数据进行训练,鲁棒性较强。最后,如果你观察一个单一决策树,重要的特征会出现在更靠近根部的位置,而不重要的特征会经常出现在靠近叶子的位置。因此我们可以通过计算一个特征在森林的全部树中出现的平均深度来预测特征的重要性。sklearn 在训练后会自动计算每个特征的重要度。你可以通过sklearn中的feature_importances_变量来查看结果。


随机森林 如何加速训练?

可能选取较少的子树的棵数会有作用,还有子树的深度都会对随机森林的训练速度有影响


随机森林的参数有哪些,如何调参 ?

使用这些方法时要调整的参数主要是 n_estimators 和 max_features。 前者(n_estimators)是森林里树的数量,通常数量越大,效果越好,但是计算时间也会随之增加。 此外要注意,当树的数量超过一个临界值之后,算法的效果并不会很显著地变好。 后者(max_features)是分割节点时考虑的特征的随机子集的大小。 这个值越低,方差减小得越多,但是偏差的增大也越多。 根据经验,回归问题中使用 max_features = n_features , 分类问题使用 max_features = sqrt(n_features (其中 n_features 是特征的个数)是比较好的默认值。 max_depth = None 和 min_samples_split = 2 结合通常会有不错的效果(即生成完全的树)。 请记住,这些(默认)值通常不是最佳的,同时还可能消耗大量的内存,最佳参数值应由交叉验证获得。 另外,请注意,在随机森林中,默认使用自助采样法(bootstrap = True), 然而 extra-trees 的默认策略是使用整个数据集(bootstrap = False)。 当使用自助采样法方法抽样时,泛化精度是可以通过剩余的或者袋外的样本来估算的,设置 oob_score = True 即可实现。


随机森林实战当中遇到的一些问题 ?

可能调参的时候有一定难度,而且精度并没有boosting的方法好用一些,但是计算复杂度够快。是子树的复杂度的常数倍
随机森林的优缺点 ?

优点

表现性能好,与其他算法相比有着很大优势。
随机森林能处理很高维度的数据(也就是很多特征的数据),并且不用做特征选择。
在训练完之后,随机森林能给出哪些特征比较重要。
训练速度快,容易做成并行化方法(训练时,树与树之间是相互独立的)。
在训练过程中,能够检测到feature之间的影响。
对于不平衡数据集来说,随机森林可以平衡误差。当存在分类不平衡的情况时,随机森林能提供平衡数据集误差的有效方法。
如果有很大一部分的特征遗失,用RF算法仍然可以维持准确度。
随机森林算法有很强的抗干扰能力(具体体现在6,7点)。所以当数据存在大量的数据缺失,用RF也是不错的。
随机森林抗过拟合能力比较强(虽然理论上说随机森林不会产生过拟合现象,但是在现实中噪声是不能忽略的,增加树虽然能够减小过拟合,但没有办法完全消除过拟合,无论怎么增加树都不行,再说树的数目也不可能无限增加的。)
随机森林能够解决分类与回归两种类型的问题,并在这两方面都有相当好的估计表现。(虽然RF能做回归问题,但通常都用RF来解决分类问题)。
在创建随机森林时候,对generlization error(泛化误差)使用的是无偏估计模型,泛化能力强。

缺点:

随机森林在解决回归问题时,并没有像它在分类中表现的那么好,这是因为它并不能给出一个连续的输出。当进行回归时,随机森林不能够做出超越训练集数据范围的预测,这可能导致在某些特定噪声的数据进行建模时出现过度拟合。(PS:随机森林已经被证明在某些噪音较大的分类或者回归问题上回过拟合)。
对于许多统计建模者来说,随机森林给人的感觉就像一个黑盒子,你无法控制模型内部的运行。只能在不同的参数和随机种子之间进行尝试。
可能有很多相似的决策树,掩盖了真实的结果。
对于小数据或者低维数据(特征较少的数据),可能不能产生很好的分类。(处理高维数据,处理特征遗失数据,处理不平衡数据是随机森林的长处)。
执行数据虽然比boosting等快(随机森林属于bagging),但比单只决策树慢多了。



该集成学习算法与其他集成方法的不同

这是一种并行的处理方案,典型的bagging思想。和boosting思想完全不同

猜你喜欢

转载自blog.csdn.net/PythonstartL/article/details/83039551
今日推荐