集成学习-(三)-随机森林

为什么随机森林强

当集成学习的基学习器均为决策树时,称随机森林,是Bagging的一种变体。决策树在选择划分属性时,是在当前属性集合中选择最优属性;而在随机森林中,对每个基决策树的每个结点,从该节点的属性集合中随机选择一个包含k个属性的子集,再从这个子集中选择最优的属性用作划分

这个k控制了随机性的程度:当k值等于当前结点的属性集合中所有属性时,表示随机性为0;当k=1时,则表示,在当前结点的属性集合中随机选取一个,之后就使用这一个作为划分,不管它是好是坏(因为没得选,只有这一个)。一般情况下,选取k为log(d), 以2为底数。

为什么随机森林可以“代表集成学习技术”,Bagging中的基学习器多样性是仅仅通过数据的扰动达到的。而随机森林的多样性,不仅来源于数据扰动,还来自属性的扰动

实现随机森林:

使用moon数据集:

1
x, y = datasets.make_moons(n_samples=1000, noise=0.2, random_state=111)

构建一片由500棵树的森林:

1
2
3
4
5
6
7
8
9
10
11
from sklearn.ensemble import RandomForestClassifier

rf = RandomForestClassifier(n_estimators=500,
random_state=233,
oob_score=True)

model = rf.fit(x, y)
# 查看模型参数
print(model)
# 使用oob,用剩下的样本做测试
print(model.oob_score_)

模型参数:

1
2
3
4
5
6
RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini',
max_depth=None, max_features='auto', max_leaf_nodes=None,
min_impurity_decrease=0.0, min_impurity_split=None,
min_samples_leaf=1, min_samples_split=2,
min_weight_fraction_leaf=0.0, n_estimators=500, n_jobs=1,
oob_score=True, random_state=233, verbose=0, warm_start=False)

可以看出随机森林由那些参数,可以如何设置。理解了算法原理,才能理解每个参数如何使用。测试集上准确率为95.6%.

Extra-Tree

还有一种特殊随机森林:Extra-Tree,与经典森林不同的是,这种森林在结点划分时,完全随机,也就是说在当前节点的所有属性里随机选择一个,而非选择最优的。如此一来,森林中的每一棵树的就更加不同了,即多样性更强了。示例如下:

1
2
3
4
5
6
7
8
9
from sklearn.ensemble import ExtraTreesClassifier
etree = ExtraTreesClassifier(n_estimators=500,
bootstrap=True,
oob_score=True,
random_state=233)

model2 = etree.fit(x, y)
print(model2)
print(model2.oob_score_)

结果 95.5%

回顾了Bagging,随机森林,Extra-Tree 都进行了分类任务的应用。也可以将这些集成用于回归任务。

敲黑板样本数量的扰动,样本属性的扰动,增强不同决策树的多样性