集成树模型系列之一——随机森林
随机森林一般会被认为集成树模型的开端,虽然现在工业或者比赛中都很少会被应用,但是我们学习集成树模型都绕不过它,它的一些思想被广泛地应用到后面的集成树模型中。 随机森林这个取名非常地贴切,涵括了它最重要的2个特征:“随机”,“森林”。
随机森林的"森林"
森林顾名思义肯定涵盖了很多棵树,随机森林也恰是很多棵决策数组合而成的。那么它是怎么组合而成的呢?我们先引入几个概念:
一:bagging和boosting。
1:Bagging即套袋法,在多数情况下,bagging 方法提供了一种非常简单的方式来对单一模型(同一个算法在不同的训练集上训练多个模型)进行改进,而无需修改背后的算法。其算法过程如下: 1):从原始样本集中抽取训练集。每轮从原始样本集中使用Bootstraping的方法抽取n个训练样本(在训练集中,有些样本可能被多次抽取到,而有些样本可能一次都没有被抽中)。共进行k轮抽取,得到k个训练集。(k个训练集之间是相互独立的) 2):每次使用一个训练集得到一个模型,k个训练集共得到k个模型。(注:这里并没有具体的分类算法或回归方法,我们可以根据具体问题采用不同的分类或回归方法,如决策树、感知器等) 3):对分类问题:将上步得到的k个模型采用投票的方式得到分类结果;对回归问题,计算上述模型的均值作为最后的结果。(所有模型的重要性相同) 平常我们说的五折验证可以认为是采用的bagging方法(当然他们们的数据不是独立的,各个数据集生成的模型是完全独立的,可以并行训练模型,并且数据集随机划分),在我认为:从更广义地地方来说多个相互独立的模型的结果加权起来用的就是bagging方法。
2:boosting是通过一定的方式将基础模型进行线性的组合,更强调的模型的结合,因为往往各个模型之间不是相互独立的,这一个模型会依赖上一个模型的结果。主流的boosting模型有GBDT(我们之后会简单讲述)。
二:偏差和方差
1:偏差大一般代表欠拟合,方差大一般代表过拟合。偏差反应模型的拟合能力,方差更反应的是模型的鲁棒性。 一般我们会说:bagging可以降低方差,boosting一般用于降低偏差。 这是因为bagging是选取各种模型的结果然后线性加权,各个模型之间是独立的,可以有
E
[
∑
(
x
i
)
n
]
=
E
[
x
i
]
E[\frac{\sum(x_i)}{n}]=E[x_i]
E[n∑(xi?)?]=E[xi?],通过bagging融合之后并不能很明显地降低偏差。但是由于
v
a
r
(
∑
(
x
i
)
n
)
=
v
a
r
(
x
i
)
n
var(\frac{\sum(x_i)}{n})=\frac{var(x_i)}{n}
var(n∑(xi?)?)=nvar(xi?)?,因此可以明显地降低方差。与此同时,boosting是采用forward-stagewise这种贪心法去最小化损失函数,比如常见地GBDT是下一棵树直接去拟合上一棵树的损失函数,这种方法肯定会带来bais的降低,同时由于各个模型之间并不独立并不能较少偏差。
随机森林的"随机"
一些概念介绍完了,我先用一句话定义下随机森林,随机森林是一种采用了bagging方法将决策树模型集成起来的集成模型。关于集成的概念我们了解,那么接下来介绍下"随机"。 随机森林的随机可以分别两个方面: 1:数据的随机 2:特征的随机
一:数据随机
随机森林会并行地生成很多棵决策树,每棵决策树的训练数据都是从整体数据中随机选择部分数据。
二:特征随机
为了最后训练决策树之间的差异性变大,除了数据随机之外,决策树还加了一个特征随机,每个决策树的训练都只采用了部分的特征。
注:数据随机和特征随机的思想,xgb模型中也应用到了(根据subsample和colsample_bytree参数设置比例),主要是防止过拟合。
关于随机森林的介绍就到此结束。总结一下:随机森林是采用bagging的方法将多棵决策树结果线性加权起来,各棵树中的训练数据和特征都是从总体数据和特征中随机抽取的。
下面介绍一下sklearn中随机森林的实现方法:
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_classification
X, y = make_classification(n_samples=1000, n_features=4,
n_informative=2, n_redundant=0,random_state=0, shuffle=False)
clf = RandomForestClassifier(max_depth=2, random_state=0)
clf.fit(X, y)
RandomForestClassifier(...)
print(clf.predict([[0, 0, 0, 0]]))
更多关于随机森林的细节可以学习sklearn.ensemble._forest.py中的源代码。
随机森林的优缺点
优点: 1:与传统决策树模型相比,它结合了多个决策树模型的结果,模型地效果会更好。 2:与xgb等梯度提升树相比,它由于可以并行地生成树,不需要像梯度提升树模型那样需要等第一棵树生成完再生成下一棵树,因此速度更快。 缺点: 1:与xgb等梯度提升树相比,效果会差一些。同样也是因此,一般在数据挖掘地比赛中我们很少会使用随机森林。
集成树第一章随机森林介绍完毕,下期将介绍GBDT模型的基本原理和详细介绍xgboost的原理。 我想留个问题和大家一起探讨下: 1:plantsgo在kaggle中率先使用的嫁接是基于bagging或者boosting,或者什么都不是。
|