自学教程 学编程从这里开始

随机森林

随机森林(Random Forest)属于Bagging集成学习,以决策树为基础学习器,通过多棵独立决策树投票得到预测结果,是工业界非常常用的模型。

1. 基本原理

随机森林有两层随机,也是它和普通Bagging最核心的区别:

  1. 样本随机:对原始数据集做有放回自助采样(Bootstrap),每一棵树拿到不一样的训练样本子集。
  2. 特征随机:每一次节点分裂时,只从全部特征里随机挑选一部分特征来寻找最优分裂条件。

训练流程:

  • 并行训练多棵决策树,树与树之间独立;
  • 分类任务:所有树预测结果投票,票数最多的类别作为最终结果;
  • 回归任务:所有树预测值取平均值作为最终结果。

两层随机降低树和树之间的相关性,减少整体方差,抑制单棵决策树容易过拟合的问题。

2. 重要参数

  • n_estimators:树的数量,树越多,效果越稳定,但训练和推理速度变慢;到达一定数量后,提升很小。
  • max_depth:单棵树最大深度,用来限制单树过拟合。
  • max_features:每次分裂随机选取的特征数量。
  • min_samples_split:节点继续分裂所需的最小样本数。

3. 特征重要性

随机森林可以直接输出特征重要度,用来辅助特征筛选:

  • 原理:统计某个特征在所有树的分裂中,减少的不纯度(基尼/熵)总和;
  • 注意:仅代表对模型划分有用,不等于业务上的因果关系。

4. 优缺点

✅ 优点

  • 继承决策树的优势:不需要特征归一化,能同时处理连续、离散特征
  • 抗过拟合能力远强于单决策树
  • 天然支持并行训练,训练速度不错
  • 自带特征重要性输出,方便做特征工程
  • 对异常值、噪声鲁棒性较好

❌ 缺点

  • 模型可解释性变差,多棵树组合很难像单决策树一样读出清晰规则
  • 对超高维稀疏数据(如长文本)效果一般
  • 处理回归任务时,预测输出不能超过训练集标签的取值范围

5. Python 代码示例

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score

# 字体配置,解决 DejaVu Sans 中文缺失警告
plt.rcParams['font.sans-serif'] = ['SimHei', 'DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False

# 加载数据集
data = load_iris()
X = data.data
y = data.target
feature_names = data.feature_names

# 划分训练集、测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 构建随机森林
model = RandomForestClassifier(n_estimators=50, max_depth=3, random_state=42)
model.fit(X_train, y_train)

# 预测评估
y_pred = model.predict(X_test)
acc = accuracy_score(y_test, y_pred)
print(f"测试集准确率:{acc:.2f}")

# 输出特征重要性
print("特征重要性:")
for name, score in zip(feature_names, model.feature_importances_):
    print(f"{name}: {score:.3f}")

# 绘制特征重要性柱状图
plt.bar(feature_names, model.feature_importances_, color="#4472c4")
plt.xticks(rotation=15)
plt.title("随机森林 - 特征重要性")
plt.tight_layout()
plt.show()

结果:

6. 适用场景

  • 结构化表格数据:风控、用户画像、销量预测
  • 需要快速拿到特征重要性,做特征筛选
  • 作为机器学习基线模型,对比其他算法效果

7. 常见误区

  1. 树越多效果一定越好:n_estimators 超过阈值后,精度不再提升,只会增加耗时
  2. 随机森林不会过拟合:单棵树深度过大、树数量很多时依然会过拟合
  3. 特征重要性高就是业务上最重要的变量:只代表对模型划分有帮助,不代表因果

思考题

  1. 随机森林为什么要同时做样本随机和特征随机?
  2. 随机森林属于Bagging,它主要降低偏差还是方差?
标签:

0 条笔记