一、基本概念
随机森林(RF)是一种组合分类器,它利用 bootstrap 重抽样方法从原始样本中抽取多个样本,对每个 bootstrap 样本进行决策树建模,然后将这些决策树组合在一起,通过投票得出最终分类或预测的结果。大量的理论和实证研究都证明了随机森林算法具有较高的预测准确率,对异常值和噪声具有很好的容忍度,且不容易出现过拟合。
(一)决策树的不足
1.分类规则复杂,一般采用剪枝的办法实现。
2.ID3算法,在选择了一个属性后,不再会朔重新考虑这个选择,容易造成局部最优
3.容易过拟合
为了克服决策树的上述缺点,结合单个分类器组合成多个分类器的思想,这就是随机森林的核心思想。
(二)随机森林的构造步骤
1.为每棵树产生训练集,有放回抽样和不放回抽样,有放回抽样分为无权重抽样和更新权重抽样。无权重抽样,也叫bagging方法,boosting方法也叫更新权重抽样。
2.构建每棵决策树。构造每棵决策树涉及两个重要过程,节点分裂和随机特征的随机选取。现在的节点分裂原则一般都是选C4.5(信息增益率)或CART(基尼系数)。特征的随机选取主要是训练集随机选取,和特征随机选取。
(三)随机森林的优缺点
优点:实现简单,泛化能力强;相比单一的决策树,能学习到特征之间的相互影响,且不容易过拟合;相比SVM,不是很怕特征缺失;训练完成可以给出特征重要性,这个优点主要来源于决策树
缺点:在噪声过大的分类和处理回归问题时还是容易过拟合;相比单一的决策树,他的随机性,让我们难以对模型结果解释。
二、python实例
(一)手写数字识别
#导入必要的包
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split,GridSearchCV,cross_val_score
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt
import numpy as np
#导入数据集
data = load_digits()
x = data.data
y = data.target
RF = RandomForestClassifier(random_state = 66)
score = cross_val_score(RF,x,y,cv=10).mean()
print('交叉验证得分: %.4f'%score)
创建一个随机森林分类器对象RF,并设置了随机种子为66。这里解释一下随机种子的含义:通过固定的种子值,我们可以确保每次运行程序时,得到相同的随机数序列。原理:在计算中,真正的随机数很难生成,通过使用伪随机数生成器来生成看似随机的数值。伪随机数生成器是根据一个初始种子值来生成随机数序列的。如果使用相同的种子值,伪随机数生成器将生成相同的随机数序列。
通过cross_val_score函数随机森林分类器进行交叉验证,cross_val_score函数是用于评估模型性能的函数,它会自动将数据集分成多个子集,这里是10个子集,然后用不同的子集作为训练集和测试集进行多次模型训练和评估,最后返回每次评估的得分。交叉验证结果为0.946。
#训练一个模型,让oob_score=True
RF1 = RandomForestClassifier(n_estimators=25,oob_score=True)
RF1 =RF1.fit(x,y)
#查看oob_score_,即袋外误差
RF1.oob_score_
训练模型,设置25棵树,计算袋外误差。解释一下袋外数据的概念:有放回抽样,每个样本被抽到的概率是1/n,所以不被抽到的概率是1-1/n,所以n个样本都不被抽到的概率就是:(1-1/n)^n,用洛必达法则化简,这个概率收敛到1/e