机器学习4:决策树与随机森林算法
·
一、决策树算法基础
1.1 什么是决策树
决策树是一种树形结构的监督学习算法,它通过一系列 if-else 决策规则对数据进行划分,最终在叶节点给出预测结果。
- 分类树:叶节点输出类别标签
- 回归树:叶节点输出连续数值
1.2 核心概念
| 概念 | 说明 |
|---|---|
| 根节点 | 树的起始节点,包含全部样本 |
| 内部节点 | 对应一个特征和划分阈值 |
| 叶节点 | 最终预测结果 |
| 纯度 | 节点内样本的"同类程度" |
| 剪枝 | 防止过拟合的手段 |
1.3 常用分裂指标
- Gini系数:衡量节点不纯度,越小越纯
- 信息增益:基于熵的减少量
- 均方误差(MSE):用于回归树## 二、案例一:决策树多元回归
二、案例一:决策树多元回归
2.1 问题描述
使用体重和年龄两个特征,预测血压收缩压。
2.2 完整代码
import pandas as pd
from sklearn import tree
# 导入数据
data = pd.read_csv("多元回归.csv", encoding="GBK", engine='python')
# 建立回归模型
x = data[['体重', '年龄']]
y = data[['血压收缩']]
dtr = tree.DecisionTreeRegressor(random_state=0)
# 训练模型
dtr.fit(x, y)
# 预测
tree_predict = dtr.predict(x)
print(tree_predict)
# 模型校验
score = dtr.score(x, y)
print(score)
2.3 关键点解读
- 注意:回归任务,使用
DecisionTreeRegressor。 random_state=0保证结果可复现。score返回的是 R² 决定系数,越接近 1 说明拟合越好。## 三、案例二:电信客户流失预测(决策树分类)
三、案例二:电信客户流失预测(决策树分类
3.1 问题描述
预测电信客户是否会流失,属于二分类问题。
3.2 核心步骤
- 数据划分:训练集 80%,测试集 20%
- 交叉验证选参:遍历 max_depth,选择召回率最高的深度
- 模型训练与评估
- 决策树可视化
3.3 代码精华
# 交叉验证选择最佳深度
scores = []
param = [2, 3, 4, 5, 6, 7, 8, 9]
for i in param:
d = tree.DecisionTreeClassifier(criterion='gini', max_depth=i, random_state=0)
score = cross_val_score(d, data_train, target_train, cv=5, scoring='recall')
scores.append(score.mean())
best = param[np.argmax(scores)]
# 可视化决策树
fig, ax = plt.subplots(figsize=(32, 32))
plot_tree(dtr, filled=True, ax=ax)
plt.show()
3.4 评估指标选择
使用**召回率(Recall)**作为主要指标,因为"流失客户被漏掉"的代价更高。混淆矩阵和 classification_report 提供了全面的评估维度。## 四、随机森林算法基础
四、随机森林算法基础
4.1 什么是随机森林
随机森林是集成学习的代表算法,它通过构建多棵决策树并综合它们的投票结果(分类)或平均值(回归)来提高预测性能。
4.2 核心思想
- Bagging:有放回地抽样构建不同的训练子集
- 特征随机选择:每棵树分裂时只考虑部分特征
- 投票/平均:最终结果由所有树共同决定
4.3 优势
- 抗过拟合能力强
- 能处理高维数据
- 可输出特征重要性
五、案例三:信用卡欺诈检测(随机森林 + 下采样
5.1 问题描述
信用卡交易数据中,欺诈样本极少(类别不均衡),需要通过随机森林进行识别。
5.2 解决策略
- 数据标准化:对 Amount 列进行标准化
- 下采样(Under-sampling):将多数类样本数量降至与少数类相同
- 随机森林建模
5.3 核心代码
# 下采样
positive_eg = data_train[data_train['Class'] == 0]
negative_eg = data_train[data_train['Class'] == 1]
positive_eg = positive_eg.sample(len(negative_eg))
data_c = pd.concat([positive_eg, negative_eg])
# 随机森林
rf = RandomForestClassifier(n_estimators=100, max_features=0.8, random_state=42)
rf.fit(x_train_bal, y_train_bal)
# 特征重要性可视化
importances = rf.feature_importances_
5.4 特征重要性
通过 feature_importances_ 属性,可以直观地看到哪些特征对预测贡献最大,有助于特征筛选和业务解读。
六、案例四:垃圾邮件分类(随机森林 + 过采样 + 网格搜索)
6.1 问题描述
根据邮件的词频特征和字符特征,判断是否为垃圾邮件。
6.2 关键代码
# SMOTE过采样
from imblearn.over_sampling import SMOTE
oversampler = SMOTE(random_state=0)
x_train1, y_train1 = oversampler.fit_resample(x_train, y_train)
# 网格搜索
param_grid = {
"n_estimators": [100, 150, 200, 250],
"max_features": ["sqrt", "log2"]
}
grid = GridSearchCV(
estimator=rf0,
param_grid=param_grid,
cv=5,
scoring="recall"
)
grid.fit(x_train1, y_train1)
# 输出最佳参数
print(grid.best_params_)
6.3 结果解读
classification_report 输出精确率、召回率、F1-score。特征重要性图帮助理解哪些单词/字符对判断垃圾邮件最有用。
七、两种算法对比总结
| 对比维度 | 决策树 | 随机森林 |
|---|---|---|
| 解释性 | ★★★★★ 非常强 | ★★★☆☆ 一般 |
| 过拟合风险 | 较高 | 较低 |
| 训练速度 | RR | ాలు |
| 预测精度 | 一般 | 较高 |
| 特征重要性 | 支持 | 支持 |
| 适用场景 | 需要解释性的小型项目 | 追求精度的大中型项目 |
八、常见问题与调优建议
8.1 决策树调优
max_depth:控制树的深度,防止过拟合min_samples_split:节点分裂所需最小样本数min_samples_leaf:叶节点最小样本数criterion:gini 或 entropy
8.2 随机森林调优
n_estimators:树的数量,越多越稳定(但训练变慢)max_features:每棵树的最大特征数,常用 sqrt 或 log2max_depth:限制树深,减少过拟合class_weight:处理样本不均衡
8.3 样本不均衡处理
- 下采样:减少多数类样本(适合数据量大时)
- 过采样:增加少数类样本,如 SMOTE
- 调整 class_weight:给少数类更高的权重
九、学习心得
通过这四个案例的实战,我对决策树和随机森林有了更直观的理解:
- 决策树像是一位经验丰富的医生,通过一系列问题层层推理得出诊断结论,可解释性极强。
- 随机森林则像是一个专家会诊团队,每位专家(决策树)独立给出意见,最终集体决策,准确性和稳定性更高。
- 数据预处理往往比模型选择更重要,尤其是标准化、缺失值处理和样本均衡。
- 交叉验证和网格搜索是调参的利器,但要注意计算成本。
- 特征重要性分析不仅能优化模型,还能帮助业务方理解关键驱动因素。
更多推荐

所有评论(0)