ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

速通机器学习 09 | 随机森林

速通机器学习 09 | 随机森林 前言前面一节我们学习了一种简单高效的算法——决策树学习算法Decision Tree 下面来介绍一种基于决策树的集成学习算法——随机森林算法Random Forest 。一、什么是随机森林随机森林是基于Bagging集成学习框架的经典机器学习算法以决策树为基础模型通过构建多棵相互独立的决策树并行训练学习再集成所有决策树的预测结果输出最终结果。其中分类任务采用少数服从多数投票法判定类别回归任务采用多树预测结果取均值输出数值。1. 核心思想样本随机采用有放回自助抽样Bootstrap对原始数据集随机生成多组差异化子训练集使每棵决策树学习不同的数据分布规律弱化单棵决策树的训练偏差。特征随机每棵决策树在节点分裂时仅随机选取部分特征参与最优特征筛选降低各决策树之间的相关性让多树集成结果更稳定、泛化能力更强。多树集成互补基于双重随机训练出多棵相互独立、规律互补的决策树通过投票或取均值的方式融合结果抵消单树噪声与误差。2. 模型构建完整流程1首先通过有放回自助采样拆分出多组不同的训练样本子集再对每组子集进行特征随机筛 选。2让每棵决策树学习差异化的数据与特征规律。例如决策树A学习x1、x2、x4等特征决策树B学习x2、x5、x8等特征保证各基础模型相互独立、学习规律互补。3所有独立决策树训练完成后集成全部模型的预测结果分类任务采用投票法统计最优类别回归任务对所有预测值求取均值最终输出精准、稳定的预测结果。二、随机森林核心优缺点1优点泛化能力与准确率优异采用多决策树集成融合机制有效解决单棵决策树易过拟合、稳定性差的问题大幅提升模型整体预测精度与泛化能力。鲁棒性强、容错性高对数据噪声、少量缺失样本不敏感数据预处理成本低在常规数据集上可直接取得良好建模效果。支持特征重要性评估依托特征随机机制可通过多树预测结果差异量化各特征对模型预测的贡献权重实现特征筛选与业务归因分析。2缺点训练成本随树数量递增森林内决策树数量越多模型训练耗时越长对设备算力、内存资源的消耗越高。三、随机森林核心API与超参数详解随机森林分类模型核心调用库与关键参数如下所有参数均为建模、调参、预剪枝的核心配置直接决定模型精度与泛化能力。1. 模型库导入from sklearn.ensemble import RandomForestClassifier2. 模型初始化调用rf RandomForestClassifier( n_estimators, max_depth, min_samples_leaf, min_samples_split, max_features, random_state, n_jobs )3. 核心超参数详细释义n_estimators森林中决策树的总数量。数值越大模型集成效果越好、稳定性越高但训练耗时与内存占用会同步增加到达一定数量后精度提升趋于平缓。max_depth单棵决策树的最大深度核心预剪枝参数。用于限制单树复杂度有效抑制模型过拟合数值越小模型越简单。min_samples_leaf叶子节点最小样本数。规定分支分裂后叶子节点的最少样本数量避免生成过于细碎的分支提升模型泛化能力。min_samples_split内部节点最小分裂样本数。当节点样本数量低于该阈值时停止节点分裂约束模型复杂程度。max_features节点分裂时随机选取的特征数量实现特征随机。有效降低各决策树之间的相关性是随机森林双重随机机制的核心参数。random_state全局随机种子。固定所有随机采样逻辑保证实验可复现便于参数对比与模型调试。n_jobs并行训练线程数。设置为-1时调用全部CPU核心多线程并行训练大幅提升随机森林训练与网格调参速度。四、实战垃圾邮件二分类任务本次实战采用经典的 Spambase 垃圾邮件数据集完成随机森林二分类建模任务。数据集共包含4601条样本、57维特征所有特征均为邮件文本的统计属性标签为二分类1代表垃圾邮件0代表正常邮件。本次实验通过分层K折交叉验证遍历最优预剪枝参数构建高精度、高泛化性的随机森林模型同时实现特征重要性可视化分析。数据集已在本文开头给出英文垃圾邮件数据集spambase资源-CSDN下载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用于读取CSV数据集、特征与标签的数据处理matplotlib实现混淆矩阵、特征重要性可视化绘图train_test_split实现训练集、测试集随机划分StratifiedKFold、cross_val_score分层K折交叉验证用于超参数寻优classification_report、confusion_matrix分类模型精度、召回率、混淆矩阵评估RandomForestClassifier随机森林分类模型核心库。2. 自定义混淆矩阵绘图模块# 定义混淆矩阵绘制函数 def cm_plot(y, yp): cm confusion_matrix(y, yp) plt.matshow(cm, cmapplt.cm.Blues) plt.colorbar() # 遍历填充混淆矩阵数值 for x in range(len(cm)): for y in range(len(cm)): plt.annotate(cm[x, y], xy(y, x), horizontalalignmentcenter, verticalalignmentcenter) plt.ylabel(True label) plt.xlabel(Predicted label) return plt解析封装通用绘图函数输入真实标签与预测标签自动计算并绘制混淆矩阵采用蓝色色系可视化矩阵循环填充每个格子的样本数量直观展示模型预测正误分布统一标注真实值、预测值坐标轴适配训练集、测试集双向评估。3. 数据读取与数据拆分模块# 1.数据读取与特征、标签拆分 datas pd.read_csv(rD:\pythoncode2\bigdata_ai40\data\spambase.csv) # 最后一列为标签其余为特征 data datas.iloc[:, :-1] labels datas.iloc[:, -1]解析读取垃圾邮件分类数据集该数据集为标准二分类数据集切片规则所有前n-1列为样本特征最后一列为分类标签0/1严格区分特征集与标签集为后续模型训练做数据准备。4. 训练集、测试集划分模块# 2.划分训练集、测试集保留原始数据分布 data_train, data_test, label_train, label_test train_test_split( data, labels, test_size0.2, random_state42 )解析按照8:2比例划分训练集与独立测试集test_size0.220%数据作为测试集全程不参与调参用于验证模型泛化能力random_state42固定随机种子保证每次实验数据划分一致结果可复现。5. 分层K折交叉验证初始化模块# 3.构建5折分层交叉验证适配二分类数据分布 skf StratifiedKFold(n_splits5, shuffleTrue, random_state42)解析采用分层5折交叉验证区别于普通K折保证每一份子数据集的正负样本比例与原始数据集完全一致解决类别不平衡评估失真问题shuffle打乱数据顺序避免数据排序带来的训练偏差提升参数评估准确性。6. 超参数范围定义模块# 4.定义预剪枝超参数遍历范围 tree_depth [8, 9, 10, None] # 决策树最大深度 tree_min_leaf [1, 2, 3] # 叶子节点最小样本数 tree_min_samples [2, 3, 4, 6] # 内部节点最小分裂样本数 best_zuhe [0, 0, 0] # 存储最优参数组合 best_recall 0 # 存储最优召回率解析定义随机森林三大预剪枝核心参数遍历区间实现全自动网格寻优tree_depth限制单棵树最大深度防止树过深造成过拟合tree_min_leaf限制叶子节点最少样本数避免生成极端细碎分支tree_min_samples限制节点最小分裂样本数控制模型复杂程度初始化变量用于迭代记录最优参数组合与最高召回率。7. k折最优参数模块核心# 5.三重循环网格寻优以召回率为评价指标 for l in tree_min_samples: for i in tree_depth: for j in tree_min_leaf: rf RandomForestClassifier( n_estimators10, # 森林决策树数量 max_depthi, # 最大深度预剪枝 min_samples_leafj, # 叶子样本预剪枝 min_samples_splitl, # 节点分裂预剪枝 max_features0.7, # 随机选取70%特征训练 random_state42, # 固定随机种子结果可复现 n_jobs-1 # 开启多线程并行训练 ) # 5折交叉验证计算平均召回率 score cross_val_score(rf, data_train, label_train, cvskf, scoringrecall) 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})解析三重循环遍历所有参数组合完成全自动网格搜索寻优n_estimators10设定森林包含10棵基础决策树max_features0.7开启特征随机每次分裂随机选取70%特征契合随机森林双重随机核心原理n_jobs-1调用全部CPU核心并行训练大幅提升网格寻优速度以召回率recall为择优指标适配二分类任务减少样本漏判迭代更新并最终输出全局最优预剪枝参数组合。8. 最优模型训练模块# 6.加载最优参数训练最终随机森林模型 tr RandomForestClassifier( criteriongini, max_depthbest_zuhe[0], min_samples_leafbest_zuhe[1], min_samples_splitbest_zuhe[2], random_state42 ) tr.fit(data_train, label_train)解析加载交叉验证筛选出的最优预剪枝参数搭建最终模型criteriongini采用CART算法以基尼系数作为节点分裂依据使用全部训练集数据完成最终拟合生成正式预测模型。9. 训练集、测试集双评估模块# 7.训练集模型评估 train_pred tr.predict(data_train) print(\n【训练集分类评估报告】) print(classification_report(label_train, train_pred, digits9)) cm_plot(label_train, train_pred).show() 8.测试集泛化能力评估 te_pred tr.predict(data_test) print(\n【测试集最终分类评估报告】) print(classification_report(label_test, te_pred, digits9)) cm_plot(label_test, te_pred).show()解析分别对训练集、独立测试集进行预测完成双向评估输出精确率、召回率、F1分数全方位评价模型性能通过训练集与测试集结果对比可直观判断模型是否存在过拟合、欠拟合绘制两组混淆矩阵可视化模型正误预测分布。10. 特征重要性分析与可视化模块# 9.特征重要性可视化筛选Top10关键特征 importants pd.DataFrame({ importance: tr.feature_importances_, name: data.columns }) # 按重要性降序排序取前10特征 im importants.sort_values(byimportance, ascendingFalse)[:10] index range(len(im)) # 横向柱状图可视化 plt.figure(figsize(12, 6)) plt.barh(index, im[importance], colorsteelblue) plt.yticks(index, im[name]) plt.xlabel(特征重要性权重) plt.title(随机森林-Top10核心特征重要性排序) plt.gca().invert_yaxis() # 倒序展示权重最高在顶部 plt.show()解析随机森林独有功能自动计算各特征对分类结果的贡献权重将特征与对应重要性权重绑定按权重降序排序筛选Top10核心特征通过横向柱状图可视化展示权重越高对垃圾邮件分类的影响越大可用于特征筛选、数据降维、业务归因分析提升模型可解释性。
返回列表