随机森林定义

        随机森林(Random Forest,RF),顾名思义就是将多棵相互之间并无关联的决策树整合起来形成一个森林,再通过各棵树投票或取均值来产生最终结果的分类器。在介绍随机森林前需要了解几个概念:Bootstrap 自助抽样法、Bagging 套袋法和 Boosting 提升法。

        Bootstrap 是一种抽样方法,即采取随机有放回的方式采样数据,也就是每次抽取一个样本,再将其放回样本集中,下次还有可能抽到这个样本;而每轮中未抽到的数据组合起来,形成袋外数据集(Out of Band, OOB),用来在模型中做测试集。Bangging 和 Boosting 都是一种集成学习的方法,但两者有一些区别。Bagging 算法使用 Bootstrap 方法从原始样本集中随机不一定有放回的抽取n个样本,共抽取k轮,得到k个独立的训练集,元素可能有重复。每个训练集训练一个模型,得到k个结果,分类问题则从结果中取多数值作为最终结果,回归问题则取平均值作为最终结果。Boosting 则是对每个训练样本设立一个权值,被错分的样本在下一轮分类中会有更大的权值,也就是说,每轮样本相同但样本权重不同;对于分类器来说,分类误差小的拥有更大权值,分类误差大的相应权值更小。

        随机森林采取的就是 bagging 方法,它将决策树用作 bagging 后的子分类模型。首先,对原始数据集使用 bootstrap 随机抽样的方法生成多个子训练集和相应的测试集,每个子训练集都构造一颗独立的决策树。其次,在构造决策树时,随机森林并不是在所有特征中找到性能最佳的特征进行分类,而是随机抽取一部分特征,在抽到的特征中间找到最优解应用于树节点进行分裂,这也是随机森林中两个关键随机步骤。最后由每个决策树投票产生最终的分类结果。随机森林由于有了 bagging,也就是集成的思想在,实际上相当于对样本和特征都进行了随机采样,所以可以避免过拟合。Bagging 策略过程如图(a)所示,随机森林过程如图(b)所示。 

随机森林构建过程 

        随机森林的构建过程用文字表述大致如下:假设原始样本集 D(X,Y),样本个数 n,要建立 k 棵树。

1) 抽取样本集:从原始训练集中随机有放回地抽取n个样本(子训练集)并重复n次,每一个样本被抽中的概率均为1/n。被剩下的样本组成袋外数据集(OOB),作为最终的测试集。

2) 抽取特征:从总数为 M 的特征集合中随意抽取m个组成特征子集,其中m<M。

3) 特征选择:计算节点数据集中每个特征对该数据集的基尼指数,选择基尼指数最小的特征及其对应的切分点作为最优特征与最优切分点(一般方法有 ID3、CART 和信息增益率),从节点生成两个子节点,将剩余训练数据分配到两个子节点中。

4) 生成 CART 决策树:在每个子节点的样本子集中重复执行3)步骤,递归地进行节点分割,直到生成所有叶节点。

5) 随机森林:重复执行(2)~(4),得到k棵不同的决策树。 

6) 测试数据:每一棵决策树都对测试集中的每一条数据进行分类,统计 k 个分类结果,票数最多的类别,即为该样本的最终类别。

随机森林算法评价

        随机森林相比于传统的分类算法在分类进度上要更进一步,其次,在其他方面也有着不小的优势:

1)随机森林通过抽取不同的训练集以及随机抽取特征进行训练的方式,来达到增加分类模型间差异的目的,最终结果由彼此之间并无相关性的多棵决策树共同决定,可以很好地避免决策树分类中的过拟合问题。并且计算精度较决策树有很大提升。

2)Bagging方法产生的袋外数据集OOB可以用来做测试集,也可以做OOB估计计算出单个变量的重要程度,以此来测算模型的泛化误差。

3)随机森林一般采用 CART 作为分割特征方法,因此,随机森林可以灵活地处理连续变量或离散变量,同时不需要对变量值做归一化,大大减少了数据处理的步骤。

4)随机抽取样本和随机选取特征值是随机森林算法最大的特征之一,因此,算法能很好地容忍异常值和缺失值,避免个别差值对模型造成过大影响。

5)随机森林算法在训练过程中产生的多棵决策树之间并无关联性,因此算法非常适合在并行环境下运行,加入并行计算框架可以大大减少大体量数据集的训练时间。

        尽管随机森林优势如此明显,但是该算法在特殊的应用场景下仍然有一些劣势,如医学数据、基金信贷数据等,这类数据有两个很大的特点:特征非常多且易缺失、不同种类数据量相差悬殊。第一,算法的分类思想是少数服从多数,因此在面对类别样本数相差悬殊的数据集时,容易将少数类归为多数类,造成很高的假分类精度;第二,过多的冗余特征会扰乱模型的学习能力,导致模型过拟合,限制了模型的普适性。因此,算法在这两点上有很大的改进空间。    

随机森林算法的发展现状及趋势    

        随机森林算法采用多分类器投票的策略,本身能很好地避免过拟合问题,其中两次典型的抽样过程也使得随机森林相对于传统分类器,在解决特征冗余和过拟合问题方面有更好表现。然而,当不平衡率增加(例如正负类数量比超过 5:1)时,随机森林偏向将少数类归为多数类,造成假的高分类精度;另外,特征维度过高时,会降低单个分类器的分类性能,导致算法的整体分类能力被削弱。

        多年来,原始随机森林算法被多次很多改进,如分别通过聚类方式、贪婪方法挑选出一批具有代表性的高精度低相似性决策树,这些方法提高了部分数据集的分类精度,但对上述提到的医疗健康大数据效果甚微,因此本节主要对随机森林在特征选择和不平衡领域研究现状进行分析。

1. 特征选择领域 

        良好的特征选择方法应该能有效地从所有特征中选择出最有用的一批特征,一些学者对此进行了大量研究。粗糙集、邻域互信息、聚类、ReliefF 算法等都是常见的筛选出强分类能力特征的方法,在随机森林中也有广泛的应用,如有人提出了卡方检验与随机森林结合的算法,用卡方检验对特征进行排序并分为不同区间,随机森林抽取不同区间的特征构建决策树,该方法能减轻过拟合的问题,但也会导致结果产生偏向性;有人提出了一种基于最大互信息系数的随机森林算法,利用最大互信息衡量特征的区分能力,并将特征分为高中低三个子集,从每个子集中抽取特征构建决策树,很好地避免了干扰树的产生,但是每棵树分类能力过于平均,容易引起过拟合问题;Vakharia 等先用 ReliefF 算法计算特征的权重,删除低于权值的特征后再进行随机森林训练,有效地提高了轴承故障诊断的准确率;也有人利用肯德尔系数来代替随机森林的随机特征选择步骤,在医学数据集中取得了不错的效果。

2. 不平衡分类领域 

        不平衡数据指的是在某一个数据集中不同类型的样本数量悬殊过大。常用的一些解决方法如过采样、欠采样、混合抽样等是从数据层面来使数据集达到相对类均衡,还有SMOTE、GAN 等方法是从算法层面通过一定的计算来生成新的少数类,也能有效的解决不平衡问题。已经有不少学者将上述方法应用到随机森林中,如有人通过对多数样本欠采样,对少数样本过采样的方式使数据相对类均衡,并在随机森林算法中进行实验,一定程度下提高了算法的分类精度,但是数据量缩减了很多;有人采用 SMOTE 算法计算出一批少数类样本,降低了数据的不平衡程度,然而该方法不能保证伪样本的类型正确性;有人提出了一种基于 GAN 的随机森林算法,采用集成学习 GAN 来生成少数类,以得到分布平衡的数据集;还有其他针对不平衡问题的改进研究,如有人等提出了一种基于随机森林算法的类权重投票(CWsRF)算法,为每个类分配单独的权重,有效提高了少数类的识别性能;也有人采用 k-means 聚类算法计算每个类的区分度,将区分度应用到随机森林的特征选择步骤中,减轻了不平衡数据集对算法的影响。

用鸢尾花数据做随机森林模型

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.datasets import load_iris
import warnings
warnings.filterwarnings('ignore')
# 加载数据
iris = load_iris()
X = iris.data
y = iris.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)
# 训练模型
rnd_clf = RandomForestClassifier(oob_score=True)
rnd_clf.fit(X_train, y_train)
# 预测测试集
y_pred_rf = rnd_clf.predict(X_test)
print(accuracy_score(y_test, y_pred_rf)) # 打印准确率
print(rnd_clf.oob_score_)
 
# Feature Importance
iris = load_iris()
rnd_clf = RandomForestClassifier(n_estimators=500, n_jobs=-1)
rnd_clf.fit(iris["data"], iris['target'])
for name, score in zip(iris['feature_names'], rnd_clf.feature_importances_):
    print(name, score)
0.98
0.93
sepal length (cm) 0.09958835116329184
sepal width (cm) 0.023272108712879234
petal length (cm) 0.4459461998159546
petal width (cm) 0.43119334030787426

准确率为0.98,其中4个特征中petal length和petal width重要程度分值较大,重要性较大

总结

随机森林

1、随机选择样本(放回抽样);

2、随机选择特征;

3、构建决策树;

4、随机森林投票(平均)

优点:

1. 表现良好

2. 可以处理高维度数据(维度随机选择)

3. 辅助进行特征选择

4. 得益于 bagging 可以进行并行训练

缺点: 对于噪声过大的数据容易过拟合