随机森林模型

305 阅读5分钟

一、 集成模型简介

集成学习模型使用一系列弱学习器(也称为基础模型或基模型)进行学习,并将各个弱学习器的结果进行整合,从而获得比单个学习器更好的学习效果。集成学习模型的常见算法有Bagging算法和Boosting算法两种。Bagging算法的典型机器学习模型为随机森林模型,而Boosting算法的典型机器学习模型则AdaBoost、GBDT、XGBoost和LightGBM模型。

1、Bagging算法

Bagging算法的原理类似投票,每个弱学习器都有一票,最终根据所有弱学习器的投票,按照“少数服从多数”的原则产生最终的预测结果,如下图所示。

image.png

假设原始数据共有10000条,从中随机有放回地抽取10000次数据构成一个新的训练集(因为是随机有放回抽样,所以可能出现某一条数据多次被抽中,也有可能某一条数据一次也没有被抽中),每次使用一个训练集训练一个弱学习器。这样有放回地随机抽取n次后,训练结束时就能获得由不同的训练集训练出的n个弱学习器,根据这n个弱学习器的预测结果,按照“少数服从多数”的原则,获得一个更加准确、合理的最终预测结果。

具体来说,在分类问题中是用n个弱学习器投票的方式获取最终结果,在回归问题中则是取n个弱学习器的平均值作为最终结果。

2、Boosting算法

Boosting算法的本质是将弱学习器提升为强学习器,它和Bagging算法的区别在于:Bagging算法对待所有的弱学习器一视同仁;而Boosting算法则会对弱学习器“区别对待”,通俗来讲就是注重“培养精英”和“重视错误”。

“培养精英”就是每一轮训练后对预测结果较准确的弱学习器给予较大的权重,对表现不好的弱学习器则降低其权重。这样在最终预测时,“优秀模型”的权重是大的,相当于它可以投出多票,而“一般模型”只能投出一票或不能投票。

“重视错误”就是在每一轮训练后改变训练集的权值或概率分布,通过提高在前一轮被弱学习器预测错误的样例的权值,降低前一轮被弱学习器预测正确的样例的权值,来提高弱学习器对预测错误的数据的重视程度,从而提升模型的整体预测效果。

上述原理如下图所示。

image.png

二、 随机森林模型的基本原理

随机森林(Random Forest)是一种经典的Bagging模型,其弱学习器为决策树模型。如下图所示,随机森林模型会在原始数据集中随机抽样,构成n个不同的样本数据集,然后根据这些数据集搭建n个不同的决策树模型,最后根据这些决策树模型的平均值(针对回归模型)或者投票情况(针对分类模型)来获取最终结果。

image.png

为了保证模型的泛化能力(或者说通用能力),随机森林模型在建立每棵树时,往往会遵循“数据随机”和“特征随机”这两个基本原则。

1、数据随机

从所有数据当中有放回地随机抽取数据作为其中一个决策树模型的训练数据。例如,有1000个原始数据,有放回地抽取1000次,构成一组新的数据,用于训练某一个决策树模型。

2、特征随机

如果每个样本的特征维度为M,指定一个常数k<M,随机地从M个特征中选取k个特征。在使用Python构造随机森林模型时,默认选取特征的个数k为

与单独的决策树模型相比,随机森林模型由于集成了多个决策树,其预测结果会更准确,且不容易造成过拟合现象,泛化能力更强。

3、代码实现

和决策树模型一样,随机森林模型既能进行分类分析,又能进行回归分析,对应的模型分别为随机森林分类模型(RandomForestClassifier)和随机森林回归模型(RandomForestRegressor)。随机森林分类模型的弱学习器是分类决策树模型,随机森林回归模型的弱学习器则是回归决策树模型。

4、随机森林分类代码

from sklearn.ensemble import RandomForestClassifier as rfc
x = [[1,2],[3,4],[5,6],[7,8],[9,10]]
y = [0,0,0,1,1]
model = rfc(n_estimators=10,random_state=123)
model.fit(x,y)
model.predict([[5,5]])

第1行代码引入随机森林分类模型相关库RandomForestClassifier。

第2行代码中的X是特征变量,共有2个特征。

第3行代码中的y是目标变量,共有2个分类——0和1。

第4代码引入模型,并设置弱学习器的数量n_estimators为10,即共有10个决策树模型作为弱学习器;设置random_state为123,使得每次运行结果一致(如果不设置则可能出现每次预测结果不一样的情况,这是因为随机森林遵循“数据随机”和“特征随机”的基本原则)。

第5行代码用fit()函数训练模型。

第6行代码用predict()函数进行预测,预测结果如下。

array([0])

5、随机森林回归模型

from sklearn.ensemble import RandomForestRegressor as rfr
x = [[1,2],[3,4],[5,6],[7,8],[9,10]]
y = [1,2,3,4,5]
model = rfr(n_estimators=10,random_state=123)
model.fit(x,y)
model.predict([[5,5]])

输出如下:

array([2.8])