集成学习应用:随机森林算法

 
随机森林(Random Forest,简称RF)是通过集成学习的思想将多棵树集成的一种算法,它的基本单位是决策树模型,而它的本质属于机器学习的一大分支——集成学习(Ensemble Learning)方法。我们知道,集成学习的实现方法主要分为两大类,即 Bagging 和 boosting 算法,随机森林就是通过【Bagging 算法+决策树算法】实现的。前面已经学习过决策树算法,因此随机森林算法会很容易理解。

决策树和随机森林

下面对决策树算法做简单的回顾:决策树(decision tree)是一个树结构(可以是二叉树或非二叉树)。

1) 决策树

决策树选取了一个特征维度作为判别条件,在数据结构中通常称之为“根节点”,根节点通过 if-else 形成最初的分支,如果这时分类没有完成,刚刚形成的分支还需要继续形成分支,这就是决策树的第一个关键机制:节点分裂。在数据结构中,分支节点通常称为叶子节点,如果叶子节点再分裂形成节点,就称为子树。

叶子节点可能不断分类形成子树,正如 if-else 语句可以不断嵌套 if-else,利用这个机制,一次判别不能完全达到把数据集划分成正类和负类的效果,那就在判别结果中继续进行判别。决策树通过叶子节点不断分裂形成子树,或者说通过 if-else 不断嵌套 if-else,每一次分裂都相当于一次对分类结果的“提纯”,不断重复这个过程,最终就达到分类目标了。

决策树一般有 ID3、ID4.5、CART 这三种算法。其中最常用的是 CART 树(classification and regression tree,即分类回归树算法),它是一棵二分树,在每个节点做出决策时只能选择是或否。CART 树生成的主要思想就是分裂。每个准备分裂的节点,都会从数据集中选择一个最优特征的最优值作为分裂的条件,将数据分成两部分想要了解更多地了解决策树可点击前往《决策树分类算法(if-else原理)》。

2) 随机森林

随机森林,顾名思义,即使用随机的方式建立一个森林,这个森林由很多的决策树组成,并且每一棵决策树之间是相互独立的。

如果训练集有 M 个样本,对于每棵数而言,以随机且有放回的方式从训练集中抽取 N 个训练样本(N<M),作为该棵决策树的训练集。除了采用样本随机之外,随机森林还采用了特征随机。假设每个样本有 K 个特征,从所有特征中随机选取 k 个特征(k<=K),选择最佳分割属性作为节点建立 CART 决策树,重复该步骤,建立 m 棵 CART 树,这些树就组成了森林,这也是随机森林名字的由来。随机采样和随机特征选取在一定程度上避免了过拟合现象的发生。

当有一个新的输入样本进入森林时,就让森林中的每一棵决策树分别对其进行判断,看看这个样本应该属于哪一类(对于分类算法而言),然后使用少数服从多数的【投票法】,看看哪一类被选择最多,就预测该样本为哪一类。

举个形象化的例子:森林中召开动物大会,讨论某个动物是狼还是狗,每个树都要独立地发表对这个问题的看法,也就是每一棵树都要投票,并且只能投是或否。依据投票情况,最终得票数最多的类别就是对这只动物的认定结果。在这个过程中,森林中每棵数都是独立地对若干个弱分类器的分类结果进行投票选择,从而组成一个强分类器。

随机森林既可以处理属性为离散值的样本(即分类问题),也可以处理属性为连续值的样本(即回归问题),另外随机森林还可以应用于无监督学习的聚类问题,以及异常点检测。

算法应用及其实现

作为一种新兴的、高度灵活的机器学习算法,随机森林(Random Forest,简称 RF)拥有广泛的应用前景,它在金融、医疗等行业大放异彩,比如银行预测借贷顾客的风险等级,医药行业可以采用随机森林算法来寻找正确的药品成分组合,同时该算法业也可以对病人的既往病史进行分析,这非常有助于确诊病人的疾病。

在 Scikit-Learn 机器学习库中提供了 Bagging 和 Boosting 两种集成学习方法,且都在 ensemble 类库下,包括随机森林算法。除此之外,该类库下还包含了其他几类算法,较为知名有如下几种:

  说明
RandomForestClassifier类 使用随机森林(Random Forest)算法解决分类问题,随机森林可谓 Bagging 集成学习算法的典型代表,它选择以 CART 决策树算法作为弱学习器,是一种常用的机器学习算法。
RandomForestRegressor类 使用随机森林算法解决回归问题
ExtraTreesClassifier类 使用极端随机树(Extra Tree)算法解决分类问题,极端随机树算法可以看作随机森林算法的一种变种,主要原理非常类似,但在决策条件选择时采用了随机选择的策略。
ExtraTreesRegressor类 使用极端随机树算法解决回归问题。
AdaBoostRegressor类 使用AdaBoost算法解决分类问题,AdaBoost算法是最知名的Boosting算法之一。
AdaBoostRegressor类 使用AdaBoost算法解决回归问题。
GradientBoostingClassifier类 使用Gradient Boosting算法解决分类问题,Gradient Boosting算法常常搭配CART决策树算法使用,这就是有名的梯度提升树(Gradient Boosting Decision Tree,GBDT)算法。
GradientBoostingRegressor类 使用Gradient Boosting算法解决回归问题。

Scikit-Learn 对于集成学习方法做了非常良好的封装,可以实现“开箱即用”,下面以随机森林算法为例进行演示:
from sklearn.datasets import load_iris
#从Scikit-Learn库导入集成学习模型的随机森林分类算法
from sklearn.ensemble import RandomForestClassifier
#载入鸢尾花数据集
X, y = load_iris(return_X_y=True)
#训练模型
#随机森林与决策树算法一样,其中有一个名为“criterion”的参数
#同样可以传入字符串“gini”或“entropy”,默认使用的是基尼指数
clf = RandomForestClassifier()
clf.fit(X, y)
print("模型预测准确率",clf.score(X, y))
#使用模型进行分类预测
print("预测结果:",clf.predict(X))
输出结果如下所示:
模型预测准确率 1.0 
预测结果: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2]

总结

随机森林算法是集成学习方法的典型代表,该算法具有以下特点:
  • 模型准确率高:随机森林既可以处理分类问题,也可以处理回归问题,即使存在部分数据缺失的情况,随机森林也能保持很高的分类精度;
  • 能够处理数量庞大的高维度的特征,且不需要进行降维(因为特征子集是随机选择的);
  • 能够评估各个特征在分类问题上的重要性:可以生成树状结构,判断各个特征的重要性;
  • 对异常值、缺失值不敏感。

当然随机森林算法也存在一些不足,比如:
  • 随机森林解决回归问题的效果不如分类问题;
  • 树之间的相关性越大,错误率就越大;
  • 当训练数据噪声较大时,容易产生过拟合现象。

截止到目前,我们已经学习了机器学习中常用的回归算法、分类算法和聚类算法,相信通过这些知识点的学习,您对机器学习算法有了初步了解和掌握。每种算法各有千秋,在学习的时候,我们要更多的关注每种模型的原理、结构以及数学实现,只有在掌握了这些之后,我们才能提高自己认知能力,当遇到其他算法时,才能做到触类旁通、应对自如。