老饼讲解:一步一步上手学习
好了,今天我们来说说随机森林模型(Random Forest),在xgboost这类模型没出来之前,随机森林也曾是一个热门的模型,只是现在用得越来越少了,但我们还是可以来了解了解一下它,下面我们就来说说随机森林模型的原理,包括模型的表达式、模型的训练方法,以及具体的代码实现例子。
随机森林模型是什么呢?其实简单来说,它就是训练多棵决策树模型,然后再用它们一起来共同决策,由于它由多棵决策树组成,所以也就称为森林了:

如图所示,随机森林就是由多棵决策树,共同来预测得到结果,用数学来表述就是:
其中,代表第i棵决策树对样本给出的概率
好了,上面我们已经知道随机森林中的"森林"是什么意思了,那么它的"随机"又是什么意思呢?这就不得不提随机森林的目的了。我们知道,决策树模型是一个很不错的模型,它只要不断的分割,它的精度可以达到精度上限,但是这样很容易就会过拟合。所以呢,随机森林就想了一个办法,它不要"精英决策树",而是用一群"弱鸡决策树"来共同决策,使得模型避免过拟合。

由于每棵弱决策树都不会过拟合,它们叠加之后也不会过拟合,然后再通过多棵共同决策,从而使得精度提高,这就像我们评分一样,用多个老师来评分,即使每个老题都只是大概评一下分,最终的分数也会很准确。
好了,随机森林训练每棵弱树决策树时,如下训练:
1. 随机样本
使用boostrap抽样来使样本差异化,令每次训练的模型侧重点不一样。
boostrap抽样指的是放回式抽样n次(n是整体样本个数) ,例如整体样本有n个,然后每次都在整体样本中抽样,抽n次得到n个样本。
2. 随机变量
每次只随机抽取部分变量来训练决策树,削弱决策树的拟合能力
这样既可以使每棵树使用的变量不一样,同时又能限制树的深度
随机森林的具体训练流程如下:

1.样本抽取:放回式抽取n(样本个数)次样本
2.变量抽取:随机抽取m个变量,作为本次决策树的变量
3.训练弱树:用抽取的样本、变量训练决策树
一直训练K棵树为止
好了,上面说了随机森林是怎么一回事了,那下面我们就拉点数据出来,玩一玩随机森林吧。
这里我们以iris数据为例,用随机森林来预测iris数据的类别,具体代码如下:
"""
本代码用于展示如何使用sklearn实现随机森林模型
本代码来自:《老饼讲解-机器学习》 www.bbblearn.com
"""
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
import numpy as np
np.random.seed(888) # 为方便复现,设定随机种子
iris = load_iris() # 加载iris数据
X = iris.data # 样本的X
y = iris.target # 样本的y
clf = RandomForestClassifier(max_features=2,n_estimators=100) # 初始化随机森林模型
clf.fit(X, y) # 训练随机森林模型
pred_prob = clf.predict_proba(X) # 预测样本的概率
pred_c = clf.predict(X) # 预测样本的类别
print("\n----前5个样本的真实类别:----") # 打印
print(iris.target[0:5]) # 打印真实类别
print("\n----前5个样本的预测结果:----") # 打印
print(pred_c[0:5]) # 打印预测类别代码运行结果如下:

可以看到,样本的类别预测基本都是正确的。
好了,大概可以看到,在代码中我们设置了max_features和n_estimators两个参数。
max_features是特征最大个数,它一般远小于总特征个数M,例如设为 。
n_estimators是森林规模数,也就是决策树棵数,一般设为100,因为太小会导致模型准确度不够,太大又会导致模型过于复杂。
这节我们又学习了随机森林模型,它同时训练多个弱决策树模型,然后共同预测,这种集成方法也称为Bagging集成,这样做的好处是使得模型泛化能力更好、更加稳定。而在使用时,就要注意设置好特征最大个数、森林规模数,这是随机森林两个比较重要的参数。
评论