
文章目录前言一、集成学习概述1.1 什么是集成学习1.2 集成学习的三大流派二、从决策树到随机森林2.1 决策树存在的问题2.2 Bagging基于自助采样的并行集成算法2.3 随机森林的双重随机性2.4 随机森林的构建过程三、随机森林优缺点四、随机森林核心参数五、案例垃圾邮件识别5.1 数据集介绍5.2 基础实现六、K折交叉验证与超参数调优6.1 为什么需要交叉验证6.2 网格搜索调优七、随机森林 vs 单棵决策树八、总结前言在机器学习的世界里单个模型往往存在这样或那样的不足——决策树容易过拟合、逻辑回归表达能力有限。那么让多个模型 “团结起来”取长补短这就是集成学习Ensemble Learning。一、集成学习概述1.1 什么是集成学习在机器学习领域我们经常会遇到这样的问题一个模型的预测能力有限如何让多个模型组合起来提高整体效果这就是集成学习Ensemble Learning产生的原因。集成学习的核心思想通过构建多个弱学习器将多个模型的预测结果进行组合从而获得一个性能更强、更稳定的模型。1.2 集成学习的三大流派方法核心思想代表算法个体学习器关系Bagging并行训练投票/平均随机森林相互独立Boosting串行训练逐次纠正错误AdaBoost、GBDT、XGBoost强依赖前后有序Stacking多层学习器组合各种竞赛融合方案分层结构Bagging 和 Boosting 是最常见的两类集成方法。随机森林便是基于 Bagging 思想构建的典型模型。二、从决策树到随机森林2.1 决策树存在的问题决策树是一种非常经典的机器学习算法。例如判断邮件是否为垃圾邮件邮件 是否包含广告词 / \ 是 否 垃圾邮件 正常邮件决策树优点容易理解、训练速度快、可以处理非线性关系。决策树缺点容易过拟合——一棵树可能会过度学习训练数据对训练集表现很好如99%准确率但对新数据效果下降如75%准确率。这说明模型记住了训练数据中的细节而没有学习真正规律。2.2 Bagging基于自助采样的并行集成算法随机森林的基础是BaggingBootstrap Aggregating其工作流程如下自助采样Bootstrap Sampling从原始训练集中有放回地抽取 n 个样本构成一个子集重复采样进行 T 次采样得到 T 个不同的子集训练基学习器每个子集训练一棵决策树集成预测分类任务用投票法回归任务用平均法原始数据集 D ↓ 有放回采样 T 次 D₁ D₂ D₃ ... D_T ↓ ↓ ↓ ↓ 树₁ 树₂ 树₃ ... 树_T ↓ 投票/平均 最终结果2.3 随机森林的双重随机性随机森林在 Bagging 的基础上又增加了一层随机性——特征随机选择这也是它名字中随机的由来。随机性一样本随机—— 通过 Bootstrap 有放回采样每棵树看到的样本不同随机性二特征随机—— 每棵树在分裂节点时不是从全部特征中选最优而是从随机选取的特征子集中选最优这使得不同树的差异进一步增大集成效果更好为什么要随机选择特征如果数据集中有一个非常强的特征那么所有树都会用它来分裂导致树之间高度相关集成效果大打折扣。随机选特征可以让树之间的差异更大从而提升泛化能力。2.4 随机森林的构建过程从原始训练集中有放回地抽取 n 个样本得到一个子数据集从子数据集上构建一棵决策树随机选择 k 个特征k ≈ n _ f e a t u r e s k \approx \sqrt{n\_features}k≈n_features或log 2 ( n _ f e a t u r e s ) \log_2(n\_features)log2(n_features)在这 k 个特征中选择最优分裂特征和分裂点递归分裂直到满足停止条件重复步骤 1-2构建 T 棵决策树对于新样本让所有树投票得票最多的类别即为预测结果三、随机森林优缺点优点优点说明不易过拟合多棵树结果平均有效降低模型方差泛化能力强对未知样本预测表现稳定输出特征重要性可评估各个特征对预测的贡献大小无需特征标准化树模型不受特征量纲影响适配高维、非线性数据支持并行训练各决策树相互独立可利用多核CPU加速训练抗噪声能力较强通过集成投票降低单棵树受噪声干扰的影响缺点缺点说明可解释性差单棵决策树容易解释但整体集成模型属于黑盒训练开销大树数量越多训练耗时、内存占用越高对错误标签敏感若数据集存在大量标签噪声会降低模型效果超参数调优成本高需要调试树数量、最大深度等多个超参数四、随机森林核心参数本章节使用分类随机森林RandomForestClassifier该模型由sklearn.ensemble模块提供。参数含义默认值调参建议n_estimators森林中树的数量100越大越稳定通常 100~500max_features每次分裂随机选多少特征sqrt分类用sqrt回归用 1/3max_depth树的最大深度None不限防过拟合核心参数常用 5~30min_samples_split分裂所需最小样本数2增大可防过拟合常用 2~10min_samples_leaf叶节点最小样本数1增大可防过拟合常用 1~10n_jobs并行训练的CPU核数1设为 -1 使用所有核心代码示例rfRandomForestClassifier(n_estimators100,# 100棵树max_features0.8,# 使用80%的特征max_depth10,# 树最大深度10层min_samples_split5,# 节点少于5个样本不再分裂min_samples_leaf2,# 叶节点至少2个样本n_jobs-1,# 使用所有CPU核心random_state0)五、案例垃圾邮件识别5.1 数据集介绍样本数4601 封邮件特征数57 个特征标签1垃圾邮件/ 0正常邮件特征分为三类词频特征48个如word_freq_make、word_freq_free等表示某个词在邮件中出现的频率字符频率特征6个如char_freq_!、char_freq_$等表示特殊字符出现的频率大写字母特征3个连续大写字母的平均长度、最长长度、总长度直观理解垃圾邮件往往包含大量免费“赚钱”点击等词汇以及大量感叹号和大写字母这些特征正是识别垃圾邮件的关键线索。5.2 基础实现下面是随机森林的基础实现代码已修正原代码中的问题importpandasaspdimportmatplotlib.pyplotaspltfromsklearn.model_selectionimporttrain_test_splitfromsklearn.ensembleimportRandomForestClassifierfromsklearnimportmetrics# 1.读取数据dfpd.read_csv(spambase.csv)# 2.划分特征与标签、训练集测试集Xdf.iloc[:,:-1]# 全部特征ydf.iloc[:,-1]# 标签X_train,X_test,y_train,y_testtrain_test_split(X,y,test_size0.2,random_state100)# 3.构建并训练随机森林分类器rfRandomForestClassifier(n_estimators100,max_features0.8,random_state0)rf.fit(X_train,y_train)# 4.训练集评估y_train_predrf.predict(X_train)print(训练集分类报告)print(metrics.classification_report(y_train,y_train_pred,digits9))# 5.测试集评估y_test_predrf.predict(X_test)print(测试集分类报告)print(metrics.classification_report(y_test,y_test_pred,digits4))# 6.绘制top10特征重要性横向柱状图importancesrf.feature_importances_# 构造特征‑重要性DataFramefeature_import_dfpd.DataFrame({importance:importances,feature:df.columns[:-1]# 排除最后一列标签})# 按重要性降序取前10feature_import_dffeature_import_df.sort_values(byimportance,ascendingFalse).head(10)# 绘图plt.figure(figsize(8,6))plt.barh(range(len(feature_import_df)),feature_import_df[importance])plt.yticks(range(len(feature_import_df)),feature_import_df[feature])plt.gca().invert_yaxis()# 最重要的放最上方plt.xlabel(Feature Importance)plt.title(Top10 Feature Importance)plt.tight_layout()plt.show()六、K折交叉验证与超参数调优6.1 为什么需要交叉验证只用一次训练集/测试集划分来评估模型结果可能有偶然性。一次测试结果不能完全代表模型能力。K折交叉验证K-Fold Cross Validation的做法是将训练集分成 K 等份每次用 K-1 份训练剩下 1 份验证重复 K 次取 K 次结果的平均值作为最终评估K 通常取 5 或 10。K 越大评估越准确但计算量也越大。6.2 网格搜索调优使用GridSearchCV可以更高效地进行超参数调优importpandasaspdimportmatplotlib.pyplotaspltfromsklearn.model_selectionimporttrain_test_split,GridSearchCVfromsklearn.ensembleimportRandomForestClassifierfromsklearnimportmetrics# 设置中文字体解决matplotlib中文乱码、负号显示异常plt.rcParams[font.sans-serif][SimHei]plt.rcParams[axes.unicode_minus]False# 1.数据准备dfpd.read_csv(spambase.csv)Xdf.iloc[:,:-1]ydf.iloc[:,-1]# stratifyy分层划分保证训练/测试集正负样本比例和原数据集一致X_train,X_test,y_train,y_testtrain_test_split(X,y,test_size0.2,random_state100,stratifyy)# 2.超参数搜索网格param_grid{max_depth:[15,20,25,30],# 控制决策树最大深度min_samples_split:[2,4,6],# 规定节点继续分裂所需的最小样本数量min_samples_leaf:[1,2,3],# 规定叶子节点的最小样本数max_features:[sqrt,0.8]# 控制每次分裂随机选取的候选特征数量# sqrt分类任务默认取总特征数的平方根# 0.8浮点数代表选取总特征的 80%}# 3.网格搜索5折交叉验证print(开始网格搜索...)rfRandomForestClassifier(n_estimators100,random_state0,n_jobs-1)grid_searchGridSearchCV(estimatorrf,param_gridparam_grid,cv5,# 5折交叉验证scoringaccuracy,# 以准确率作为评价指标n_jobs-1,# 使用全部CPU核心并行verbose1# 打印搜索过程)grid_search.fit(X_train,y_train)print(f\n最佳参数:{grid_search.best_params_})print(f最佳交叉验证准确率:{grid_search.best_score_:.4f}\n)# 4.最优模型在测试集评估best_rfgrid_search.best_estimator_ y_test_predbest_rf.predict(X_test)print(【测试集最终评估报告】)print(metrics.classification_report(y_test,y_test_pred,digits4))# 5.绘制Top10特征重要性importancesbest_rf.feature_importances_ feature_namesdf.columns[:-1].tolist()feature_dfpd.DataFrame({feature:feature_names,importance:importances})feature_dffeature_df.sort_values(byimportance,ascendingFalse).head(10)plt.figure(figsize(10,6))plt.barh(range(len(feature_df)),feature_df[importance])plt.yticks(range(len(feature_df)),feature_df[feature])plt.xlabel(重要性)plt.ylabel(特征)plt.title(特征重要性排名 Top10)plt.gca().invert_yaxis()# 将最重要特征放到图表顶部plt.tight_layout()plt.show()七、随机森林 vs 单棵决策树对比维度单棵决策树随机森林过拟合风险高低准确率较低较高训练速度快较慢但可并行预测速度快较慢可解释性好差特征重要性有有更稳定八、总结本文从集成学习的基本概念出发详细讲解了随机森林的原理并通过垃圾邮件识别的实战案例带你完成了从基础实现到超参数调优的完整流程。核心要点回顾集成学习通过组合多个弱学习器来获得更强的泛化能力随机森林 Bagging 决策树 特征随机选择是双重随机的集成K折交叉验证可以更可靠地评估模型性能避免单次划分的偶然性网格搜索是超参数调优的常用方法GridSearchCV让调参变得简单特征重要性是随机森林的附加福利帮你理解数据中哪些特征最关键随机森林是机器学习入门必学的算法之一它既有理论深度又有很强的实用性。希望这篇文章能帮你建立对随机森林的初步认知快去动手试试吧