摘要:本文系统介绍了随机森林算法的核心概念、特点、优缺点及API使用方法,并通过一个完整的垃圾邮件二分类实战案例展示了如何应用随机森林解决实际问题。文章首先阐述了随机森林作为集成学习算法的基本原理,然后详细分析了其数据采样随机、特征选取随机等核心特点,接着列举了算法的优缺点和关键API参数,最后通过Spambase数据集实战演示了从数据预处理、参数调优到模型评估的全流程,为读者提供了从理论到实践的完整学习路径。
一、什么是随机森林
一种集成学习算法(集成学习:是将多个基学习器进行组合来实现比单一学习器显著优越的学习性能),由多个决策树组成,广泛用于分类、回归等任务。其核心思想是通过构建大量相互独立的决策树,并将它们的预测结果进行集成,从而提升模型的准确性和鲁棒性。
二、随机森林的特点
数据采样随机,特征选取随机,森林,基分类器为决策树。
数据采样随机的意思是,每个决策树的所训练的数据集都是随机在数据集中抽取的,因为每个决策树的数据集不一样,所以生成的每个决策树都不一样。
同样的特征随机选取也是,并不会全部训练而是随机的选取进行训练,特征的随机选取,可以让我们知道哪些特征重要,哪些不重要。
森林是指,有多个决策树构建的。
基分类器为决策树:每个基分类器全部都是决策树,没有其他的算法。
随机森林可以实现分类也可以实现回归。
三、随机森林的优缺点
优点:
1、具有极高的准确率。
2、随机性的引入,使得随机森林的抗噪声能力很强。
3、随机性的引入,使得随机森林的不容易过拟合。
4、能够处理很高维度的数据,不用做特征选择。
5、容易实现并行化处理。
缺点:
1、当随机森林中的决策树个数很多时,训练时需要t的空间和时间会比较大。
2、随机森林模型还有许多不好解释的地方,有点算个黑盒模型。
四、随机森林的API
| n_estimators | int | 树的数量 | 越大越稳定,但训练越慢。常用 100-500 |
| max_depth | int / None | 树的最大深度 | 默认None(不限制),一般设 3-15 防过拟合 |
| min_samples_split | int / float | 内部节点分裂所需的最小样本数 | 默认2,设 5-20 防过拟合 |
| min_samples_leaf | int / float | 叶子节点最小样本数 | 默认1,设 2-10 防过拟合 |
| max_features | int / float / str | 分裂时考虑的最大特征数 | 'sqrt'(默认)、'log2' 或整数 |
| bootstrap | bool | 是否自助采样(有放回) | 默认True |
| oob_score | bool | 是否使用袋外样本来评估 | 默认False,设为True可查看袋外评分 |
| n_jobs | int | 并行计算核心数 | -1 表示使用所有核心 |
| random_state | int | 随机种子 | 固定后结果可复现 |
五、随机森林的实战案例—垃圾邮件二分类
本次实验基于经典的Spambase垃圾邮件数据集,构建随机森林二分类模型以实现邮件的自动识别。数据集共包含4601条样本,每条样本由57维数值特征构成,涵盖词频统计、特殊字符占比以及大写字母序列等邮件文本的量化属性,标签为二分类(1表示垃圾邮件,0表示正常邮件)。实验采用分层K折交叉验证策略系统性地搜索最优预剪枝参数组合,在保证模型精度的同时有效抑制过拟合风险,最终构建出具备高泛化能力的随机森林模型。
1.模型库导入
# 导入所需工具库
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split, cross_val_score, StratifiedKFold
from sklearn.metrics import classification_report, confusion_matrix
from sklearn.ensemble import RandomForestClassifier
- pandas 为了读取数据集
- matplotlib是Python 的画图库,用来把数字变成图表(折线图、柱状图、热力图等)。 在机器学习中,它用来可视化数据分布、模型效果、参数调优过程等,让你“用眼睛看数据”,比看一串数字直观得多。
- train_test_split 是用来划分训练集和测试集的
- cross_val_score 是一个“交叉验证快捷函数
- StratifiedKFold 是一个用于交叉验证的数据切分工具。它和普通 KFold 的区别在于:它会在切分时“分层”,确保每一折中垃圾邮件和正常邮件的比例都和原始数据保持一致。这样做是为了让每一轮验证都更公平、更可靠
- classfication_report 是一个“评估报告生成器”,你给它真实标签和预测标签,它自动算好精确率、召回率、F1分数,用整齐的表格打印出来
- confusion_matrix 可用来绘制混淆矩阵
- RandomForestClassifier,随机森林分类器的实现,是一个“多棵树投票决定结果”的机器学习模型。
2.混淆矩阵的绘制
模型预测的结果可视化,让你一眼看出模型在哪些类别上表现好、哪些类别容易分错。混淆矩阵 的定义是固定的模板,可自行记忆
# 定义混淆矩阵绘制函数
def cm_plot(y, yp):
cm = confusion_matrix(y, yp)
plt.matshow(cm, cmap=plt.cm.Blues)
plt.colorbar()
# 遍历填充混淆矩阵数值
for x in range(len(cm)):
for y in range(len(cm)):
plt.annotate(cm[x, y], xy=(y, x), horizontalalignment="center", verticalalignment="center")
plt.ylabel('True label')
plt.xlabel('Predicted label')
return plt
3.数据读取与特征、标签拆分
datas = pd.read_csv('spambase.csv')
# 最后一列为标签,其余为特征
data = datas.iloc[:, :-1]
labels = datas.iloc[:, -1]
# 2.划分训练集、测试集,保留原始数据分布
data_train, data_test, label_train, label_test = train_test_split(
data, labels, test_size=0.2, random_state=42
)
4.交叉验证选取最优参数
# 3.构建5折分层交叉验证,适配二分类数据分布
skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=0)
# 4.定义预剪枝超参数遍历范围
tree_depth = [8, 9, 10, None] # 决策树最大深度,None不限制深度树可以一直长下去,直到每个叶子都是纯的(全垃圾或全正常)
tree_min_leaf = [1, 2, 3] # 叶子节点最小样本数
tree_min_samples = [2, 3, 4, 6] # 内部节点最小分裂样本数
best_zuhe = [0, 0, 0] # 存储最优参数组合
best_recall = 0 # 存储最优召回率
# 5.三重循环网格寻优,以召回率为评价指标
for l in tree_min_samples:
for i in tree_depth:
for j in tree_min_leaf:
rf = RandomForestClassifier(
n_estimators=10, # 森林决策树数量
min_samples_split=l, # 节点分裂预剪枝
max_depth=i, # 最大深度预剪枝
min_samples_leaf=j, # 叶子样本预剪枝
max_features=0.7, # 随机选取70%特征训练
random_state=0, # 固定随机种子,结果可复现
n_jobs=-1 # 开启多线程并行训练
)
# 5折交叉验证计算平均召回率
score = cross_val_score(rf, data_train, label_train, cv=skf, scoring='recall')
score_mean = score.mean()
print(f"当前参数-深度:{i}, 最小叶子:{j}, 最小分裂:{l},平均召回率:{score_mean:.4f}")
# 更新最优参数
if score_mean > best_recall:
best_recall = score_mean
best_zuhe = [i, j, l]
print("="*70)
print(f"最优预剪枝参数组合:最大深度{best_zuhe[0]},叶子最小样本{best_zuhe[1]},节点最小分裂数{best_zuhe[2]}")
print(f"最优交叉验证平均召回率:{best_recall:.4f}")
这个k折,一般选5或者10,K值由你自由定义,但推荐从5或10开始。 K太小评估不稳定,K太大计算成本高但收益有限。对于你的4601条数据,5折已经足够好,换成10折也可以,结果会更稳定一些。
5.加载最优参数,训练最终随机森林模型
tr = RandomForestClassifier(
criterion='gini',
max_depth=best_zuhe[0],
min_samples_leaf=best_zuhe[1],
min_samples_split=best_zuhe[2],
random_state=42
)
tr.fit(data_train, label_train)
6.模型的评估与可视化
# 6.加载最优参数,训练最终随机森林模型
tr = RandomForestClassifier(
criterion='gini',
max_depth=best_zuhe[0],
min_samples_leaf=best_zuhe[1],
min_samples_split=best_zuhe[2],
random_state=42
)
tr.fit(data_train, label_train)
7.训练集模型评估
train_pred = tr.predict(data_train)
print("\\n【训练集分类评估报告】")
print(classification_report(label_train, train_pred, digits=9))
cm_plot(label_train, train_pred).show()
#8.测试集泛化能力评估
te_pred = tr.predict(data_test)
print("\\n【测试集最终分类评估报告】")
print(classification_report(label_test, te_pred, digits=9))
cm_plot(label_test, te_pred).show()
9.特征重要性可视化(筛选Top10关键特征)
importants = pd.DataFrame({
'importance': tr.feature_importances_,
'name': data.columns
})
按重要性降序排序,取前10特征
im = importants.sort_values(by='importance', ascending=False)[:10]
index = range(len(im))
横向柱状图可视化
plt.figure(figsize=(12, 6))
plt.barh(index, im['importance'], color='steelblue')
plt.yticks(index, im['name'])
plt.xlabel('特征重要性权重')
plt.title('随机森林-Top10核心特征重要性排序')
plt.gca().invert_yaxis() # 倒序展示,权重最高在顶部
plt.show()
总的代码
# 导入所需工具库
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split, cross_val_score, StratifiedKFold
from sklearn.metrics import classification_report, confusion_matrix
from sklearn.ensemble import RandomForestClassifier
# 定义混淆矩阵绘制函数
def cm_plot(y, yp):
cm = confusion_matrix(y, yp)
plt.matshow(cm, cmap=plt.cm.Blues)
plt.colorbar()
# 遍历填充混淆矩阵数值
for x in range(len(cm)):
for y in range(len(cm)):
plt.annotate(cm[x, y], xy=(y, x), horizontalalignment="center", verticalalignment="center")
plt.ylabel('True label')
plt.xlabel('Predicted label')
return plt
# 1.数据读取与特征、标签拆分
datas = pd.read_csv('spambase.csv')
# 最后一列为标签,其余为特征
data = datas.iloc[:, :-1]
labels = datas.iloc[:, -1]
# 2.划分训练集、测试集,保留原始数据分布
data_train, data_test, label_train, label_test = train_test_split(
data, labels, test_size=0.2, random_state=42
)
# 3.构建5折分层交叉验证,适配二分类数据分布
skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=0)
# 4.定义预剪枝超参数遍历范围
tree_depth = [8, 9, 10, None] # 决策树最大深度,None不限制深度树可以一直长下去,直到每个叶子都是纯的(全垃圾或全正常)
tree_min_leaf = [1, 2, 3] # 叶子节点最小样本数
tree_min_samples = [2, 3, 4, 6] # 内部节点最小分裂样本数
best_zuhe = [0, 0, 0] # 存储最优参数组合
best_recall = 0 # 存储最优召回率
# 5.三重循环网格寻优,以召回率为评价指标
for l in tree_min_samples:
for i in tree_depth:
for j in tree_min_leaf:
rf = RandomForestClassifier(
n_estimators=10, # 森林决策树数量
min_samples_split=l, # 节点分裂预剪枝
max_depth=i, # 最大深度预剪枝
min_samples_leaf=j, # 叶子样本预剪枝
max_features=0.7, # 随机选取70%特征训练
random_state=0, # 固定随机种子,结果可复现
n_jobs=-1 # 开启多线程并行训练
)
# 5折交叉验证计算平均召回率
score = cross_val_score(rf, data_train, label_train, cv=skf, scoring='recall')
score_mean = score.mean()
print(f"当前参数-深度:{i}, 最小叶子:{j}, 最小分裂:{l},平均召回率:{score_mean:.4f}")
# 更新最优参数
if score_mean > best_recall:
best_recall = score_mean
best_zuhe = [i, j, l]
print("="*70)
print(f"最优预剪枝参数组合:最大深度{best_zuhe[0]},叶子最小样本{best_zuhe[1]},节点最小分裂数{best_zuhe[2]}")
print(f"最优交叉验证平均召回率:{best_recall:.4f}")
6.加载最优参数,训练最终随机森林模型
tr = RandomForestClassifier(
criterion='gini',
max_depth=best_zuhe[0],
min_samples_leaf=best_zuhe[1],
min_samples_split=best_zuhe[2],
random_state=0
)
tr.fit(data_train, label_train)
7.训练集模型评估
train_pred = tr.predict(data_train)
print("\\n【训练集分类评估报告】")
print(classification_report(label_train, train_pred, digits=9))
cm_plot(label_train, train_pred).show()
#8.测试集泛化能力评估
te_pred = tr.predict(data_test)
print("\\n【测试集最终分类评估报告】")
print(classification_report(label_test, te_pred, digits=9))
cm_plot(label_test, te_pred).show()
9.特征重要性可视化(筛选Top10关键特征)
importants = pd.DataFrame({
'importance': tr.feature_importances_,
'name': data.columns
})
按重要性降序排序,取前10特征
im = importants.sort_values(by='importance', ascending=False)[:10]
index = range(len(im))
横向柱状图可视化
plt.figure(figsize=(12, 6))
plt.barh(index, im['importance'], color='steelblue')
plt.yticks(index, im['name'])
plt.xlabel('特征重要性权重')
plt.title('随机森林-Top10核心特征重要性排序')
plt.gca().invert_yaxis() # 倒序展示,权重最高在顶部
plt.show()
六、总结与展望
本文系统梳理了随机森林算法的核心要点与实战流程。首先,我们明确了随机森林是一种基于决策树的集成学习算法,其核心特点在于数据采样随机和特征选取随机,通过构建大量相互独立的决策树并集成预测结果,显著提升了模型的准确性和鲁棒性。其次,我们详细分析了随机森林的优缺点:优点包括高准确率、抗噪声能力强、不易过拟合、能处理高维数据且易于并行化;缺点则体现在训练资源消耗较大和模型可解释性相对较弱。最后,通过一个完整的垃圾邮件二分类实战案例,我们演示了从数据预处理、参数调优到模型评估的全流程,涵盖了交叉验证、网格搜索、混淆矩阵可视化以及特征重要性分析等关键环节。
展望未来,随机森林在以下场景中仍有广泛应用前景:
- 金融风控与信用评分:凭借其高准确率和抗噪声能力,随机森林在欺诈检测、信用评估等领域表现优异。
- 医疗诊断与生物信息学:能够处理高维基因表达数据,辅助疾病分类、药物反应预测等任务。
- 工业物联网与异常检测:对传感器时序数据进行分类和回归,实现设备故障预警。
- 推荐系统与用户行为分析:结合特征重要性分析,可识别影响用户决策的关键因素。
与其他模型相比,随机森林通常比单一决策树更稳定、泛化能力更强;与梯度提升树(如XGBoost、LightGBM)相比,随机森林训练速度更快、调参更简单,但在某些任务上精度可能略低。对于希望进一步深入学习的读者,建议:
随机森林作为经典且强大的机器学习算法,至今仍在众多实际场景中发挥着重要作用。掌握其原理并熟练运用,将为你的数据科学之旅奠定坚实基础。
网硕互联帮助中心







评论前必须登录!
注册