0%

Machine Learning | 随机森林 // Random Forest

随机森林

  • 随机森林是一种判别分类方法

  • 随机森林是建立在Post not found: 决策树基础上的集成学习器(一个包含多个决策树的分类器;输出结果由各个树的输出结果的众数决定)

  • 是bagging的一个特殊进阶版

  • 随机森林=Bagging+随机选择特征
    $$Random Forest=Bagging+Decision Tree$$

  • 随机森林的弱学习器都是决策树(CART)

  • 如何产生不同的决策树(Decision Tree,DT)?

    • 每棵决策树使用训练集的Bootstrap随机采样样本
    • 每个根节点(node)使用不同的特征子集
  • 树的数目通常不少于500棵

  • 不需要剪枝;在构建决策树时,RF的每棵决策树都最大可能地进行生长而不进行剪枝

  • 概括RF包括4部分:

    1. 随机选择样本
    2. 随机选择特征
    3. 构建决策树
    4. 随机森林投票(平均)
  • 每个基学习器只使用了训练集中约63.2%的样本,剩下约36.8%的样本可用作验证集来对其泛化性能进行“包外(Out of Bag)估计”

  • 随机森林不需要归一化/标准化

概率模型(树形模型)不需要归一化。因为它们不关心变量的值,而是关心变量的分布和变量之间的条件概率,如决策树、随机森林

RF vs GBDT

随机森林RF GBDT
相同点 1.都是由多棵树组成
2.最终的结果都是由多棵树一起决定
子树 可以是分类树或回归树 只能是回归树
并行生成子树 串行(序列)生成子树
集成方法 多数投票 将所有结果累加 或 加权累加
异常值 不敏感 敏感
对训练集一视同仁 基于权值的弱分类器的集成
减少方差 减少偏差
容易过拟合

实现代码

Python

  • 使用sklearn.ensemble包中的RandomForestClassifier函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_auc_score, accuracy_score, precision_score, recall_score, f1_score

df ## 用于建模的数据DataFrame
X = df[xCols] ## xCols表示作为解释变量的列名列表
y = df[yCol] ## yCol表示作为被解释变量的列名

## 建模通用参数
RandomState = 2022 ## 便于数据分割复现
TrainSize = 0.7 ## 用于训练的数据集大小(0.7表示70%)
F_RandomState = 11 ## 用于训练模型复现

## 分割数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=TrainSize, random_state=RandomState)

## 训练模型
forest_model = RandomForestClassifier(n_estimators=1000, random_state=F_RandomState, n_jobs=-1)
forest_model.fit(X_train, y_train)

## 预测
y_pred = forest_model.predict(X_test) ## 预测结果为离散值
y_prob = forest_model.predict_proba(X_test)[:, 1] ## 预测结果为概率值
y_train_pred = forest_model.predict(X_train)

## 计算AUC值
roc_auc_score(y_test, y_prob)

## 预测精度
print("训练数据集上的精度:", accuracy_score(y_train, y_train_pred))
print("测试数据集上的精度:", accuracy_score(y_test, y_pred))

## 假设被解释变量的枚举值为B、C
## 若B为正样本标签,计算精确度、召回率、f1值
precision_score(y_test, y_pred, pos_label='B')
recall_score(y_test, y_pred, pos_label='B')
f1_score(y_test, y_pred, pos_label='B')
## 若C为正样本标签,计算精确度、召回率、f1值
precision_score(y_test, y_pred, pos_label='C')
recall_score(y_test, y_pred, pos_label='C')
f1_score(y_test, y_pred, pos_label='C')

参考资料

Thank you for your approval.

欢迎关注我的其它发布渠道