共计 1937 个字符,预计需要花费 5 分钟才能阅读完成。
为什么决策树是机器学习初学者的第一课
决策树作为最直观的机器学习算法之一,在银行信贷评估、医疗诊断、推荐系统等领域广泛应用。它的最大特点是像人类做决定一样层层判断——比如银行审批贷款时,先看收入,再看负债,最后查信用记录,这种分步决策过程天然适合用决策树建模。

我刚开始学机器学习时,就被它两个特点吸引:
- 可视化:训练完成后能直接看到树形结构,比黑箱模型好理解多了
- 无需特征缩放:不像 SVM、神经网络需要标准化数据,直接用原始值就能跑
决策树是怎样 ” 思考 ” 的
1. 理解信息熵——决策树的数学基础
决策树分裂节点的核心思想是:让子节点比父节点更 ” 纯 ”。这里 ” 纯度 ” 用信息熵衡量,公式很简单:
import numpy as np
def entropy(p):
return -p * np.log2(p) - (1-p) * np.log2(1-p)
举个实际例子:
- 父节点有 10 个样本,5 正 5 负,熵 =1(最混乱)
- 按某个特征分裂后:
- 左节点 8 个样本,7 正 1 负,熵≈0.54
- 右节点 2 个样本,2 负 0 正,熵 =0
- 信息增益 = 父熵 – 子熵加权和 = 1 – (0.80.54 + 0.20) ≈ 0.57
2. 三大分裂准则对比
实际应用中我们会遇到不同选择:
| 算法 | 适用问题 | 特点 | 缺点 |
|---|---|---|---|
| ID3 | 分类 | 只用信息增益 | 不能处理连续特征 |
| C4.5 | 分类 | 用信息增益比,可处理连续值 | 计算量较大 |
| CART | 分类 / 回归 | 用基尼系数,支持二叉树 | 容易过拟合 |
实际建议:大多数情况直接用 CART,sklearn 的 DecisionTreeClassifier 默认就是它。
手把手 Python 实战
1. 基础分类流程
用 sklearn 自带的鸢尾花数据集演示:
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier, plot_tree
import matplotlib.pyplot as plt
# 加载数据
iris = load_iris()
X, y = iris.data, iris.target
# 训练模型(限制树深防过拟合)clf = DecisionTreeClassifier(max_depth=3)
clf.fit(X, y)
# 可视化
plt.figure(figsize=(12,8))
plot_tree(clf, feature_names=iris.feature_names,
class_names=iris.target_names, filled=True)
plt.show()
运行后会看到一棵包含花瓣长度、宽度等判断条件的分层决策树,不同颜色代表不同类别。
2. 关键特征分析
决策树还有个实用功能——评估特征重要性:
import pandas as pd
# 获取特征重要性
importance = pd.DataFrame({
'feature': iris.feature_names,
'importance': clf.feature_importances_
}).sort_values('importance', ascending=False)
print(importance)
输出示例:
feature importance
2 petal length (cm) 0.666667
3 petal width (cm) 0.333333
0 sepal length (cm) 0.000000
1 sepal width (cm) 0.000000
说明在这个分类问题中,花瓣尺寸比花萼尺寸重要得多。
避坑指南:决策树常见问题
1. 解决过拟合的两种剪枝方法
-
预剪枝:训练前设置约束
clf = DecisionTreeClassifier( max_depth=5, # 最大深度 min_samples_split=10, # 节点最少样本数 min_impurity_decrease=0.01 # 分裂最小增益 ) -
后剪枝:训练后修剪(sklearn 不支持,可用 cost_complexity_pruning_path)
2. 处理类别不平衡
- 设置 class_weight 参数自动平衡
clf = DecisionTreeClassifier(class_weight='balanced') - 上采样少数类或下采样多数类
3. 性能优化技巧
- 大数据集用
max_features参数限制每层考虑的特征数 - 实时系统可提前将决策树转换为 if-else 规则
- 考虑用 LightGBM 等优化实现替代
下一步学习方向
当你掌握了单棵决策树后,可以思考:
- 随机森林是如何通过多棵树降低过拟合的?
- GBDT 为什么能比单棵决策树有更好的预测效果?
- 决策树的特征重要性评估方法能否用于其他模型?
决策树就像机器学习的乐高积木,它既能单独使用,更是构建随机森林、GBDT 等强大模型的基础组件。建议大家在实践中多调整参数观察效果,你会对机器学习有更直观的感受。
正文完
