机器学习算法篇(五)------随机森林
随机森林是一种集成学习算法,通过构建多棵决策树并结合它们的预测结果来提高模型准确性和稳定性。其核心机制包括Bootstrap抽样(样本随机性)和特征随机选择(特征随机性),有效降低过拟合风险。随机森林具有泛化能力强、适用性广、抗噪声等优点,广泛应用于金融、医疗、电商等领域。本文以鸢尾花分类为例,展示了使用Scikit-learn实现随机森林的完整流程,包括数据准备、模型训练、评估和特征重要性分析,
机器学习之随机森林(Random Forest)详解
目录
一、随机森林的基本概念
随机森林(Random Forest)是一种集成学习(Ensemble Learning)算法,由多个决策树(Decision Tree)集成而成。它通过bootstrap抽样和特征随机选择两种随机性机制,综合多棵决策树的预测结果,最终输出更稳定、更准确的预测结论。
其核心思想是"三个臭皮匠顶个诸葛亮"——单棵决策树容易过拟合(对训练数据拟合过好,泛化能力差),而多棵决策树通过合理组合可以降低方差、提升模型的泛化能力。
二、随机森林的核心机制
随机森林的"随机性"体现在两个关键步骤,这也是它优于单棵决策树的核心原因:
1. Bootstrap抽样(样本随机性)
-
从原始训练集中,有放回地随机抽取n个样本(n与原始数据集大小相同),形成一个新的子训练集。
-
每棵决策树都基于不同的Bootstrap子数据集训练,避免因单一数据集的偏差影响模型。
-
未被抽取的样本:每次抽样约有36.8%的样本未被选中(称为"袋外样本,OOB"),可用于无额外验证集时的模型评估。
2. 特征随机选择(特征随机性)
-
在决策树的每个节点分裂时,不从所有特征中选择最优分裂特征,而是随机选择一部分特征(通常为√总特征数或总特征数/2),仅从这部分特征中寻找最优分裂点。
-
该机制降低了多棵决策树之间的相关性,避免"强特征"主导所有树的分裂,提升集成效果的多样性。
三、随机森林的工作流程
1. 训练阶段
-
对原始训练集进行k次Bootstrap抽样,生成k个不同的子训练集(k为决策树数量)。
-
对每个子训练集,构建一棵决策树:
-
每个节点分裂时,随机选择部分特征。
-
不进行剪枝(随机森林通过多棵树的集成降低过拟合,单棵树可保留一定复杂度)。
-
-
重复步骤2,生成k棵独立的决策树,组成随机森林。
2. 预测阶段
-
分类任务:统计所有决策树的预测类别,选择出现次数最多的类别作为最终预测结果(多数投票法)。
-
回归任务:计算所有决策树预测值的平均值,作为最终预测结果(均值法)。
四、随机森林的优缺点
优点
-
泛化能力强:通过样本和特征的双重随机性,有效降低过拟合风险,对噪声数据不敏感。
-
适用性广:支持分类和回归任务,无需对数据做过多预处理(如归一化、标准化),可直接处理混合类型特征(数值型、类别型)。
-
抗缺失值能力:对缺失数据不敏感,可通过特征重要性自动处理部分缺失特征的影响。
-
可解释性较好:能输出特征重要性(通过特征在分裂中的贡献度计算),帮助理解数据规律。
-
训练效率高:多棵树可并行训练(无依赖关系),适合大规模数据集。
缺点
-
计算成本较高:训练多棵决策树需更多计算资源和时间,模型规模较大时推理速度可能较慢。
-
复杂场景下的局限性:在高维稀疏数据(如文本)上,性能可能不如线性模型或深度学习模型。
-
过度拟合极端数据集:当数据集存在大量高度不平衡的类别时,可能倾向于预测多数类。
五、随机森林的关键参数(以Scikit-learn为例)
在实际使用中,需通过调参优化模型性能,核心参数包括:
|
参数 |
作用 |
常用取值范围 |
|---|---|---|
|
n_estimators |
决策树数量,数量过少易欠拟合,过多增加计算成本。 |
100-1000(默认100) |
|
max_features |
每个节点分裂时随机选择的特征数量,控制特征随机性。 |
分类:'sqrt';回归:'log2' |
|
max_depth |
决策树最大深度,限制单棵树复杂度,过深可能过拟合。 |
无限制(默认None)或5-30 |
|
min_samples_split |
节点分裂所需的最小样本数,过小易过拟合。 |
2-20(默认2) |
|
min_samples_leaf |
叶节点所需的最小样本数,过小易过拟合。 |
1-10(默认1) |
|
bootstrap |
是否使用Bootstrap抽样,False则所有树使用原始数据集。 |
默认为True |
|
oob_score |
是否使用袋外样本评估模型,仅当bootstrap=True时有效。 |
默认为False |
六、随机森林的应用场景
随机森林因其稳定性和易用性,在多个领域被广泛应用:
-
金融领域:信用评分、风险预测(如贷款违约概率)。
-
医疗领域:疾病诊断、患者预后分析(结合症状和病史预测病情发展)。
-
电商领域:用户行为预测、商品推荐(通过用户特征预测购买偏好)。
-
环境科学:气候预测、污染溯源(分析多因素对环境的影响)。
-
工业领域:设备故障诊断(通过传感器数据预测设备健康状态)。
七、随机森林实战案例:鸢尾花分类
以下是使用Python的Scikit-learn库实现随机森林分类的完整案例,以经典的鸢尾花数据集为例:
1. 导入库和数据
# 导入必要的库
import numpy as np
import pandas as pd
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, classification_report
from sklearn.feature_selection import SelectFromModel
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data # 特征:花萼长度、花萼宽度、花瓣长度、花瓣宽度
y = iris.target # 标签:3种鸢尾花类别
# 数据集划分(训练集80%,测试集20%)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42 # 固定随机种子,保证结果可复现
)
2. 构建并训练随机森林模型
# 初始化随机森林分类器
rf_model = RandomForestClassifier(
n_estimators=100, # 100棵决策树
max_features='sqrt', # 分类任务默认使用sqrt(n_features)
random_state=42, # 固定随机种子
oob_score=True # 使用袋外样本评估
)
# 训练模型
rf_model.fit(X_train, y_train)
# 查看袋外样本得分(OOB score)
print(f"OOB 得分: {rf_model.oob_score_:.4f}")
3. 模型评估
# 在测试集上预测
y_pred = rf_model.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"测试集准确率: {accuracy:.4f}")
# 详细分类报告(精确率、召回率、F1分数)
print("\n分类报告:")
print(classification_report(
y_test, y_pred,
target_names=iris.target_names # 显示类别名称
))
4. 特征重要性分析
# 输出特征重要性
feature_importance = pd.DataFrame({
'特征': iris.feature_names,
'重要性': rf_model.feature_importances_
}).sort_values(by='重要性', ascending=False)
print("\n特征重要性排序:")
print(feature_importance)
5. 运行结果解读
OOB 得分: 0.9583
测试集准确率: 1.0000
分类报告:
precision recall f1-score support
setosa 1.00 1.00 1.00 10
versicolor 1.00 1.00 1.00 9
virginica 1.00 1.00 1.00 11
accuracy 1.00 30
macro avg 1.00 1.00 1.00 30
weighted avg 1.00 1.00 1.00 30
特征重要性排序:
特征 重要性
2 petal length (cm) 0.449879
3 petal width (cm) 0.431392
0 sepal length (cm) 0.093591
1 sepal width (cm) 0.025138
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)