欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

随机森林

程序员文章站 2022-07-14 18:21:48
...

摘要:随机森林(Random Forest,简称RF)是Bagging技巧的一个扩展变体。RF在以决策树为基学习器构建Bagging集成的基础上,进一步字决策树的训练过程中一如了随机属性选择。随机森林算法在与其他机器学习算法的比较中,往往在故障诊断有卓越表现,同时在可解释性上有很优秀的表现。
前言:本文对随机森林算法进行总结概括,以CART决策树为背景,构建随机森林,并且解析OOB,将随机森林算法与传统的算法相比较,还将解释随机森林如何进行特征选择,最后将阐述其基本核心思想,以及优劣。
方法说明:结合林轩田老师的课程+sklearn中的数据进行实战来检验+刘峤老师提供的课件+周志华《机器学习》
正文:

  1. 随机森林的朴素思想
    Random Forest = Bagging + 完全长成CART决策树
    关于Bagging:可以简单理解为有放回的抽样。(从袋子中抽样N个样本,重复M次)往往会重复采样很多次,以期望达到一个减少方差的目的。
    关于完全长成CART决策树:通过给定的数据来形成一颗二叉树,每个叶子节点代表一个决策结果,借助基尼指数来表示纯度进行分支特征选择,可以看作是在数据样本点的分布图上进行横竖的刀切割。而完全长成的决策树很容易趋于过拟合。
Def RandomForest(Data):
	for t=1,2,3…,T:
    	Dt=从Data中抽样N′个数据
    	gt=DecisionTree(Dt)
    return G=Uniform({gt})

上表简单地解释了随机森林算法的最朴素地思想。其中DecisionTree代表形成一个完全长成CART决策树。Uniform代表对每个决策树进行公平投票。从而返回一个最优的决策树。从随机森林的这样一个想法可以得到几个小的优劣的总结:1.每棵完全长成CART决策树是独立数据独立进行的,所以其并行计算效率可以很高。2.完全继承了CART决策树的好处:方便处理缺失的数据,方便处理分类的数据(categorical data)。3.通过Bagging重采样数据能够很有效的缓和完全长成CART决策树的缺点:过拟合问题。
2. 不一样的boostrap方式
Boostrap可以同样理解为有放回的抽样,并重复N次。这样的方法我们扩展一下,可不可以看作是特征的抽取呢?不是简单的抽取数据点,而是抽取特征。例如每个数据有100维的特征,我们从中有放回地抽样10维的数据。这样一来,又可以看作是从高维度到低纬度的投影抽样,于时可以说是特征的随机子空间。于是我们的随机森林算法又可以改进为:
RandomForest=Bagging + 特征随机子空间CART
3. 再考虑进一步地对随机森林进行改进
随机采样d′个特征,同时定义投影矩阵P,定义f(x)=P*x。也就是说f(x)是对x进行了投影操作。P的每一行都是随机采样的。pi为P的第i行,fi(x)=piTx为第i行的f(x)的值。也就是说,对于每个投影以后的矩阵来说,都是其自身特征的值的线性组合。通常来说,投影矩阵P一般都是向低纬度的投影,在pi中只有d’’个非零成份。对每个分支点做d′维随机低维投影,也就是每个分支点都做一次特征重组。RF的改进结果为:
RandomForest=Bagging + 随机特征线性组合CART
我们可以看到随机森林算法中,充满了随机性。
4 Out Of Bag(OOB)
随机森林

上图是一次Bagging的实例。X代表生成的决策树g不包含此样本点。假设抽样N轮,则随机森林
当N趋于正无穷时,OOB的概率为1/e。
4.1.OOB vs 验证
上图的X类似于验证机。X可以适用于验证每棵小决策树,因为X并没有被训练过,但是并不适合。原因在于X可能在小决策树上表现不好,但是并不能够代表大决策树G表现得一定不好。于是我们自然可以用于验证大的树G。得到OOB误差随机森林
其中Gn-是不包含Xn抽样而形成的决策树。例如最后一行随机森林
。于是EOOB可以用来做自我验证工作。
随机森林

此图说明了传统的验证集和随机森林算法的运作机制。与传统的训练-验证的步骤相比,OOB方法减轻了训练的成本。
5.特征选择
以此次的疫情为例,中国目前确诊8w人,每个人都当作一个样本点,每个样本点都存在成千上万的基因特性序列,也就是特征数大于样本数的情况。在这样的情况下,代表着有很多特征是干扰信息。例如新冠肺炎与是否痛风无关,所以是否痛风这个特征是可以被删除的。所以就带来了一个问题:对于特征的选择问题。
特征选择问题同样也是特征降维的问题,目的在于1.移除重复特征:如出生日期和年龄2.不相干的特征:如是否的新冠肺炎和天气的关系。这样一个特征选择的问题,可以有以下的优劣总结:
优*************************** 劣
高效 ******************选择难度大,计算量大
通用性(噪声消除)****选择组合带来过拟合问题
可解性强 ******************容易误解释
而CART中的纯度分析就内涵着特征选择。
特征选择带来了组合爆炸的问题:例如1万特征选100,就是C_10000^100。训练这么多模型对于计算机来说就是灾难。随机森林对于此问题的解决方案是Permutation Test,简单来说也就是往数据中塞垃圾,然后比较塞垃圾前后的性能差别。可表示成如下:
Importance(i) = performance(D)-performance(D§)
D§是第i维度被重新洗牌互换的数据。但performance(D§)又要重新训练模型和验证,很烦。我们可以用OOB来偷懒。于是上述问题优化为:
Importance(i) = EOOB(G) – EOOB(Gp)
Importance(i) = EOOB(G) – EOOBp(G)
EOOBp(G)意味着洗牌后的OOB样本,进入模型后得到的误差。
代码实现&实验结果分析:以下是利用sklearn中的鸢尾花数据集进行的随机森林算法的实战代码

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

iris = load_iris()   # 这里是sklearn中自带的一部分数据
df = pd.DataFrame(iris.data, columns=iris.feature_names) # 格式化数据
print (df)          # 
df['is_train'] = np.random.uniform(0, 1, len(df)) <= .75
df['species'] = pd.Categorical.from_codes(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)  # 用train来训练样本

test_pred=clf.predict(test[features])   #用测试数据来做预测
preds = iris.target_names[test_pred]
pd.crosstab(test['species'], preds, rownames=['actual'], colnames=['preds'])

结论:随机森林算法是一个优异的集成算法,Bagging和决策树之间相互借鉴融合,对分类问题具有优良的表现。
参考文献:随机森林实战教程https://blog.csdn.net/randompeople/article/details/81429264
周志华 《机器学习》
林轩田 机器学习技法https://www.bilibili.com/video/BV1ix411i7yp?p=38
刘峤 《统计机器学习》