决策树、随机森林和GBDT

为什么树模型能统治 Kaggle?
Kaggle上80%的冠军方案用的都是树模型。
这个数字可能让很多人意外。
模型那么多,为什么偏偏是树?
今天我们就来扒一扒,从一棵简单的决策树,到随机森林、GBDT,这背后的设计智慧是什么。
一、决策树:机器的"诊断流程"
先从最基础的决策树说起。
想象你去看病。医生不会一眼就开药,而是会问一些问题:
"发热吗?"
"咳嗽吗?"
"喉咙痛吗?"
每个问题把病人分成两类,直到确诊。
机器学习里的决策树,就是这个逻辑。
不断问"是/否"的问题,把数据一步步分开,直到得出结论。
那机器怎么知道该问什么问题呢?
这就要提到"信息熵"了。
熵,简单说就是"不确定性"。
数据越混乱,熵越高;数据越整齐,熵越低。
决策树的目标很明确:每分一次,让数据变得更整齐,不确定性更低。
怎么衡量这个"更整齐"?
用"信息增益"。
就是看分裂前后,熵降低了多少。降低得越多,这个分裂越好。
CART算法就是用这个贪心策略,每次分裂选最优的特征和切分点。
不过它只能看到眼前,看不到未来。这是决策树的局限,也是所有贪心算法的局限。
二叉树结构有个好处:每一步只需要回答"是/否",简单高效。这就让决策树的可解释性很强。你可以画出这棵树,清楚地看到每个决策节点是什么。业务人员也能理解:哦,原来是看这个特征。
但决策树有个致命问题:很容易过拟合。一棵树太复杂,就会"记住"训练数据的噪声。比如我之前训练一个客户流失模型,单棵决策树在训练集上准确率能到95%,但测试集上直接掉到72%。这时候,就需要更多树来帮忙了。
二、集成学习:"三个臭皮匠"为什么能顶个诸葛亮
一棵决策树不够用,那就用多棵。
这就是集成学习的核心思想。
在讲具体怎么"集成"之前,得先理解两个概念:偏差和方差。
偏差,是"系统误差"。模型本身的假设太简单,预测值长期偏离真实值。
方差,是"随机波动"。模型对训练数据太敏感,换一批数据预测结果就差很多。
这两个东西是此消彼长的关系。你想降低偏差,模型变复杂,方差就会上升;你想降低方差,模型变简单,偏差就会上升。鱼和熊掌,难以兼得。
集成学习提供了两种思路,对应两种方法。
第一种叫Bagging,核心是"并行训练,多个模型取平均",降低的是方差。
想象让100个人独立估测班级平均身高,最后取平均。每个人估的可能都有误差,但平均下来,误差就小了。
第二种叫Boosting,核心是"串行叠加,每棵树学习前面树的错误",降低的是偏差。
想象第一个人估完了,第二个人专门去看第一个人哪里估错了,针对性地调整。这样一点点逼近正确答案。
这是两种完全不同的设计哲学,也是理解随机森林和GBDT各自擅长什么的关键。
三、随机森林:Bagging的集大成者
随机森林,就是Bagging的典型代表。
它是怎么工作的?
首先,从原始数据里有放回地抽样,每棵树的训练数据都略有不同。
其次,在每个节点分裂时,只随机选一部分特征来考虑,而不是所有特征。
这就是"随机"的两层含义:样本随机,特征也随机。
每棵树都是独立的,可以并行训练,互不影响。最后,所有树的预测结果汇总起来,分类任务投票少数服从多数,回归任务取平均值。
为什么要这样做?
Bagging的核心假设是:多个低偏差但高方差的模型叠加,整体方差会大幅降低。
单独一棵决策树,方差很高,容易过拟合。但100棵这样的树一起投票,过拟合的影响就被平均掉了。
就像让100个不同专业的医生会诊,每个医生看不同的检查报告,最后投票决定诊断。单个医生可能误诊,但集体误判的概率就小多了。
我之前做个反欺诈项目,用随机森林检测信用卡交易欺诈。单模型准确率也就80%左右,加上随机森林后提升到94%,而且误报率从15%降到了6%。效果还是很明显的。
随机森林的优势:抗过拟合能力强,可以并行训练效率高,对特征工程要求不高。
缺点是:可解释性不如单棵树,精度通常也不如Boosting系列的模型。
什么时候选随机森林?数据量较大、特征较多、担心过拟合的时候,随机森林是稳健的选择。
四、GBDT:Boosting的工程奇迹
如果说随机森林是"并行的智慧",那GBDT就是"串行的执着"。
GBDT,Gradient Boosting Decision Tree,梯度提升决策树。
它的核心思想是:每一棵树学习前面所有树的"残差"。
残差,就是预测值和真实值的差距。
比如真实值是100,第一棵树预测85,残差就是15。第二棵树不从头学,而是专门去学这个15。如果第二棵树预测出12,第三棵树就去学100-85-12=3这个残差。以此类推,每棵树都在补前人的"锅"。这样一点点逼近真实值。
这就像学射击。第一枪打偏了,记下偏移量。第二枪专门针对这个偏移量调整,瞄得更准。第三枪继续微调,直到命中靶心。
这解释了为什么GBDT必须串行:你得知道前一颗树打了多少环,才能决定这一颗怎么调。
每一轮训练的目标,是让当前预测加上新树的预测,接近真实值。
GBDT的数学原理也很漂亮。目标函数里既有损失函数(让预测更准),又有正则项(防止过拟合)。但损失函数通常很复杂,直接优化很难。GBDT用泰勒展开,把复杂问题简化。在泰勒展开之后,每一轮要做的就是拟合一个"伪残差",本质上就是梯度下降。这就是"梯度提升"的含义。
GBDT的工程实现也有几个重要细节:学习率控制每棵树的贡献,防止某棵树过拟合;特征分裂用贪心算法,和决策树一样高效。
GBDT家族的模型很多,XGBoost、LightGBM都是这个思路的工程优化。XGBoost在2014年Kaggle平台上首次亮相后,几乎屠榜了好几个月的比赛冠军。LightGBM则把训练速度提升了10倍以上,在工业界迅速普及。
五、三种树模型怎么选
说了这么多,到底该用哪个?
单棵决策树:简单、可解释,但精度有限,容易过拟合。适合数据量小、需要解释性、业务规则明确的场景。
随机森林:稳健、抗过拟合,可以并行,但精度不是最高。适合数据量大、特征多、需要稳健预测、不那么在意解释性的场景。
GBDT:精度高,但训练成本也高。适合数据量适中或较大、追求最高精度、可以接受调参成本的场景。
选手机可以这么理解:入门机够用但不强(决策树),旗舰机性能极致但贵(GBDT),中端机均衡之选(随机森林)。
实际项目中经常会把多种方法组合起来用,甚至把树模型和其他类型的模型做集成。没有万能药,只有最适合的选择。
树模型之所以强,本质上是因为它的设计哲学:简单组件的组合、通过集成降低偏差和方差、工程上的可扩展性。
从信息熵到泰勒展开,从并行Bagging到串行Boosting,这里面既有数学之美,也有工程智慧。理解了这些,下次调参的时候,你会知道自己在调什么,为什么这样调。这就是"懂"和"会用"的区别。
那如果数据没有标签怎么办?
你可能会想:决策树需要看例子来学习,随机森林和GBDT也是。但现实中有大量数据根本没有标签。没有"正确答案",机器怎么学习?
这就是下一篇要聊的问题了。
