在前面的几篇文章中,我们一直在讨论一个问题:一个模型,是如何学会预测的?

我们讲过:线性回归、逻辑回归、神经网络、偏差与方差、学习曲线、机器学习开发流程等,这些有一个共同特点——它们的决策过程,很难直接解释。

比如当一个神经网络预测:用户流失概率 = 0.83,你很难回答为什么是0.83? 

而今天要讲的这个模型,非常不一样。它的决策过程,几乎可以直接画出来。甚至看起来,就像一张产品决策流程图。

这个模型,就是决策树(Decision Tree)。

什么是决策树?

假设你在一家电商平台做用户运营。你的目标是:判断一个用户,是否值得发送优惠券。

你可能会这样思考: 

CODE
用户最近是否购买过商品?
    是 → 不发优惠券
    否 →
        是否浏览过商品?
            是 → 发优惠券
            否 →
                是否注册时间很短?
                    是 → 发优惠券
                    否 → 不发优惠券

这其实就是一个决策树。 一个典型的决策树长这样:

CODE
        最近是否购买?
           /        \
         是          否
       不发券      是否浏览?
                   /      \
                 是        否
               发券     注册时间短?
                         /        \
                       是          否
                     发券        不发券

注意一个关键点:

CODE
每一个节点,都是一个问题,
每一条路径,都是一个判断过程,
每一个叶子,都是一个最终决策。

这就是决策树的本质。

决策树的核心思想

很多人第一次看到决策树,会觉得这也太简单了。确实,它的逻辑非常接近人类思考方式。

决策树做的事情只有一件:不断问问题,把数据分成越来越“纯”的类别。

假设我们有一组用户数据: 

是否购买过
是否浏览过
是否新用户
是否发送优惠券
否
是
是
是
否
否
是
是
是
是
否
否
是
否
否
否

你会发现,如果我们先问:是否购买过? 数据会被明显分成两组。

这就是决策树最重要的原则: 每一次分裂,都是为了让数据变得更“干净”。

在决策树中,这个概念叫:纯度(Purity)。而算法的目标,就是选择一个问题,让数据分得最清楚。

决策树是怎么“长”出来的?

很多人会以为,决策树是人工设计的。其实不是,它是自动生成的。

决策树生成过程如下:

CODE
Step 1:选择一个最好的问题(根节点)
Step 2:把数据分成两组
Step 3:对每一组重复这个过程
Step 4:直到不需要再分

你可以把它想象成一个不断细化分类的过程。

假设我们有这些数据:

是否登录
是否投诉过
是否连续7天未使用
是否流失
否
否
是
是
是
否
否
否
否
是
是
是
是
否
否
否

决策树可能会这样构建: 

CODE
连续7天未使用?
      /       \
    是         否
   是否流失     不流失

因为这个问题一下子把用户分开了,这就说明,这个特征,非常有用。

什么时候停止分裂?

如果一直分下去,会发生什么?答案是决策树会变得非常复杂,甚至把所有数据都记住——这就是过拟合(Overfitting)。

所以决策树必须知道什么时候该停止。

常见的停止条件包括:

CODE
1)数据已经完全一致
2)树的深度达到上限
3)样本数量太少
4)继续分裂意义不大

这些规则的目的只有一个:防止模型变得过于复杂。

决策树的一个巨大优点:非常容易解释

这是它在企业中非常受欢迎的原因。

比如银行审批贷款时,往往需要回答为什么拒绝这个申请?

如果用神经网络,很难解释。但如果用决策树,可以直接说: 

CODE
收入 < 5000
且
信用评分 < 600
所以
拒绝贷款

这叫: 可解释性(Interpretability)。

一个简单的TensorFlow决策树示例

虽然在真实项目中,通常会用:

CODE
XGBoost
LightGBM
RandomForest

但TensorFlow也支持决策树。下面是一个非常简单的例子: 

CODE
from sklearn.tree import DecisionTreeClassifier
model = DecisionTreeClassifier(
    max_depth=3
)
model.fit(X_train, y_train)
prediction = model.predict(X_test)

这里最重要的参数是:max_depth,它的作用是限制树的复杂度。

为什么很多比赛冠军模型,都是树模型?

因为它有三个非常现实的优势。

优势1:不需要太多数据预处理 

比如神经网络通常需要:

CODE
标准化
归一化
特征缩放

而决策树基本不需要。 

优势2:可以处理非线性关系

例如用户年龄与购买概率:

CODE
18 岁 → 高
25 岁 → 低
40 岁 → 高

这不是一条直线,但决策树可以轻松处理。 

优势3:非常稳定 

在很多结构化数据场景中,比如:

CODE
风控
推荐
广告
信贷

树模型往往比神经网络更可靠。

决策树的一个明显问题

决策树很容易记住数据。也就是说,非常容易过拟合。

例如:

CODE
用户ID = 12345 → 预测:流失

这显然没有意义,但如果树太深,就可能发生这种情况。 

所以控制树的复杂度,是决策树最重要的事情之一。


决策树不是在寻找最复杂的规则,而是在寻找最有区分力的问题。

它的工作方式非常像一个经验丰富的业务人员,不是问很多问题,而是问最关键的那个问题。

在机器学习的世界里,有些模型依赖复杂的数学,有些模型依赖强大的计算能力,而决策树提醒我们一件更朴素的事情——智能,并不一定来自复杂,而往往来自清晰的结构。

附录:本文涉及的专有名词中英文对照(标红为最核心)

中文术语
英文术语
说明
决策树
Decision Tree
一种通过不断提问,把数据一步步分类的模型
节点
Node
决策树中的一个判断位置
根节点
Root Node
决策树最顶层的第一个问题
叶子节点
Leaf Node
最终给出预测结果的位置
分裂
Split
根据某个特征,把数据分成两组
特征
Feature
用来判断的数据变量(如是否登录、是否购买)
标签
Label
模型要预测的目标结果
纯度
Purity
一个节点中数据是否属于同一类别
信息增益
Information Gain
选择哪个问题来分裂数据的标准
树的深度
Tree Depth
从根节点到最底层需要经过多少层判断
过拟合
Overfitting
模型过度记住数据,导致泛化能力变差
最大深度
Max Depth
控制决策树复杂度的关键参数