决策树算法入门:信息增益与手算分裂过程详解

发布时间:2026/10/10 13:33:44
决策树算法入门:信息增益与手算分裂过程详解 先问你一个特别朴素的问题周末早上站在窗边看天云层有点厚但没下雨你今天到底跑不跑步正常人不会拿线性回归来回答这个问题而是下意识看一眼天色再掂量一下风力然后给个结论。把这种“如果天气差那么……否则……”的判断过程画出来就是一棵倒挂的树。而机器学习里的决策树算法干的事情正是把这种人人都会的判断习惯变成一套可量化、可复现的规则。这篇文章是这个系列的入门篇。上一轮我们在宏观上聊过决策树能干什么、适合解决什么问题这次我们沉下去把最核心的两件事彻底说透一是为什么“树”这个结构天然适合做决策二是支撑树生长的“信息增益”到底在算什么。文章里我会带你把一次完整的分裂过程用手算出来再看看树的过拟合和剪枝最后分享一点我在实际项目里用决策树的体会。适合刚接触机器学习的朋友也适合那些已经调过 sklearn 但一直没搞懂内部机理的人。1. 决策树到底在模仿人类思考的哪一步1.1 从“带伞吗”到 if-then 规则链我最早学决策树的时候有个困惑明明叫“算法”怎么感觉像在学逻辑判断后来想明白了决策树本身就不是那种“输入一堆特征算一个加权和然后过 sigmoid”的套路它更像你家楼下大爷判断“今天要不要出门下棋”的流程先抬头看天——下雨就不去没下雨再看风——风大也不去风和日丽就拎着棋盘出门。这个过程在计算机里就是一连串如果 天气 下雨: 不去 否则: 如果 风力 大: 不去 否则: 去你看结构天然就是一棵树每个节点是一个“判断题”每条分叉是一个答案走到头就是一个结论。机器要做的事不是凭空造出这些规则而是从一堆历史数据里“长”出这棵树来。1.2 一棵树的三个组成部分要理解后续的计算先把基本概念对齐。根节点整棵树的第一层判断对应数据里所有样本。它负责把整个数据集劈成两份或几份。内部节点中间层的判断点每个只处理从上面落下来的那部分子集。叶节点树的最末端不再有判断。叶节点上通常会挂一个标签比如“出门”或“不出门”。如果是回归任务叶节点挂的就是一个数值例如“明天气温 26 度”。树的生长过程本质上就是从根节点开始不断选一个特征、把数据劈开、再选一个特征、再劈开直到把数据分得足够“干净”。这个“干净”不是指每一格都一尘不染而是指每个子集里的样本尽量属于同一个类别。1.3 为什么这个结构在机器学习里不可替代你可能听过一句话深度学习是个黑箱而决策树是白箱。这不是夸张。神经网络拟合出来的是一条高维曲线你很难跟业务方解释清楚“为什么这位客户的贷款申请被拒绝”。但决策树不一样训练完你直接可以打印出一行规则如果 年龄 35 且 月收入 8000 且 历史还款记录正常: 通过审批这种规则是人能直接读、能拿去评审、能举一反三的。所以在风控、医疗辅助诊断、设备故障排查这类对解释性要求极高的场景里哪怕集成模型效果更好团队也常常会保留一棵单决策树作为“翻译官”。另一个原因是它基本不需要做特征缩放。你把年龄从“岁”换成“月”把收入取对数对决策树的结果影响极小因为它只关心排序和分界线不关心数值本来的尺度。这对快速建模、快速验证想法特别友好。2. 划分好坏的标准信息熵与信息增益2.1 纯度树生长想达到的终点如果让你手动拍板一个规则你会怎么选大概率会选择那个“一刀切下去两边类别尽量一致”的特征。比如一个班级里要区分“打篮球的”和“不打篮球的”你肯定先问性别而不是先问衣服颜色。为什么因为性别这个特征把人群切完后两边都比较“纯”。“纯”就是决策树的第一生产力。一个节点如果所有样本都是同一个类别它就不需要再往下分可以直接当叶节点。反过来如果一个节点里五五开那它很“不纯”留着它就是为了继续找特征把它劈得更干净。所以决策树的生长问题就变成了每一步选哪个特征来切能让切完之后的子节点最纯2.2 信息熵如何给“混乱”打分要给“混乱程度”打分信息论里有个现成的工具叫信息熵。熵这个词听起来玄乎你可以简单理解成“一个系统有多难预测”。一袋球全是红色你闭眼摸一个不用睁眼就知道是红的完全不难预测熵为 0。五红五蓝摸之前你完全没底熵最大。标准公式长这样H(D) - Σ p_i * log2(p_i)其中 p_i 表示第 i 类样本在集合里占的比例。二分类问题里假设正例占 p负例占 1-p那么H -p * log2(p) - (1-p) * log2(1-p)你可以代入两个极端去感受一下p1 时H0纯得不能再纯p0.5 时H1混乱到极点。别的值比如 p0.9 时H≈0.469介于中间。2.3 三种主流选择准则的差别围绕“怎么衡量切得好不好”历史上出现过三个经典方案你以后看资料会反复碰到准则代表算法核心公式思路适用场景信息增益ID3划分前后熵的差值偏向取值多的特征但简单直观增益率C4.5信息增益除以分裂信息量能对“多取值特征”做惩罚支持连续特征基尼指数CART从集合里随机抽两个样本类别不同的概率sklearn 默认方案计算量更小现在你如果用 sklearn默认的 DecisionTreeClassifier 使用的就是 CART默认的划分准则是基尼指数。但别纠结于“是不是用基尼就一定比熵好”——两者绝大多数情况下结果高度接近。理解信息增益的计算过程也就理解了后面所有变体的骨架。2.4 信息增益的直觉理解信息增益这个名字第一次听很拗口但我给你一个例子就通了。想象你在猜一个 1 到 100 之间的数字。如果你问“是不是 1 呀”哪怕答案是“否”你也只排除了一种可能这个问题的信息量极低。如果你问“大于 50 吗”不管答案是“是”还是“否”你都一下子排除了一半选项这个问题的信息量极高。机器学习选特征就是在做类似的事在所有候选问题里挑一个最能把“答案的不确定性”砍掉最多的问题。砍掉的那部分不确定性就是信息增益。谁砍得多谁就站在更高的节点上。3. 手算一棵树周末到底出不出门3.1 一个只有10条数据的例子“手算”这两个字吓退过不少人但其实决策树的单次分裂计算特别简单就是一个小学数学套公式的过程。我们用一个迷你数据集走一遍。假设我们统计了自己过去 10 个周末的状态记录下天气、温度、风力三个条件以及最后到底出没出门样本天气温度风力出门1晴热小是2晴热中否3晴温小否4晴凉大否5阴温小是6阴温中是7阴热大是8雨凉小是9雨温中否10雨凉大否第一步算出全局熵。10 条样本里 5 条出门、5 条不出门所以H(D) -0.5 * log2(0.5) - 0.5 * log2(0.5) 1.0这个值作为我们的“起点信息量”。接下来看每个特征能把信息量降到多少。3.2 根节点分裂的完整计算先算“天气”这个特征。按天气把数据分成三组晴样本 1、2、3、4其中 1 条出门、3 条不出门阴样本 5、6、7其中 3 条出门、0 条不出门雨样本 8、9、10其中 1 条出门、2 条不出门分别算三个子集的信息熵晴: H -0.25 * log2(0.25) - 0.75 * log2(0.75) ≈ 0.811 阴: H 0 全是“是”纯节点 雨: H -(1/3)*log2(1/3) - (2/3)*log2(2/3) ≈ 0.918然后按每个分支的样本占比做加权平均得到划分后的总熵H(D|天气) (4/10)*0.811 (3/10)*0 (3/10)*0.918 ≈ 0.600最后算信息增益Gain(天气) 1.0 - 0.600 0.400同理可以算另外两个特征Gain(风力) 1.0 - 0.875 ≈ 0.125 Gain(温度) 1.0 - 0.951 ≈ 0.049比较之后天气的增益最大所以根节点选择天气。这个结果也很符合直觉对于一个周末出不出门的问题天气本身就决定了大部分情况。3.3 递归生长完整树与训练精度选定根节点后数据被分成三份。阴天那组已经全是“是”不用再分可以直接当叶节点。晴和雨两组里都还有少量“噪音”理论上可以继续找特征去分。我建议你手算一下会比较有意思晴子集1 正 3 负里如果继续按温度分增益约为 0.311按风力分增益也约为 0.311。两者打平所以不同代码库可能选出略有差异的树。雨子集1 正 2 负里按风力分的增益是 0.918按温度分只有 0.251所以风力明显胜出。如果让树无限生长它最终一定会把所有训练样本都分对得到 100% 的训练精度。但在实际项目里我们通常不会让树长满。比如上面这棵树如果只用天气一个特征做判断天气 晴 → 不出门 天气 阴 → 出门 天气 雨 → 不出门它在训练集上已经能对 8/10 的样本做出正确判断。这就是“能抓住主要矛盾”的体现。剩下的 2 个误判样本是什么是样本 1晴热小风但出了门和样本 8雨凉小风但出了门。这类反常规样本从统计角度看更适合当作噪声而不是拼命分出一个诡异分支去硬记。3.4 这次手算告诉我们什么走完这一遍你会明显感受到决策树和梯度下降类模型的差别它没有“学习率”没有“迭代轮数”全靠“选特征、切数据”这个动作一路走到底。我也算过几十回这类小例子最大的体会是——你亲手算过一次之后再看 sklearn 输出那棵可视化树脑子里会自动浮现“这个分裂选了这个特征是因为它的信息增益当时最大”这种画面而不是把模型当黑箱。4. 树也会“背答案”过拟合与剪枝4.1 为什么越长越深越危险决策树最经典的毛病就是过拟合。原因也很直白它是个贪心算法每一步都选当前最好的分裂方式且没有任何“学习率”或“正则化”限制它记住每条样本的能力。只要数据够多树可以一直长长到每个叶节点只有一条样本训练集准确率 100%但换到新数据上立刻崩盘。打个比方一个学生如果连课本上每道题的答案都背下来但完全没掌握背后的题型规律那考试换一道题就不会做。决策树长满之后就是在“背答案”。4.2 预剪枝生长时踩刹车预剪枝的意思是在一开始建树的时候就限制它的生长。常见的做法是给这几个参数设上限max_depth树的最大深度。深度越大模型越能拟合细节但也越容易过拟合。min_samples_split内部节点再往下分裂所需的最小样本数。低于这个数就不让分。min_samples_leaf叶节点上至少要有多少样本。太小就会长出很多单样本小叶子。我平时做项目一般会先固定max_depth4或5再配一个min_samples_leaf5或10当底线。这两个参数是控制单棵树复杂度最有效的抓手。你把树打印出来看一眼如果深度已经到六七层、叶子又多又小那基本就是过拟合的前兆。4.3 后剪枝代价复杂度剪枝后剪枝的思路相反先把树长满再从下往上剪掉一些枝。sklearn 里 CART 使用的后剪枝方法叫代价复杂度剪枝它靠一个 alpha 参数来平衡树的复杂度和拟合能力。理解方式很简单一棵树越复杂节点越多它对训练集的拟合通常越好但也要付出“泛化能力下降”的代价。代价复杂度剪枝就是在损失函数里加一个复杂度惩罚项R_α(T) R(T) α * |T|其中 R(T) 是训练误差|T| 是叶节点数量α 是惩罚系数。α 越大树越容易被剪短。实际操作中你可以在 sklearn 里用ccp_alpha参数配合网格搜索找一个让验证集分数最高的 alpha 值。这个方法在数据量稍大的时候效果很明显但也比较消耗时间小数据集上用预剪枝就够。4.4 从一棵树到一片森林单棵决策树最大的缺点之一是不稳定训练数据稍微换几条树的结构可能就完全不同最后画出来的规则也会变。所以你会看到业界真正落地时很少用一棵裸树而是用一群树——随机森林或者梯度提升树。随机森林的思路特别朴素既然一棵树容易“偏科”那就种几百棵树每棵树只用一部分样本、一部分特征最后投票。这就像你面试一个人拿不准就叫来一群不同背景的面试官一起打分单个面试官的偏好被摊平了结果就稳定了。你在搞清楚单棵树的原理之后再去学随机森林会发现它就是“决策树的重复采样版”没有本质的新知识。5. 用决策树做项目的实战经验与常见坑5.1 数据预处理树的“佛系”与“挑剔”前面说决策树对特征尺度不敏感这是真的但它有别的讲究。连续特征方面决策树内部会自己搜索最优切分点比如“收入 8300 元”还是“收入 8500 元”它会在排序后尝试多个候选点所以一般不需要你做归一化。但你要注意如果一个连续特征的取值范围特别大比如几万到几亿它仍然可以正常工作只是搜索切分点的开销会变大。这时候分箱反而更容易出稳定结果。离散特征方面问题在于“类别太多”。假设你有一个“所在城市”特征包含 300 个城市决策树可能会优先去切它因为类别多就意味着很容易切出很纯的节点。这种增益虚高会让树产生误导。我的建议是高基数类别特征要么先做业务上的合并要么干脆不参与单棵树的训练让集成模型去处理。5.2 调参顺序先深度再叶子数量很多新手一上来就网格搜索一大堆参数其实没有必要。我自己的调参顺序是先跑一棵不限制深度的树观察它有多深、训练分数和验证分数差多少。把max_depth从 3 开始往上试每加一层记录验证分数的变化一般看到分数不再涨或者开始跌就停下来。固定一个合理的深度以后再调min_samples_leaf从 5 往上调让叶节点面积更大、结论更稳。最后才考虑max_features这类参数它对单棵树的影响不如集成模型那么明显。这个顺序的好处是每一步都只动一个旋钮你能清楚地知道“深度”和“叶子样本数”分别带来了什么变化。5.3 最容易翻车的三个现场我提三个自己踩过或者看别人踩过的坑你留意一下。第一个是用训练集跑网格搜索。决策树的训练集精度几乎是白给你在训练集上调得再好也没意义。所有参数选择都必须用验证集或交叉验证来完成。第二个是以为剪枝之后一定更好。剪枝是拿偏差换方差。如果你的数据非常干净、样本量也足够大剪得过狠反而欠拟合。别默认“树就该短”可以先跑一版长树看验证集表现。第三个是忽略特征重要性排序的波动。决策树的特征重要性来自“使用这个特征进行分裂时带来的增益总量”。它是有价值的探索工具但因为单棵树很不稳定一次跑出来的重要性排序可能很随机。要判断哪些特征真的重要最好用多棵树或者随机森林来汇总。5.4 从训练好的树里提炼业务规则单棵决策树最大的回报是你最后可以把模型变成一套业务规则。在 sklearn 里直接这样做from sklearn.tree import DecisionTreeClassifier, export_text clf DecisionTreeClassifier(max_depth3) clf.fit(X_train, y_train) print(export_text(clf, feature_nameslist_of_feature_names))输出会是一段缩进清晰的 if-then 结构。我做过一个客户流失预警项目最后把树打印出来给运营同事看他们一眼就明白“最近 30 天登录次数低于 2 次、且本月消费金额低于 50 元的用户非常容易流失”然后直接照这个规则去做召回活动。这种“模型即规则”的交付方式比给一个大好的神经网络预测分数要受欢迎得多。我个人在实际操作中的体会是决策树是最适合“一个人第一次动手建模型”的算法。它不需要装一堆依赖库不需要小心翼翼调特征尺度甚至不需要 GPU十几次分裂下来你就能看到一棵明明白白的树。但千万别因为它简单就跳过手算——拆开算过一遍信息增益你后面理解随机森林、XGBoost、LightGBM 的分裂过程会顺很多。最后再分享一个我自己的小习惯遇到新的表格型数据集我永远是先跑一棵深度为 3 的决策树看看 feature_importances_用它给整个建模流程画一张地图。你试过一次就会知道这个动作能帮你少走很多弯路。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询