前今天整理了决策树的原理实现,顺手再把随机森林的原理整理整理。

1.Bagging

 Bagging是并行式集成学习方法最著名的代表,其原理是给定包含m个样本的数据集,我们先随机取出一个样本放入采样集中,再把该样本放回初始数据集(有放回),这样经过m此随机采样操作,我们得到含有m个样本的采样集。照这样,我们可采样出T个含m个训练样本的采样集,然后基于每个采样集训练一个基学习器,再将这些基学习器进行结合,这就是Bagging的基本流程。Bagging的算法描述如下:
Bagging与随机森林
 假定基学习器的计算复杂度为O(m),则Bagging的复杂度大致为T(O(m)+O(s)),考虑到采样与投票/平均的复杂度O(s)很小,而T通常是一个不太大的常数,因此,训练一个Bagging集成与直接使用基学习算法训练一个学习器的复杂度同阶,这说明Bagging是一个很高效的集成学习算法。

Bagging是一种集成思想,基学习器不仅可以是决策树还可以是神经网络等。

2.随机森林(RF)

 接自https://blog.csdn.net/Y_hero/article/details/88373840决策树的原理详解。随机森林是Bagging的一个扩展变体,RF在以决策树为基学习器构建Bagging集成的基础上,进一步加入了随机属性的选择,从所有属性D中随机选取K个属性,选择最佳分割属性作为节点建立CART决策树(泛化的理解,这里面也可以是其他类型的分类器,比如SVM、Logistics),减小特征选择个数K,树的相关性和分类能力也会相应的降低;增大K,两者也会随之增大。所以关键问题是如何选择最优的K, 一般情况下推荐值K=log2 D.

2.1随机森林的生成

由于同一批数据,用同样的算法只能产生一棵树,而我们的森林显然不希望只有一种树,这时Bagging策略可以帮助我们产生不同的数据集。Bagging策略来源于bootstrap aggregation:从样本集(假设样本集N个数据点)中重采样选出N个样本(有放回的采样,样本数据点个数仍然不变为N),在所有样本上,对这N个样本建立分类器(ID3\C4.5\CART\SVM\LOGISTIC),重复以上两步m次,获得m个分类器,最后根据这m个分类器的投票结果,决定数据属于哪一类。

随机森林分类效果(错误率)与两个因素有关:

森林中任意两棵树的相关性:相关性越大,错误率越大;

森林中每棵树的分类能力:每棵树的分类能力越强,整个森林的错误率越低。

3.结合策略

Bagging与随机森林
经过上述的随机森林生成步骤后,生成各种类别的子树,当输出时,每个基学习器都会生成一个结果,如何将这些结果整合为唯一的输出就是结合策略所解决的问题。在对预测输出进行结合时,Bagging通常对分类任务使用简单投票法,对回归任务使用简单平均法。

3.1 平均法

Bagging与随机森林
Bagging与随机森林
由于各个基学习器的权值在训练中得出,随机抽样时有大约1/3的样本不会被一个学习器抽到,因此可以用未抽到的作为验证集,根据验证集在此学习器的正确率来计算此学习器的权值。

一般而言,在个体学习器性能相差较大时宜使用加权平均法,在个体学习器性能相差较小时宜使用简单平均法。

3.2 投票法

3.2.1绝对多数投票法(若某类别概率超过0.5则输出该标记)

3.2.2 相对多数投票法(输出标记为概率最高的一个标记)

3.2.3加权投票法
Bagging与随机森林
3.3学习法

 Stacking描述:先从初始数据集中训练出初级学习器,然后“生成”一个新数据集用于训练次级学习器。在新数据集中,初级学习器的输出被当做样例输入特征,初始样本的标记仍被当做样例标记。

4.总结

随机森林在bagging的基础上更进一步:

  1. 样本的随机:从样本集中用Bootstrap随机选取n个样本

  2. 特征的随机:从所有属性中随机选取K个属性,选择最佳分割属性作为节点建立CART决策树(泛化的理解,这里面也可以是其他类型的分类器,比如SVM、Logistics)

  3. 重复以上两步m次,即建立了m棵CART决策树

  4. 这m个CART形成随机森林,通过投票表决结果,决定数据属于哪一类(投票机制有一票否决制、少数服从多数、加权多数)

 即在bagging策略基础上,添加了对特征的随机选择,从2个方面进行构建决策树之后再集成。随机森林的训练效率常优于Bagging,因为在个体决策树的构建过程中,Bagging使用的是"确定型"决策树,在划分属性时要对结点的所有属性进行考察,而随机森林使用的时“随机型”决策树则之考察一个属性子集。

5.python实现随机森林

利用Python的两个模块,分别为pandas和scikit-learn来实现随机森林。

from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
import pandas as pd
import numpy as np

iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['is_train'] = np.random.uniform(0, 1, len(df)) <= .75
df['species'] = pd.Factor(iris.target, iris.target_names)
df.head()

train, test = df[df['is_train']==True], df[df['is_train']==False]

features = df.columns[:4]
clf = RandomForestClassifier(n_jobs=2)
y, _ = pd.factorize(train['species'])
clf.fit(train[features], y)

preds = iris.target_names[clf.predict(test[features])]
pd.crosstab(test['species'], preds, rownames=['actual'], colnames=['preds'])

Bagging与随机森林

相关文章: