连续值和缺失值详解
第一部分:如何处理连续值?
1.1 什么是连续值?
- 中文名称:连续值
- 英文全称:Continuous Value
- 英文音标:/kənˈtɪnjuəs ˈvæljuː/
“连续值”就是那些可以不断细分,有无限多个可能取值的数值。比如“重量”,它可以是150克、150.5克、151克等等,这些数字是连续的,构成了一个连续的序列。与之相对的是“离散值”,比如“颜色”只能是“红色”、“绿色”、“黄色”这些有限的、独立的选项。
在决策树中,我们通常的决策规则是:“如果颜色是红色,那么…”。但对于重量,我们没法说“如果重量是150克”,因为可能一个151克的水果也和150克的非常相似。所以,我们需要一个方法,把连续的值变成一个类似“是/否”的决策问题。
1.2 核心思想:找到一条“最佳分界线”
处理连续值的核心思想非常简单:为这个连续的特征找到一条最好的“分界线”(也叫阈值),把数据分成两部分。
举个例子:
我们有10个水果,已知重量和它们是否是苹果。数据如下(重量单位:克):
[120, 130, 140, 150, 160, 170, 180, 190, 200, 210]
对应的类别是:[梨,梨,梨,梨,苹果,苹果,苹果,苹果,苹果,苹果]
我们一眼就能看出来,大概在150克到160克之间有一条“分界线”,左边的很可能是梨,右边的很可能是苹果。
那么,决策树怎么精确地找到这个分界线呢?
1.3 具体步骤:“候选分裂点”与“评选标准”
第一步:排序并生成“候选分裂点”
我们把所有重量数据排序:120, 130, 140, 150, 160, 170, 180, 190, 200, 210。
“候选分裂点”就是相邻两个值的中点。为什么要中点?因为它正好是这两个值的分界线。
所以,我们的候选分裂点有:125, 135, 145, 155, 165, 175, 185, 195, 205。
第二步:为每个候选点“打分”,选出最好的
现在,我们需要一个“评选标准”来判断哪个分裂点最好。这个标准就是看分裂之后,两组数据的“纯度”是不是更高了。
- 什么是纯度? 就是一组数据里,同类别的样本尽可能多。比如一组全是苹果,纯度就非常高。
- 如何衡量纯度? 我们用一个叫“基尼指数”的工具。
- 中文名称:基尼指数
- 英文全称:Gini Index
- 英文音标:/ˈdʒiːni ˈɪndeks/
- 计算公式:Gini(D)=1−∑k=1K(pk)2\text{Gini}(D) = 1 - \sum_{k=1}^{K}(p_k)^2Gini(D)=1−∑k=1K(pk)2
- DDD 代表当前的数据集。
- KKK 是类别的数量(比如我们只有苹果和梨,K=2)。
- pkp_kpk 是第 kkk 类样本在这个数据集中所占的比例。
我们来计算一下:
-
对于整个数据集(10个水果,4个梨,6个苹果):
- p梨=4/10=0.4p_{\text{梨}} = 4/10 = 0.4p梨=4/10=0.4
- p苹果=6/10=0.6p_{\text{苹果}} = 6/10 = 0.6p苹果=6/10=0.6
- Gini总=1−(0.42+0.62)=1−(0.16+0.36)=0.48\text{Gini}_{\text{总}} = 1 - (0.4^2 + 0.6^2) = 1 - (0.16 + 0.36) = 0.48Gini总=1−(0.42+0.62)=1−(0.16+0.36)=0.48
-
我们试试用 155 这个分裂点:
-
左组(重量 ≤ 155):[120, 130, 140, 150, 160] -> [梨,梨,梨,梨,苹果] -> (4个梨,1个苹果)
-
右组(重量 > 155):[170, 180, 190, 200, 210] -> [苹果,苹果,苹果,苹果,苹果] -> (5个苹果)
-
左组的基尼指数:1−((45)2+(15)2)=1−(0.64+0.04)=0.321 - ((\frac{4}{5})^2 + (\frac{1}{5})^2) = 1 - (0.64 + 0.04) = 0.321−((54)2+(51)2)=1−(0.64+0.04)=0.32
-
右组的基尼指数:1−((05)2+(55)2)=1−(0+1)=01 - ((\frac{0}{5})^2 + (\frac{5}{5})^2) = 1 - (0 + 1) = 01−((50)2+(55)2)=1−(0+1)=0 (全是苹果,纯度100%!)
-
整体的加权基尼指数: 510×0.32+510×0=0.16\frac{5}{10} \times 0.32 + \frac{5}{10} \times 0 = 0.16105×0.32+105×0=0.16
-
-
分裂带来的“收益”:原来的基尼指数是0.48,分裂后变成了0.16。收益 = 0.48 - 0.16 = 0.32。这个收益很大!
决策树会像这样,为每一个候选分裂点(125, 135, …)都计算一遍这个“收益”,然后选择收益最大的那个点,作为最终的分裂规则。在我们的例子里,155很可能就是那个最佳分界线。
最终的分裂规则就是:如果重量 ≤ 155克,则分到左子树;如果重量 > 155克,则分到右子树。
第二部分:如何处理缺失值?
2.1 什么是缺失值?
- 中文名称:缺失值
- 英文全称:Missing Value
- 英文音标:/ˈmɪsɪŋ ˈvæljuː/
“缺失值”就是数据集中某个特征的信息空缺了。比如,我们有一个水果,颜色和形状都知道,但“重量”忘记称了,这一栏就是空着的或者标记为NaN。
直接扔掉带有缺失值的样本太浪费了,尤其是我们辛苦收集的数据。所以,我们需要一些聪明的方法来利用这些不完整的数据。
2.2 核心思想:让数据自己“说话”
处理缺失值的核心思想是:基于数据中已有的、非缺失的信息,来合理地“推测”或“分配”缺失值样本的命运。
2.3 常见处理方法
方法一:简单粗暴法——直接删除
如果带有缺失值的样本非常少,比如1000个里只有1、2个,那么直接删除它们对整体影响不大。这是最简单的方法。
方法二:通用填补法——用众数/中位数/均值填补
- 众数:对于“颜色”这种离散特征,用数据集中出现次数最多的颜色来填补。
- 均值/中位数:对于“重量”这种连续特征,用所有水果的平均重量或中间重量来填补。
方法三:决策树专属的聪明方法
这是重点,我们讲两种最经典的方法:
1. 替代分裂
- 中文名称:替代分裂
- 英文全称:Surrogate Splits
- 英文音标:/ˈsɜːrəɡət splɪts/
这就像你有一个备选方案。假设我们最好的分裂特征是“重量”,规则是“≤155克”。
现在来了一个水果,它的重量数据缺失了,我们没法用它做判断。怎么办?
我们提前找好一个和“重量”最相似的“替补队员”,比如“颜色”。我们发现,在已知重量的数据里,红色和重量>155克有很强的关联,绿色和重量≤155克有很强的关联。
那么,当重量缺失时,我们就问:“它是红色的吗?”
- 如果是,我们就把它当作“重量>155克”来处理,分到苹果组。
- 如果不是(是绿色),我们就把它当作“重量≤155克”来处理,分到梨组。
这个“颜色”特征,就是“重量”特征的替代分裂。决策树在训练时,会为每个主要分裂点都找好这样几个“替补队员”,以备不时之需。
2. 概率分配法
- 中文名称:概率分配
- 英文全称:Probability Allocation
- 英文音标:/ˌprɒbəˈbɪləti ˌæləˈkeɪʃən/
这个方法更精细。它不把缺失值的样本硬塞到某一边,而是让它“分身”,以一定的概率同时去两边。
举个例子:
还是那个“重量 ≤ 155克”的分裂点。
- 在非缺失的样本中,有80%的样本去了左子树(梨),20%的样本去了右子树(苹果)。
- 那么,对于一个重量缺失的样本,我们就让它:
- 以80%的权重进入左子树参与后续计算。
- 以20%的权重进入右子树参与后续计算。
这就好比说:“我不知道你到底该去哪,但根据历史经验,像你这样的情况,有八成的可能是梨,两成的可能是苹果。所以,我让你在两个分支里都占个位置,但你的‘投票权’会按这个比例打折。”
这种方法能最大程度地利用信息,不会因为一个特征的缺失而完全丢失整个样本的价值。
总结回顾
| 处理问题 | 核心思想 | 关键方法 |
|---|---|---|
| 连续值 | 找到一条最佳的“分界线”(阈值) | 1. 排序后取中点作为候选分裂点 2. 用基尼指数等标准打分,选收益最大的点 |
| 缺失值 | 利用已有信息推测或分配 | 1. 替代分裂:找个替补特征做判断 2. 概率分配:让样本按概率“分身”到各个分支 |
Q1:构造树时,如何在(训练集中)属性值有部分缺失的情况下选择划分属性?
通俗理解: 当训练数据有些不完整时,我们该怎么挑选"最佳提问问题"?
核心方法:使用"可用样本"进行计算,并给予"折扣"
决策树(特别是C4.5算法)使用一种非常聪明的方法来解决这个问题。
第一步:只看"完整"的数据
- 当我们评估一个属性(比如"年级")时,我们暂时忽略在这个属性上有缺失值的所有样本。
- 我们只使用那些"年级"信息完整的学生数据来计算这个属性的"好坏"(比如信息增益)。
第二步:计算"有效比例",打个折扣
- 计算在"年级"这个属性上,有效样本占全体样本的比例。
- 数学公式:ρ=有效样本数总样本数\rho = \frac{\text{有效样本数}}{\text{总样本数}}ρ=总样本数有效样本数
- 例如:总共有100个学生,其中10个学生的"年级"信息缺失,那么有效比例 ρ=90100=0.9\rho = \frac{90}{100} = 0.9ρ=10090=0.9
第三步:计算"打折后"的信息增益
- 我们先正常计算只用有效样本得到的信息增益,记作 Gain完整\text{Gain}_{\text{完整}}Gain完整
- 然后给这个增益打个折:Gain最终=ρ×Gain完整\text{Gain}_{\text{最终}} = \rho \times \text{Gain}_{\text{完整}}Gain最终=ρ×Gain完整
- 为什么打折? 因为这个属性无法处理缺失值的样本,它的"实用性"打了折扣。一个即使理论上很好,但如果很多数据都用不上的属性,其实际价值就没那么高了。
第四步:比较所有属性
- 我们对每一个属性(“年级”、“专业”、“上次借书天数”)都重复上述步骤,计算出它们各自"打折后"的信息增益。
- 最后,我们选择"打折后"信息增益最高的那个属性,作为当前节点的划分属性。
举个例子:
- 属性A(年级):用90%的样本计算,原始增益很高为0.3,打折后 0.9 * 0.3 = 0.27
- 属性B(专业):用95%的样本计算,原始增益中等为0.25,打折后 0.95 * 0.25 ≈ 0.24
- 属性C(上次借书天数):用100%的样本计算,原始增益较低为0.22,打折后 1.0 * 0.22 = 0.22
最终,我们会选择属性A(年级)作为划分属性,因为它打折后的增益最高。
Q2:构造树时,给定划分属性,若训练样本在该属性上的值缺失,如何对该样本进行划分?
通俗理解: 我们已经决定按"年级"来分班了,但有个学生没填年级,我们该把他分到哪个班?
核心方法:概率分配法 —— 让这个学生"分身"到所有班级
我们不抛弃这个学生,而是用一种聪明的方式让他"参与"到所有分支中。
第一步:查看"完整"样本的分布情况
- 在我们选定的划分属性(比如"年级")上,查看所有非缺失样本是如何被划分的。
- 假设"年级"这个属性我们根据数据分布,决定分为"低年级(1-2年级)"和"高年级(3-4年级)"两类。
- 在90个有效样本中:
- 有60个被分到了"低年级"分支
- 有30个被分到了"高年级"分支
第二步:计算分配到各分支的概率
- 分配到"低年级"分支的概率:p低=6090=23p_{\text{低}} = \frac{60}{90} = \frac{2}{3}p低=9060=32
- 分配到"高年级"分支的概率:p高=3090=13p_{\text{高}} = \frac{30}{90} = \frac{1}{3}p高=9030=31
第三步:让缺失值样本"带权分身"
- 对于那个"年级"缺失的学生,我们不把他硬塞到某一个分支。
- 而是让他同时进入两个分支,但他在每个分支中的"重要性"(权重)不同。
- 他在"低年级"分支中的权重是 23\frac{2}{3}32
- 他在"高年级"分支中的权重是 13\frac{1}{3}31
这样做的意义:
- 我们没有丢失这个学生的所有信息(他可能专业、借书天数等特征是完整的)。
- 我们基于大多数人的情况,给了他一个最合理的"待遇"。
- 在后续构建子树时,这两个"分身"会带着各自的权重参与计算。
Q3:使用树时,若未知样本在该属性上的值缺失,如何对该样本进行处理?
通俗理解: 树已经建好了,现在来了一个新学生借书,但他的"年级"信息缺失,我们该怎么用这棵树来预测他是否会常来借书?
核心方法:多路径探索,加权投票决策
当我们要预测一个新样本,但在某个决策节点遇到属性缺失时,我们不会卡住,而是同时探索所有可能的路径。
第一步:在决策节点"分头行动"
- 当预测过程进行到一个节点,该节点用属性A(比如"年级")做判断,但新样本的A值缺失。
- 这时,我们不选择单一分支,而是让这个样本同时进入所有子节点继续向下预测。
第二步:记录每条路径的"权重"
- 每条路径的权重,来自于训练时Q2中计算出的概率。
- 继续上面的例子:在"年级"这个节点,我们去查看训练时计算好的概率:
- 走向"低年级"子树的权重是 23\frac{2}{3}32
- 走向"高年级"子树的权重是 13\frac{1}{3}31
第三步:在所有叶子节点收集结果
- 这个样本会同时到达多个不同的叶子节点。
- 每个叶子节点会给出一个预测结果(比如:"会常来借书"的概率是0.8,"不会常来"的概率是0.2)。
第四步:加权汇总,得出最终预测
- 我们将所有到达的叶子节点的预测结果,按照路径权重进行加权平均。
- 数学公式:最终概率=∑每个叶子(路径权重×该叶子的预测概率)\text{最终概率} = \sum_{\text{每个叶子}} (\text{路径权重} \times \text{该叶子的预测概率})最终概率=∑每个叶子(路径权重×该叶子的预测概率)
- 在我们的例子中:
- 假设"低年级"叶子节点预测"会常来"的概率是 0.9
- 假设"高年级"叶子节点预测"会常来"的概率是 0.4
- 那么最终概率 = (23×0.9)+(13×0.4)=0.6+0.133=0.733(\frac{2}{3} \times 0.9) + (\frac{1}{3} \times 0.4) = 0.6 + 0.133 = 0.733(32×0.9)+(31×0.4)=0.6+0.133=0.733
所以,我们预测这个新学生"会常来借书"的概率是73.3%。
总结与对比
让我们把三个问题的解决方案放在一起,你会发现它们逻辑上是连贯的:
| 问题 | 核心解决方案 | 形象比喻 |
|---|---|---|
| Q1:选哪个属性? | 打折比较法:只用完整数据计算,然后按有效比例打折 | 选一个"大多数人都能回答"且"答案有价值"的问题 |
| Q2:训练时缺失怎么办? | 概率分配法:让样本按概率"分身"到所有分支 | 让不知道自己在几班的学生,按比例去每个班都听听课 |
| Q3:预测时缺失怎么办? | 多路径加权法:同时走所有路径,结果按权重汇总 | 遇到答不出的问题,就把所有可能性都考虑一遍,再综合判断 |
