我们说了决策树是一个爱问"是不是"的小侦探,靠一连串问题把答案一步步逼出来。上篇结尾我们问了:这棵树到底是怎么"长"出来的?有哪些不同的"长法"?它们分别用在什么场景?
现在就来拆开看看。
树的"生长法则":怎么决定该问什么问题?
决策树生长的核心问题只有一个:在每个节点上,该问哪个问题?
你要从一堆特征里挑一个出来当问题。挑哪个?原则很简单------挑那个最能"把数据分开"的。什么叫"最能分开"?就是问完这个问题之后,子节点里的数据尽可能"纯"------比如左边的子节点里几乎全是"去打球",右边的子节点里几乎全是"不去打球"。
不同的算法用了不同的数学标准来衡量这个"纯不纯"。主流的有三种:
ID3:用"信息增益"。信息论里有个概念叫"熵",代表混乱程度。问了一个问题之后,熵下降得越多,说明这个问题越有效。
C4.5:ID3的升级版。它修正了ID3的一个毛病------偏爱那些取值特别多的特征(比如"用户ID"这种每个样本都不同的特征)。C4.5用"信息增益率"来平衡。
CART:最主流的一种。它既能做分类也能做回归。分类时用"基尼不纯度",回归时用"均方误差"。CART长出来的是二叉树------每个节点只分出两个叉,不像ID3那样可以多叉。这棵二叉树更简洁,也更适合工程落地。
你不需要记住这些拗口的名字。你只需要知道:不同算法就像不同的木匠,用的尺子不一样,但打的家具都是决策树。
三大类型:一棵树 vs 一片森林
单个决策树其实挺"脆弱"的。它很容易被数据里的一点小噪声带偏------换几个样本,整棵树的结构可能就变了。这叫"高方差"。为了解决这个问题,后人发明了"集成学习"------种一整片森林,让很多棵树一起投票。
所以决策树的类型,可以分成三个层次:
类型一:单棵决策树
就是最原始的形态。你给它数据,它长出一棵树。优点是极其直观,画出来就能给人看。缺点是准确率一般,而且不稳定。
你什么时候用单棵树?当你需要向别人解释的时候。比如你做了一个"客户流失预警"模型,业务部门的人问你:"凭什么说这个客户要流失?"你把树画出来,他们一看就懂了。准确率低几个百分点没关系,能让他们信服、愿意用,比什么都重要。
类型二:随机森林
这是目前最流行的决策树变种之一。它的做法很简单:种很多棵树,每棵树用的数据不太一样,最后让所有树投票决定结果。
具体怎么操作?两招:
从原始数据里有放回地随机抽样,每一棵树用的数据集都不一样(大概是用原始数据的63%左右)。
在每个节点上,不让你从所有特征里选,而是随机挑一小撮特征,只从这里面选最好的那个问题。
这两招加在一起,保证了森林里的每一棵树都"长得不一样"。有的树可能更依赖某个特征,有的树更依赖另一个。单棵树可能犯错,但几十棵、几百棵树一起投票,错误互相抵消,准确率就上去了。
随机森林几乎继承了决策树的所有优点------能处理混合数据、不需要太复杂的预处理、能输出特征重要性------同时大大提升了准确率和稳定性。它是很多数据科学家的"第一选择":上来先跑个随机森林看看效果,效果好就继续调优,效果不好再换别的模型。
类型三:梯度提升树(GBDT)
这个比随机森林更"卷"。
随机森林是让所有树独立地长,最后大家平起平坐地投票。梯度提升树不一样:它是一棵树一棵树挨着长,后面的树专门去纠正前面那棵树犯的错误。
过程是这样的:先长第一棵树,它肯定有预测不准的样本。第二棵树不是为了"整体预测",而是专门去学第一棵树留下的残差------就是那些没预测准的部分。第三棵树再去学第二棵树没搞定的残差。如此下去,一棵接一棵,像接力赛一样。
最后预测的时候,把所有树的预测结果加起来,就是最终答案。
梯度提升树的准确率通常比随机森林还高,但训练也更慢,而且需要更小心地调参数------树太多会"过拟合",树太少又欠拟合。
这个家族里最出名的几个成员:
XGBoost:陈天奇开发,横扫各种数据竞赛,至今还是Kaggle上最常用的神器之一。
LightGBM:微软出品,训练更快、内存更省。
CatBoost:擅长处理类别特征,不需要你自己做"哑变量编码"。
你只要记住:随机森林是"大家一起独立投票",梯度提升是"后面的人给前面的人纠错"。前者稳,后者准。
说了这么多,它到底有什么用?
决策树的作用,可以概括成四个字:能打、能讲、能排、能选。
作用一:分类------最经典的老本行
决策树最初就是为分类而生的。银行判断要不要批贷款、医院判断病人属于哪个风险等级、邮件系统判断是不是垃圾邮件------这些都是决策树的经典场景。
它的优势不是准确率最高(深度学习在某些任务上比它准),而是你可以跟别人解释。一个银行风控经理拿着你建的决策树模型,可以坦然地跟审计说:"你看,这个客户的收入低于5000,而且没有房产,而且信用卡逾期过两次,所以被拒绝了。"每一笔拒绝都有据可查,监管机构挑不出毛病。
作用二:回归------预测一个数值,而不是一个类别
很多人不知道决策树也能做回归。不是输出"是/否",而是输出一个数字,比如预测房价、预测明天的气温、预测产品的销量。
回归树的逻辑很简单:每个叶子节点不再是"去打球"或者"不去打球",而是一个数字------这个节点里所有样本的平均值。比如你分到某个叶子节点,里面有100个房子,均价300万,那新来的房子就预测300万。
回归树在处理"非线性关系"的时候特别好用。传统的线性回归假设房价和面积是直线关系,但现实往往是:面积小于50平的时候每增加1平涨1万,大于100平的时候每增加1平只涨5000。回归树不需要你手动处理这种"拐点",它自己会从数据里找出来。
作用三:特征重要性排序------告诉你哪个因素最管用
决策树还有一个隐藏技能:它可以告诉你,在它做判断的过程中,每个特征被"用"了多少次、起到了多大作用。
你把一棵树或者一片森林训练完之后,它能输出一个"特征重要性"列表。比如在预测房价的任务里,它可能告诉你:"面积"最重要,贡献了60%的预测能力;"地段"第二,贡献了25%;"房龄"第三,10%;"有没有电梯"只有5%。
这个信息本身就已经很有价值了。你可以用它来:
删掉那些"不重要"的特征,简化模型。
告诉业务方:"别看我们收集了50个字段,真正起作用的就那五六个。"
发现一些反直觉的洞察:原来"学区"比"装修"重要十倍?
作用四:规则提取------把模型变成业务语言
有些时候,你根本不需要一个"模型"。你需要的是一套可以写进业务手册里的规则。
决策树最擅长干这个。你把树长出来,然后沿着每一条从根到叶子的路径,读出一串"如果...那么..."的规则。把这些规则写下来,就是一份可执行的标准操作流程。
举个例子,一个电商客服团队想判断"哪些订单需要优先处理"。你用历史数据训练一棵决策树,然后提取出规则:
如果订单金额 > 5000元,且 配送城市 = 一线城市,且 客户等级 = VIP → 优先处理
如果订单金额 > 5000元,且 配送城市 ≠ 一线城市 → 普通处理
如果订单金额 ≤ 5000元,且 商品类目 = 生鲜 → 优先处理
这些规则可以直接给客服系统的开发人员去写代码,或者直接写进工单流转规则里。不需要部署任何"模型",不需要维护任何"推理服务",就是一行行纯粹的if-else。简单、稳定、好改。
尾声:那个爱问"是不是"的小侦探,后来怎么样了?
回到上篇开头的那个比喻。
那个靠一连串"是不是"猜出长颈鹿的小朋友,长大了。
他不再只会在游戏里猜动物了。他去了银行,帮客户经理判断要不要批贷款;他去了医院,帮医生给病人做初步筛查;他去了电商公司,帮运营分析"哪些因素最影响用户下单"。
他从来不追求"最准",因为他知道自己不是深度学习那种"天才型选手"。他的长处是让人能听懂、让规则能落地、让数据里的规律能变成人话。
在AI这个追求"更高更快更强"的赛道里,决策树活了六十多年还没被淘汰,不是因为它最能打,而是因为它最像人------问问题、看答案、一步步得出结论,每一步都明明白白。
这大概就是它最朴素的智慧:有时候,能被理解,比准确率高更重要。