随机森林算法详解——基于垃圾邮件分类案例
一、从决策树到随机森林
在前面的决策树学习中,我们了解到决策树是一种比较直观的分类算法。
它通过不断寻找合适的特征,对数据进行划分,最终得到分类结果。
例如垃圾邮件识别问题:
一封邮件可能包含:
- 单词出现次数
- 特殊字符比例
- 大写字母数量
- 链接数量
决策树会根据这些特征建立判断规则。
但是在实际使用过程中,单棵决策树也存在一些问题。
例如:
如果树的深度过大,模型可能会把训练数据中的一些特殊情况也学习进去。
训练集效果很好:
准确率:98%但是换一批新数据:
准确率:75%这种情况就是过拟合。
为了提高模型稳定性,机器学习中提出了一种思想:
不使用一棵树进行判断,而是训练多棵树,让它们共同决定结果。
这就是随机森林。
二、随机森林基本思想
随机森林(Random Forest)是一种集成学习方法。
简单来说:
它由很多棵决策树组成。
每棵树都会独立进行训练,最后通过投票方式确定分类结果。
例如:
预测一封邮件是否为垃圾邮件:
| 决策树 | 预测结果 |
|---|---|
| 树1 | 垃圾邮件 |
| 树2 | 垃圾邮件 |
| 树3 | 正常邮件 |
| 树4 | 垃圾邮件 |
| 树5 | 正常邮件 |
其中3棵树认为是垃圾邮件。
最终结果:
垃圾邮件相比单棵树,多个模型共同判断,可以减少偶然因素带来的影响。
三、随机森林为什么叫“随机”
随机森林中的随机主要体现在两个方面:
1. 数据随机
训练每棵树时,并不是直接使用全部数据。
而是通过Bootstrap方法随机抽取数据。
例如:
原始数据:
4600封邮件生成:
数据集1 → 训练树1 数据集2 → 训练树2 数据集3 → 训练树3由于每棵树看到的数据不同,所以最终形成的树结构也不同。
2. 特征随机
除了数据不同之外,每棵树使用的特征也不是完全一样。
例如:
邮件数据共有100个特征。
训练第一棵树:
随机选择50个特征。
训练第二棵树:
重新选择另外50个特征。
这样可以避免所有树都关注相同特征,提高模型差异性。
四、随机森林训练过程
随机森林训练主要分为以下几个步骤。
第一步:随机抽取训练数据
通过Bootstrap采样生成多个训练集。
例如:
原始数据 | 数据集A 数据集B 数据集C第二步:训练决策树
每个数据集训练一棵决策树。
例如:
数据集A → 决策树1 数据集B → 决策树2 数据集C → 决策树3第三步:随机选择特征
每棵树训练过程中,只使用部分特征。
这样可以增加不同树之间的差异。
第四步:综合预测结果
分类任务:
采用多数投票。
回归任务:
采用平均值。
五、垃圾邮件分类案例介绍
本实验使用:
spambase.csv数据集完成垃圾邮件分类。
目标:
根据邮件特征判断:
0:正常邮件 1:垃圾邮件邮件特征包括:
- 单词出现频率
- 字符出现频率
- 大写字母长度
- 特殊符号比例
例如:
垃圾邮件通常包含:
- 大量促销词
- 大量链接
- 特殊字符
这些特征可以帮助模型进行判断。
六、数据读取与划分
读取数据:
df = pd.read_csv('spambase.csv')划分特征:
x = df.iloc[:, :-1] y = df.iloc[:, -1]其中:
x表示邮件特征。
例如:
单词频率 字符比例 数字数量y表示类别标签:
是否垃圾邮件划分训练集和测试集:
x_train, x_test, y_train, y_test = train_test_split( x, y, test_size=0.2, random_state=100 )数据比例:
训练集:80% 测试集:20%训练集用于学习规律。
测试集用于验证模型效果。
七、随机森林模型建立
代码:
from sklearn.ensemble import RandomForestClassifier rf = RandomForestClassifier( n_estimators=150, max_features=0.5, random_state=0 )创建随机森林分类模型。
八、随机森林参数分析
1.n_estimators
表示森林中决策树数量。
代码:
n_estimators=150表示建立150棵决策树。
树数量增加:
优点:
- 模型更加稳定
- 预测结果波动降低
缺点:
- 训练时间增加
- 内存占用提高
实际应用中需要根据数据规模调整。
2.max_features
表示每棵树随机选择的特征比例。
代码:
max_features=0.5表示:
每棵树使用50%的特征。
例如:
100个特征:
每棵树随机选择50个。
这样可以提高树之间的差异。
3.max_depth
控制树的最大深度。
如果不限制:
树可能不断分裂。
导致:
模型复杂度过高,容易过拟合。
因此需要合理设置深度。
九、交叉验证评价模型
单次训练测试可能存在偶然性。
例如:
一次划分:
准确率:90%换一次划分:
准确率:85%因此采用交叉验证提高评价可靠性。
代码:
StratifiedKFold( n_splits=5 )五折交叉验证过程:
第一次: 第1份测试,其余训练 第二次: 第2份测试,其余训练 ... 第五次: 第5份测试,其余训练最后计算平均准确率。
十、随机森林参数优化
随机森林默认参数通常效果不错,但是不同数据集适合的参数不同。
因此使用:
GridSearchCV()自动搜索最佳参数。
搜索参数:
'n_estimators' 'max_features' 'max_depth'例如:
尝试:
50棵树 100棵树 150棵树 200棵树然后比较模型效果。
最终选择表现最好的组合。
十一、模型评价
训练完成后:
使用:
classification_report()评价模型。
主要指标:
Accuracy
表示整体预测正确比例。
Precision
表示预测为垃圾邮件的邮件中,真正垃圾邮件的比例。
Recall
表示所有垃圾邮件中,模型成功检测出来的比例。
F1-score
综合考虑Precision和Recall。
十二、混淆矩阵分析
代码:
cm_plot()混淆矩阵:
| 预测正常 | 预测垃圾 | |
|---|---|---|
| 真实正常 | TN | FP |
| 真实垃圾 | FN | TP |
其中:
TP:
正确识别垃圾邮件。
TN:
正确识别正常邮件。
FP:
正常邮件被误判为垃圾邮件。
FN:
垃圾邮件没有检测出来。
在垃圾邮件检测中:
FN通常需要重点关注,因为漏掉垃圾邮件会影响用户体验。
十三、随机森林特征重要性分析
随机森林可以查看:
不同特征对于预测结果的影响程度。
代码:
rf.feature_importances_例如:
可能发现:
| 特征 | 重要程度 |
|---|---|
| 关键词频率 | 0.30 |
| 特殊字符数量 | 0.25 |
| 链接数量 | 0.18 |
通过特征重要性分析,可以了解:
哪些因素更容易影响邮件分类结果。
十四、随机森林优缺点分析
优点
1.稳定性更高
多棵树共同决策,可以降低单个模型带来的误差。
2.降低过拟合
随机数据和随机特征减少模型对训练数据的依赖。
3.适合处理大量特征
面对高维数据时表现较好。
缺点
1.解释性较弱
单棵决策树可以直接查看规则。
但是随机森林包含大量树结构,不容易完全解释。
2.训练成本较高
树数量增加后:
训练时间和资源消耗都会增加。
