Decision Tree
决策树通过一系列从数据中学到的特征问题来进行预测。了解如何选择划分方式、如何通过剪枝抑制过拟合,以及相关代码。
决策树是一种监督学习模型,通过针对输入特征连续提出是非问题来进行预测,例如“收入是否高于 50,000 美元?”,并根据答案从根节点一路遍历到包含预测结果的叶节点。分类树在每个叶节点预测一个类别,回归树则预测一个数值。每次预测都能用一串可读规则表示,因此决策树是可解释人工智能(XAI)的标准工具;决策树也是随机森林和梯度提升集成模型的构建基础,而后者在中等规模的表格数据集上仍胜过深度学习。Breiman、Friedman、Olshen 和 Stone 于 1984 年提出的 CART 算法,以及 Ross Quinlan 于 1986 年提出的 ID3 和 1993 年提出的 C4.5,奠定了从数据中学习决策树的方法。
决策树的构建方式#
决策树通过递归划分自顶向下生长。在每个节点,算法都会为候选分裂评分;每个候选分裂由一个特征和(对于数值特征)一个阈值构成。算法会保留能使两个子节点最同质的分裂,并在每个子节点中重复搜索。分类树使用基尼不纯度或熵来衡量同质性:基尼不纯度表示如果按照节点内各类别所占比例随机分配标签,节点中的随机样本被错误分类的概率;熵的减少量则称为信息增益。回归树会选择能最大程度降低平方误差的分裂,每个叶节点预测其训练样本目标值的均值。当节点变得纯净、样本数量太少或达到最大深度时,树便停止生长。每次分裂只向前看一步,因此这种贪心搜索能快速构建一棵不错的树;而要找到理论上最优的树是 NP-hard 问题。
Scikit-learn 的 DecisionTreeClassifier 实现了经过优化的 CART 版本。此示例在鸢尾花数据集上构建一棵深度为 2 的树,并打印出学到的规则:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier, export_text
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=42)
# A depth limit keeps the tree small enough to read and less prone to overfitting
clf = DecisionTreeClassifier(max_depth=2, random_state=42)
clf.fit(X_train, y_train)
print(export_text(clf, feature_names=iris.feature_names))
print(f"Test accuracy: {clf.score(X_test, y_test):.2f}")这棵树只使用花瓣长度:长度不超过 2.45 厘米的花归为 setosa(类别 0);另一个阈值 4.75 厘米则将 versicolor(类别 1)与 virginica(类别 2)分开。这些规则能正确分类 97% 的留出花样本。
每次分裂都是这种形式的阈值规则,既可以由树从数据中学到,也可以由人手动设定。Ultralytics AIGym 训练监测器会为 YOLO26 姿态估计输出手动设置两条此类规则:根据肩部、肘部和手腕关键点计算出的肘部角度超过 145° 时,将帧标记为“向上”;角度低于 90° 时则标记为“向下”;每次从向上变为向下时计为一次重复。
过拟合与剪枝#
如果一棵树一直生长到每个叶节点都纯净,它就会记住训练数据,连噪声也不放过,这是教科书式的过拟合。预剪枝通过最大深度或叶节点最少样本数等限制提前停止生长。后剪枝会先生成完整的树,再移除贡献很小的分支;scikit-learn 通过 ccp_alpha 参数实现最小代价复杂度剪枝,数值越大,剪枝越多。这两种限制都是通过交叉验证选择的超参数。
即使经过剪枝,决策树仍有较高方差:训练数据稍有变化,就可能改变顶部的分裂,进而改变其下方的所有分裂。集成模型通过组合多棵树来解决这一问题:随机森林会对使用自助采样样本训练的树求平均,而梯度提升则会逐棵添加树,以纠正前面树的错误。
优势与局限#
决策树可以同时处理数值和类别特征,无需缩放特征,无需手动进行特征工程就能捕捉交互和非线性效应,而且只需几次比较即可完成预测。决策树的分裂与坐标轴对齐,因此“支出超过收入”这样的对角边界会变成由许多分裂组成的阶梯,除非添加一个比值特征。回归树会在每个叶节点内预测一个常数,因此不同于线性回归,无法外推训练数据范围之外的趋势。
应用场景#
- 信用决策:贷款机构使用浅层树和基于树的评分卡,按风险对申请进行分类;每项决策都能追溯到产生该决策的收入、信用历史和债务阈值。
- 临床分诊:以树形式构建的临床决策规则会根据生命体征和症状为患者分流,例如判断患者是否需要立即进行影像检查。
- 客户流失:决策树根据客户的使用情况、在网时长和支持服务记录划分客群,识别取消服务风险高低的群体,并以通俗语言描述每个群体的判断路径。
- 预测性维护:基于振动、温度和运行时间特征训练的梯度提升树,可估算哪些机器可能在下次维修前发生故障。










