(七)随机森林
本系列重点在浅显易懂,快速上手。不进行过多的理论讲解:也就是不去深究what,而是关注how。全文围绕以下三个问题展开:
1)长什么样?
2)解决什么问题?
3)怎么实现?
3.1)从数学讲,原理
3.2)从代码上讲,如何掉包实现
1)长什么样
随机森林,是一种”集成学习(ensemble learing)“方法,算法如其名,随机和森林,首先解释森林,如下图就是多个决策树的组合,来了一个样本,分别进入到不用的决策树中,每个决策树都会输出一个结果,当时分类问题时,进行举手表决,数量最多的获胜,当时回归问题时,将所有的输出求均值作为最终的输出。所以随机森林属于集成学习方法中的bagging 算法。
2)解决什么问题
随机森林可以解决分类和回归问题。
分类问题如下: x 1 到 x 4 x1到x4 x1到x4为特征,y为目标变量,y是离散的有1和0两种类型。通过特征来预测目标变量y的类型。
x1 | x2 | x3 | x4 | y |
---|---|---|---|---|
5.5 | 2.6 | 4.4 | 1.2 | 1 |
5 | 3 | 1.6 | 0.2 | 0 |
5.7 | 2.8 | 4.5 | 1.3 | 1 |
5.1 | 3.4 | 1.5 | 0.2 | 0 |
6.3 | 3.3 | 4.7 | 1.6 | 1 |
回归为题如下: x 1 到 x 13 x1到x13 x1到x13为特征,y为目标变量,y是连续值。通过特征来预测目标变量y的值。
x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | x10 | x11 | x12 | x13 | y |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0.01 | 18 | 2.31 | 0 | 0.54 | 6.58 | 65.2 | 4.09 | 1 | 296 | 15.3 | 396.9 | 4.98 | 24 |
0.03 | 0 | 7.07 | 0 | 0.47 | 6.42 | 78.9 | 4.97 | 2 | 242 | 17.8 | 396.9 | 9.14 | 21.6 |
0.03 | 0 | 7.07 | 0 | 0.47 | 7.18 | 61.1 | 4.97 | 2 | 242 | 17.8 | 392.83 | 4.03 | 34.7 |
0.03 | 0 | 2.18 | 0 | 0.46 | 7 | 45.8 | 6.06 | 3 | 222 | 18.7 | 394.63 | 2.94 | 33.4 |
0.07 | 0 | 2.18 | 0 | 0.46 | 7.15 | 54.2 | 6.06 | 3 | 222 | 18.7 | 396.9 | 5.33 | 36.2 |
怎么实现
数学原理
上文解释了随机森林的思路,解释了”森林“的意思,那么随机的意识是什么呢?
随机包含两方面:
1)当训练每颗树时,用到的样本时不用的,试想如果每棵树用的样本相同就没有必要训练多个决策树了。假设有m个样本,训练每棵树时都进行有放回的m次抽样,用抽样的数据集取训练决策树,这样既保证了每棵树之间既有关联又有特异。
2)特征的随机选择,我们知道决策树在划分节点时,会便利全部特征的全部划分方式,选择基尼系数最小的特征进行划分,随机森林中的每个决策树在划分时,并不会考虑所有的变量,而是随机的选择一部分特征,来计算基尼系数,再在这部分特征中选择一个特征进行节点的划分。【注意是每棵树每次节点分裂时都随机选择m个特征、而不是一棵树固定的用随机选择的m个特征】
随机森林分类效果(错误率)与两个因素有关:
1)森林中任意两棵树的相关性:相关性越大,错误率越大
2)森林中每棵树的分类能力:每棵树的分类能力越强,整个森林的错误率越低
3)减小特征选择个数m,树的相关性和分类能力也会相应的降低;增大m,两者也会随之增大。所以关键问题是如何选择最优的m(或者是范围)。
随机森林的优点:
1)训练可以高度并行化,可以有效运行在大数据集上
2)由于对决策树候选划分属性的采样,这样在样本特征维度较高的时候,仍然可以高效的训练模型。
3)由于有了样本和属性的采样,最终训练出来的模型泛化能力强。
4)可以输出各特征对预测目标的重要性。
5)对部分特征的缺失容忍度高。
6)袋外数据可用作验证集来检验模型的有效性,不用额外划分数据集
随机森林的缺点:
1)在某些噪声比较大的样本集上,随机森林容易陷入过拟合
2)取值划分比较多的特征容易对随机森林的决策产生更大的影响,从而影响拟合的模型效果
sklearn掉包实现
# 调取sklearn包
from sklearn.ensemble import RandomForestClassifier, RandomForestRegressor #sklearn中,线性回归模型在linear_model模块中
from sklearn import tree
# 调取sklearn中自带的数据集
from sklearn.datasets import load_iris #调用鸢尾花分类数据集
from sklearn.datasets import load_boston #调用波士顿房价数据集
X1, y1 = load_iris(return_X_y=True) #获取X,y数据
X2, y2 = load_boston(return_X_y=True) #获取X,y数据
rfc = RandomForestClassifier()#初始化一个随机森林分类模型
rfr = RandomForestRegressor()#初始化一个随机森林回归模型
rfc.fit(X1,y1) #fit函数用于训练
rfr.fit(X2,y2)