- 随机森林(Random forest, RF)是 Breiman 教授在 2001 年提出的集成学习方法,是一种统计学习理论。它是基于装袋法Bagging集成理论实现的,利用自助法 bootstrap抽样技术从原始数据集中有放回地抽取多个不同的训练数据集,再结合随机子空间方法对每个bootstrap 数据集进行决策树建模,组成随机森林。在模型预测时,将测试数据输入模型,对多棵决策树的输出类别进行投票得到最终的预测结果。
决策树介绍
- 决策树是一种经典的数据挖掘方法,以一种自动生成判断规则的方式进行建模。它可以表达复杂的非线性模式和特征相互关系。
- 决策树算法是基于分治法来解决分类问题的,训练时通过自上而下地在每一个阶段中评估特征分割的信息增益,选出分割数据集最优的特征,然后对分隔所得的子问题进行递归处理,数据被分配到树状结构的不同分支中,重复以上过程直到满足递归停止条件为止。
- 停止条件:
- 当前结点数据集样本属于同一个类别
- 当前结点数据集的可选特征集为空
- 当前结点的样本个数为 0,不能划分
- 决策数的特征选择
- 信息增益(information gain)
- 信息增益表示在已知特征 X 的情况下,类 Y 的信息不确定性减少的程度
- 给定当前样本集合为D,D中第k 类样本所占的比例为当前结点样本集合D的信息熵定义为:
- 在已知离散特征 A的条件下,假设 A有 n 个可取值,则根据这 n 个值对样本集合D进行划分,得到 n 个分支结点,分别计算各个分支点的信息熵和权重,可以得到条件信息熵
- 根据特征A对当前结点数据集D进行划分的信息增益计算如下:
- 则最优特征划分标准为:
- 使用信息增益准则存在偏向于选择取值较多的特征的问题
- 增益率
- 最优划分特征的标准是选择增益率最高的特征
- 基尼系数:
- 采用基尼系数衡量数据集的不纯度(混乱程度),基尼系数越小说明数据不纯度低,特征越显著。
- 样本D的基尼系数为:
- 其中为D中第k类样本所占的比例
- 假设D中A特征有n个取值,在A已知的条件下,样本集合D的基尼指数为:
- 最优特征选择标准为
- 均值或者均方根误差
- 计算回归数据真实目标值中所有数据的均值,每条数据真实目标值减去均值。使用差值的绝对值或者差值的平方来衡量回归数据的混乱程度。若果采用差值的平方来衡量,那么就是平方误差的总值(总方差)。
随机森林训练过程描述
- 假设原始数据集D有 N 个样本,由M 个输入特征和一个目标值 Y 组成。随机森林组合多个独立训练的决策树形成森林。
- 在构建决策树之前,使用自助法(bootstrap method)抽样技术从原始数据集D中有
放回地抽取K 个训练数据集 - 采用分类回归树(classification and regression tree, CART)方法构建基分类器模型。在树的结点处,从M 个输入特征中随机选择m个特征(m<= M)作为决策树当前结点的分裂特征集,从中选择最优分裂特征和切分点,将训练数据集划分到两个子结点中去。选择分裂特征及切分点的标准是基尼指数(Gini index)最小化准则(用于分类)或均方误差(MSE)最小化准则(用于回归)
- 将K 个 bootstrap 样本集按照 2 的方式逐个训练决策树模型得到 ,把所有生成的决策树组合成一个随机森林模型,即KaTeX parse error: Expected '}', got 'EOF' at end of input: {T_1,T_2, T_3,…,T_nKaTeX parse error: Expected 'EOF', got '}' at position 1: }̲
- 将输入数据X输入后,得到{}, RF 算法通过对每棵树的结果进行统计来做出最终预测,对于回归问题,使用简单取平均值的方法取预测数据最终的平均值作为计算结果。
随机森林的python实现
- 随机森林和决策树均可以通过python中的sklearn库实现
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_wine
# 加载红酒数据
wine = load_wine()
# 加载sklearn中的训练集和测试集分割函数
from sklearn.model_selection import train_test_split
Xtrain, Xtest, Ytrain, Ytest = train_test_split(wine.data,wine.target,test_size=0.3)
clf = DecisionTreeClassifier(random_state=0)
rfc = RandomForestClassifier(random_state=0)
clf = clf.fit(Xtrain,Ytrain)
rfc = rfc.fit(Xtrain,Ytrain)
score_c = clf.score(Xtest,Ytest)
score_r = rfc.score(Xtest,Ytest)
print("Single Tree:{}".format(score_c)
,"Random Forest:{}".format(score_r)
)
参考:
菜菜的sklearn
王凯. 基于改进随机森林算法的P2P贷前信用风险评估方法研究[D].南京邮电大学,2020.