随机森林算法:从集成学习原理到垃圾邮件分类实战
- 简介
- 一、随机森林相关概念
- 1. 集成学习
- 机器学习的两个核心任务
- 集成学习的应用场景
- 2. 随机森林
- 什么是随机森林
- 随机森林的核心特点
- 3. 随机森林的优缺点
- 优点
- 缺点
- 二、随机森林的 API
- 核心参数详解
- 三、案例分析:垃圾邮件分类
- 数据集介绍
- 1. 导入所需库
- 2. 数据加载与预处理
- 3. 数据集拆分
- 4. 随机森林模型训练
- 5. 模型评估
- 6. 特征重要性分析
- 7. 特征重要性可视化
- 8. 完整代码汇总
- 总结
简介
随机森林是一种基于决策树的集成学习算法,通过构建多棵决策树并综合它们的预测结果来提升模型的准确性和稳定性。它凭借出色的抗过拟合能力和高准确率,在分类和回归任务中得到了广泛应用。本文将带你全面了解随机森林的核心概念、API参数以及实战案例。
一、随机森林相关概念
1. 集成学习
集成学习(Ensemble Learning)是指通过构建多个基学习器(如决策树、神经网络等)并结合它们的预测结果来解决单一预测问题的方法。其核心思想是:多个模型的组合预测效果优于任何一个单一模型。
俗话说:“三个臭皮匠,顶个诸葛亮”——这正是集成学习的精髓所在。
机器学习的两个核心任务
| 任务 | 目标 | 解决方法 |
|---|---|---|
| 任务一 | 如何优化训练数据 | 主要解决欠拟合问题 |
| 任务二 | 如何提升泛化性能 | 主要解决过拟合问题 |
集成学习的应用场景
- 分类问题集成
- 回归问题集成
- 特征选取集成
2. 随机森林
什么是随机森林
随机森林(Random Forest)是将多个决策树结合在一起的一种集成算法。其核心特点是:
- 数据采样随机:每棵树从原始数据集中有放回地随机抽取样本(Bootstrap采样)
- 特征选取随机:每棵树在分裂时随机选择部分特征进行最优划分
- 基分类器为决策树:每棵决策树独立学习,最终通过投票(分类)或平均(回归)得到结果
随机森林的"随机"二字,正是来源于上述两个随机性。
随机森林的核心特点
- 数据采样随机(Bootstrap)
- 特征选取随机
- 森林结构(多棵决策树)
- 基分类器为决策树
- 每棵树只学习部分数据,降低过拟合风险
3. 随机森林的优缺点
优点
- 具有极高的准确率
- 随机性引入使模型抗噪声能力强
- 不易过拟合
- 能够处理高维数据,无需特征选择
- 易于并行化计算
缺点
- 决策树数量较多时,训练时间和空间开销较大
- 模型可解释性较差,属于"黑盒模型"
二、随机森林的 API
classsklearn.ensemble.RandomForestClassifier(n_estimators='warn',criterion='gini',max_depth=None,min_samples_split=2,min_samples_leaf=1,min_weight_fraction_leaf=0.0,max_features='auto',max_leaf_nodes=None,min_impurity_decrease=0.0,min_impurity_split=None,bootstrap=True,oob_score=False,n_jobs=None,random_state=None,verbose=0,warm_start=False,class_weight=None)核心参数详解
| 参数 | 说明 |
|---|---|
n_estimators | 随机森林独有。决策树的数量,默认 100(0.22版本) |
criterion | 同决策树。节点分割依据,默认 ‘gini’(基尼系数),可选 ‘entropy’(信息增益) |
max_depth | 同决策树。树的最大深度,默认 None 表示不限制 |
min_samples_split | 同决策树。节点继续分裂所需的最小样本数,默认 2 |
min_samples_leaf | 同决策树。叶子节点所需的最小样本数,默认 1 |
max_features | 随机森林独有。每棵树使用的最大特征数,默认 ‘auto’(即 sqrt(n_features)) |
max_leaf_nodes | 同决策树。最大叶子节点数,默认 None 表示不限制 |
bootstrap | 随机森林独有。是否使用有放回采样,默认 True |
n_jobs | 随机森林独有。并行任务数,-1 表示使用所有 CPU 核心 |
random_state | 随机种子,确保结果可复现 |
三、案例分析:垃圾邮件分类
数据集介绍
本案例使用Spambase 数据集,共包含 4597 行 58 列数据:
| 特征类型 | 特征名称 | 说明 |
|---|---|---|
| 词频特征 | Word_freq_make ~ Word_freq_conference | 各单词在邮件中出现的频率 |
| 字符频率 | Char_freq1 ~ Char_freq6 | 特定字符的出现频率 |
| 大写字母特征 | Capital_run_length_average | 大写字母连续出现的平均长度 |
| 大写字母特征 | Capital_run_length_longest | 大写字母连续出现的最长长度 |
| 大写字母特征 | Capital_run_length_total | 大写字母连续出现的总长度 |
| 标签 | label | 0:正常邮件,1:垃圾邮件 |
1. 导入所需库
importpandasaspdimportmatplotlib.pyplotaspltfromsklearn.model_selectionimporttrain_test_splitfromsklearnimportmetricsfromsklearn.ensembleimportRandomForestClassifier2. 数据加载与预处理
data=pd.read_csv("spambase.csv")x=data.iloc[:,:-1]# 特征:除最后一列外的所有列y=data.iloc[:,-1]# 标签:最后一列3. 数据集拆分
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=100)4. 随机森林模型训练
estimator=RandomForestClassifier(n_estimators=100,# 100棵决策树max_features=0.8,# 每棵树使用80%的特征random_state=0)estimator.fit(x_train,y_train)5. 模型评估
test_predicted=estimator.predict(x_test)train_score=estimator.score(x_train,y_train)print(f"训练集准确率:{train_score:.4f}")print("\n测试集分类报告:")print(metrics.classification_report(y_test,test_predicted))6. 特征重要性分析
# 获取特征重要性importances=estimator.feature_importances_ im=pd.DataFrame(importances,columns=["importances"])# 处理特征名称feature_names=data.columns[:-1].tolist()im['feature']=feature_names# 排序并取前10个im=im.sort_values(by='importances',ascending=False)[:10]7. 特征重要性可视化
# 设置中文字体plt.rcParams["font.family"]=["SimHei","Microsoft YaHei"]plt.rcParams["axes.unicode_minus"]=Falsefig,ax=plt.subplots(figsize=(10,8))ax.barh(im['feature'],im['importances'],color='skyblue')ax.set_title('随机森林特征重要性(前10个特征)',fontsize=14,fontweight='bold')ax.set_xlabel('重要性得分',fontsize=12)ax.set_ylabel('特征名称',fontsize=12)plt.tight_layout()plt.show()8. 完整代码汇总
importpandasaspdimportmatplotlib.pyplotaspltfromsklearn.model_selectionimporttrain_test_splitfromsklearnimportmetricsfromsklearn.ensembleimportRandomForestClassifier# 数据加载data=pd.read_csv("spambase.csv")x=data.iloc[:,:-1]y=data.iloc[:,-1]# 数据集拆分x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=100)# 模型训练estimator=RandomForestClassifier(n_estimators=100,max_features=0.8,random_state=0)estimator.fit(x_train,y_train)# 模型评估test_predicted=estimator.predict(x_test)print(f"训练集准确率:{estimator.score(x_train,y_train):.4f}")print(metrics.classification_report(y_test,test_predicted))# 特征重要性可视化importances=estimator.feature_importances_ im=pd.DataFrame(importances,columns=["importances"])feature_names=data.columns[:-1].tolist()im['feature']=feature_names im=im.sort_values(by='importances',ascending=False)[:10]plt.rcParams["font.family"]=["SimHei","Microsoft YaHei"]plt.rcParams["axes.unicode_minus"]=Falsefig,ax=plt.subplots(figsize=(10,8))ax.barh(im['feature'],im['importances'],color='skyblue')ax.set_title('随机森林特征重要性(前10个特征)',fontsize=14,fontweight='bold')ax.set_xlabel('重要性得分',fontsize=12)ax.set_ylabel('特征名称',fontsize=12)plt.tight_layout()plt.show()总结
随机森林作为集成学习的代表性算法,通过引入数据采样随机和特征选取随机两大机制,有效克服了单棵决策树容易过拟合的缺陷,在众多实际应用中展现出卓越的性能。
| 对比维度 | 单棵决策树 | 随机森林 |
|---|---|---|
| 过拟合风险 | 较高 | 较低 |
| 准确性 | 一般 | 较高 |
| 抗噪声能力 | 较弱 | 较强 |
| 可解释性 | 强 | 较弱 |
| 训练速度 | 快 | 较慢 |