机器学习中缺失属性值的处理策略
1. 基本概念介绍
在机器学习里,当从现实世界数据中推导决策树或决策规则时,处理缺失(未知)属性值是一个重要方面。在机器学习中,实例通常由一系列属性值表示,且这些属性值列表长度一般固定。
1.1 缺失属性值的来源
缺失属性值的来源主要有以下几种:
- 数据被遗忘或丢失。
- 某个属性对特定实例不适用。
- 属性值在特定上下文中无关紧要。
- 训练数据库设计者对特定属性值不关心。
其中,第一种来源可能是随机情况,其余则具有结构性特征。
1.2 相关定义
- 断言 :发送者和接收者共享的用于描述模型的代码或语言。
- 细节 :发送者和接收者共享的用于描述基于断言模型的数据的代码或语言。
- 消息 :传达信息的二进制序列称为消息。
- 香农信息 :如果一条消息宣布一个概率为 (P(E_1)) 的事件 (E_1),其信息内容为 (-\log_2 P(E_1)),这也是它的比特长度。
2. 缺失值处理策略
为了处理现实世界中的不完整数据,以下是七种常见的处理缺失属性值的策略:
2.1 忽略策略(Ignore - I)
在学习之前,简单忽略至少有一个缺失属性值的实例。在学习过程中确定匹配比率时不会出现困境,但这种方法对处理有噪声或部分指定的数据没有帮助。在分类时,缺失值与选择器的任何常规(已知)值都不匹配,选择器的匹配比率为 0。如果决策树中没有仅测试常规值的节点路径或未找到这样的规则,则将具有缺失值的实例分类为属于多数类。
2.2 未知值作为常规值策略(Unknown - U)
将未知(缺失)值视为给定属性的额外常规值。对于包含测试选择器 (S_n) 的选择器和第 (n) 个属性缺失的实例,如果测试形式为 (x_n =?)(“?” 表示缺失值),则匹配比率等于 1。对于数值(连续)属性,选择器由 (x_n \in V_j)((V_j) 是数值区间)或 (x_n =?) 形式的测试组成。
2.3 最常见值策略(Common - C)
在实际学习过程之前,需要知道类敏感的绝对频率 (F_{r,n,j});在分类之前,需要知道总体频率 (F_{n,j})。对于属于类 (C_r) 的示例中离散属性 (A_n) 的缺失值,用类敏感的常见值替换,该值通过最大化拉普拉斯公式 (\frac{F_{r,n,j} + 1}{F_{n,j} + R}) 来确定。在分类时,缺失值用总体常见值替换,该值最大化 (F_{n,j})。因此,匹配比率为 0 或 1,因为每个缺失值都被替换为具体的已知值。
2.4 比例分数策略(Fraction - F)
学习阶段
需要知道整个训练集的相对频率 (f_{r,n,j})。对于类 (C_r) 中离散属性 (A_n) 有缺失值的每个示例 (x),在实际学习阶段之前,将其替换为一组示例,缺失值 (A_n) 被 (A_n) 和 (C_r) 的所有已知值 (V_j) 替换。每个拆分示例(值为 (V_j))的权重为 (w_j = w(x) \times f_{r,n,j}),其中 (w(x)) 是原始示例 (x) 的权重。拆分示例的匹配比率通过标准方式计算。如果训练示例有多个缺失属性值,则对每个缺失值进行上述拆分,匹配比率可能会迅速下降,因此该策略应包含避免示例爆炸方法。
分类阶段
在决策树的情况下,具有给定属性 (A_n) 缺失值的示例沿着所有分支拆分,权重等于总体相对频率 (f_{n,j})。对于决策规则,选择器 (x_n = V_j) 的匹配比率定义为 (\theta = f_{n,j})。具有缺失值的实例用所有规则的条件进行测试,并分配给条件产生最大匹配比率的规则的类。
2.5 任意值匹配策略(Anyvalue - A)
在学习和分类中,缺失值与任何现有属性值匹配,因此任何选择器的匹配比率 (\theta) 对于任何缺失值都等于 1。在机器学习中,处理“任意值”没有统一方案,在某些系统中,具有属性 (A_n) 缺失值的示例被替换为 (J(n)) 个示例,其中缺失值依次被每个常规值 (V_j) 替换;在其他系统中,缺失的“任意值”在从训练集中移除覆盖示例时,被新生成规则中涉及的第一个属性值替换。
2.6 随机值替换策略(Random - Ran)
将属性 (A_n) 的缺失值替换为从其值集合 (V_j)((j = 1, \cdots, J(n)))中随机选择的值。对于数值属性,首先应用最常见值策略中的过程,即将整个数值范围划分为预定义数量的等长区间,然后用随机选择区间的平均值替换缺失值。随机过程有两种可能性:
- 按照均匀分布随机选择值,即所有值有相同机会。
- 根据值的分布选择值,即最频繁的值有最大机会被选中。
2.7 元填充策略(Meta - Fill - In - M)
利用另一个机器学习算法来填充缺失属性值。该元学习算法使用给定示例的其余属性值来确定(推导)属性 (A_n) 的缺失值。有以下几种方法:
- Breiman 设计的方法使用代理分割来确定缺失属性值,代理属性与原始属性具有最高相关性。
- Quinlan 引入的方法为每个属性构建决策树,尝试根据给定实例的其他属性值推导具有缺失值的属性的值。
- Lakshminarayan 等人使用 C4.5 等机器学习技术填充缺失值。
- Ragel 和 Cremilleux 使用关联规则范式诱导一组关联规则,该方法能够有效处理缺失属性值。
下面用表格总结这七种策略:
| 策略 | 描述 |
| ---- | ---- |
| Ignore (I) | 学习前忽略有缺失值的实例,分类时缺失值匹配比率为 0 |
| Unknown (U) | 将缺失值视为额外常规值,特定测试下匹配比率为 1 |
| Common (C) | 学习用类敏感常见值,分类用总体常见值替换缺失值 |
| Fraction (F) | 学习阶段拆分示例,分类阶段按不同范式处理 |
| Anyvalue (A) | 缺失值与任何属性值匹配,匹配比率为 1 |
| Random (Ran) | 用随机值替换缺失值,有两种随机方式 |
| Meta - Fill - In (M) | 利用其他机器学习算法填充缺失值 |
3. 匹配比率的定义
一个示例 (x) 与选择器 (S_n) 的匹配可以通过匹配比率来定义:
[
\theta(x, S_n) =
\begin{cases}
0, & \text{如果 } x_n \neq V_j \
1, & \text{如果 } x_n = V_j \
\in [0, 1], & \text{如果 } x_n \text{ 未知(缺失)}
\end{cases}
]
特定的匹配比率值由所选的缺失值处理策略确定。
4. 缺失值处理策略在不同机器学习范式中的应用
4.1 TDIDT 算法
Quinlan 将缺失值处理技术应用于 ID3 算法,其列表展示了两个未讨论的额外例程:
- 属性评估使用例程 I、C、M 和 R(即通过具有该属性缺失值的训练示例的比例来降低评估属性的表观信息增益)。
- 使用所选属性划分训练集时,使用例程 I、U、C、F、A、M。
- 分类阶段使用策略 U、C、F、M 和 H(即停止分类并将实例分配给最可能的类)。
Quinlan 将上述例程组合成三元组,每个三元组代表不同的总体策略,但并非所有可能的组合都有意义。他的实验表明,以 R 或 C 开头的策略表现较为准确,其中策略 RFF 最佳。Brazdil 和 Bruha 改进了分区训练集的策略,将策略 U 和 F 结合,称为 R(UF)(UF) 策略。
4.2 覆盖算法
Bruha 和 Franek 讨论了将缺失值策略嵌入到覆盖算法 CN4 中。决策规则的条件形式为 (cmplx = S_{q1} \& \cdots \& S_{qM}),其中 (S_{qm}) 是测试第 (q_m) 个属性的第 (j) 个值 (V_j) 的选择器。对于处理缺失值,需要定义示例 (x) 与规则条件 (Cond) 的匹配比率,有两种定义方式:
- 选择器匹配比率的乘积:(\theta(x, cmplx) = w(x) \prod_{m = 1}^{M} \theta(x, S_{qm}))
- 选择器匹配比率的平均值:(\theta(x, cmplx) = w(x) \frac{1}{M} \sum_{m = 1}^{M} \theta(x, S_{qm}))
其中 (w(x)) 是示例 (x) 的权重(默认值为 1),右边的 (\theta) 是选择器的匹配比率。
4.3 朴素贝叶斯算法
朴素贝叶斯算法处理缺失属性值的方式非常简单,因为它处理的概率实际上就是前面讨论的相对频率:学习阶段的类敏感相对频率 (f_{r,n,j}) 和分类目的的总体相对频率 (f_{n,j})。学习相对频率时,可以应用所有策略,但比例分数策略无用,因为它复制了训练集其余部分的分布。在分类具有缺失值 (A_n =?) 的实例时,也可以应用所有策略,比例分数策略将该实例替换为 (J(n)) 个实例,每个实例赋予权重 (f_{n,j}) 并分别进行分类。
4.4 关联规则诱导算法
Ragel 和 Cremilleux 提出的关联规则诱导算法使用了修改版的忽略例程。具有缺失属性值的实例不会从训练数据库中移除,但缺失值会被忽略(或“隐藏”)。
以下是这些范式中缺失值处理策略应用的 mermaid 流程图:
graph LR
A[TDIDT 算法] --> B[属性评估: I, C, M, R]
A --> C[划分训练集: I, U, C, F, A, M]
A --> D[分类阶段: U, C, F, M, H]
E[覆盖算法] --> F[定义匹配比率: 乘积或平均值]
G[朴素贝叶斯算法] --> H[学习: 所有策略(除 F)]
G --> I[分类: 所有策略]
J[关联规则诱导算法] --> K[修改版忽略例程]
5. 实验结果与分析
实验表明,在决策树和决策规则诱导算法中,忽略策略显然是最差的策略。有趣的是,关联规则诱导算法使用了其修改版本。在决策树诱导算法中,比例分数策略是最好的策略之一,但在决策规则诱导算法中效果不佳,这是因为两种范式处理示例的方式不同。未知值策略在规则诱导算法中表现较好,但在哲学和语义层面上,如何解释决策树或决策规则中涉及属性等于“?”(缺失值)的选择器的分支并不明确。比例分数策略可能会遇到问题,如果示例/实例有太多缺失值,会生成太多权重非常小的“分数化”示例。
每个数据集或多或少都有自己“喜欢”的处理缺失属性值的例程,这显然取决于每个数据集中噪声的大小和未知性的来源。可以通过创建训练集中的小“窗口”,检查每个策略在该窗口中的效率,然后选择最有效的策略;也可以利用外部背景(特定领域、专家)知识在属性层次树上的优势;还可以利用元组合器的概念,让学习算法为每个缺失值策略独立处理给定的训练集,所有缺失值策略并行使用,元分类器根据基础级别的结果做出决策。选择或组合各种缺失值处理策略是未来研究的一个开放领域。
6. 不同策略的优缺点总结
为了更清晰地了解各种缺失值处理策略,下面总结它们的优缺点:
| 策略 | 优点 | 缺点 |
| ---- | ---- | ---- |
| Ignore (I) | 实现简单,学习时无需处理缺失值的匹配问题 | 会丢失部分数据信息,对处理有噪声或部分指定的数据无帮助,可能导致模型性能下降 |
| Unknown (U) | 概念简单,将缺失值作为额外值处理 | 哲学和语义层面上,难以解释决策树或规则中涉及缺失值的分支 |
| Common (C) | 利用频率信息,学习阶段考虑类敏感性 | 可能会忽略其他有价值的信息,且依赖于频率统计的准确性 |
| Fraction (F) | 考虑了属性值的分布,在决策树诱导算法中效果较好 | 若示例缺失值过多,会生成大量低权重的拆分示例,导致计算量增大 |
| Anyvalue (A) | 匹配简单,在学习和分类中缺失值匹配比率为 1 | 缺乏统一处理方案,不同系统实现方式不同 |
| Random (Ran) | 引入随机性,可能避免单一策略的局限性 | 结果不稳定,依赖于随机选择的方式 |
| Meta - Fill - In (M) | 利用其他机器学习算法,可能更准确地填充缺失值 | 需要额外的计算资源和时间,且依赖于元学习算法的性能 |
7. 选择合适策略的考虑因素
在选择缺失值处理策略时,需要考虑以下因素:
1.
数据特点
:
- 数据的噪声程度:噪声较大时,某些策略可能更能适应。
- 缺失值的比例:缺失值比例高时,部分策略可能不适用。
- 数据的分布:属性值的分布情况会影响策略的效果。
2.
算法类型
:不同的机器学习算法对缺失值处理策略的适应性不同,如决策树、决策规则、朴素贝叶斯和关联规则诱导算法等。
3.
计算资源
:一些策略,如元填充策略,需要更多的计算资源和时间。
4.
业务需求
:根据具体的业务场景和目标,选择最适合的策略。
以下是一个选择策略的 mermaid 流程图:
graph LR
A[数据特点] --> B{噪声程度高?}
B -- 是 --> C{缺失值比例高?}
B -- 否 --> D{数据分布复杂?}
C -- 是 --> E[考虑 Meta - Fill - In 或 Fraction]
C -- 否 --> F{算法适应性?}
D -- 是 --> G[考虑 Common 或 Fraction]
D -- 否 --> F
F -- 决策树 --> H[考虑 Fraction 或 RFF 等]
F -- 决策规则 --> I[考虑 Unknown 或组合策略]
F -- 朴素贝叶斯 --> J[除 Fraction 外的策略]
F -- 关联规则 --> K[修改版 Ignore]
8. 示例代码模拟
为了帮助理解不同策略的实现,下面给出一个简单的 Python 代码示例,模拟部分缺失值处理策略:
import numpy as np
# 示例数据
data = np.array([[1, 2, 3], [4, np.nan, 6], [7, 8, 9]])
# 策略:Common
def common_strategy(data):
for col in range(data.shape[1]):
col_data = data[:, col]
valid_data = col_data[~np.isnan(col_data)]
common_value = np.argmax(np.bincount(valid_data.astype(int)))
data[np.isnan(col_data), col] = common_value
return data
# 策略:Fraction(简化示例)
def fraction_strategy(data):
# 这里简化为简单的拆分示例,未考虑权重
new_data = []
for row in data:
if np.isnan(row).any():
for col in range(len(row)):
if np.isnan(row[col]):
valid_values = data[:, col][~np.isnan(data[:, col])]
for val in valid_values:
new_row = row.copy()
new_row[col] = val
new_data.append(new_row)
else:
new_data.append(row)
return np.array(new_data)
# 应用策略
data_common = common_strategy(data.copy())
data_fraction = fraction_strategy(data.copy())
print("Common 策略处理后的数据:")
print(data_common)
print("Fraction 策略处理后的数据:")
print(data_fraction)
9. 结论
在机器学习中,处理缺失属性值是一个重要且复杂的问题。不同的策略适用于不同的场景,每种策略都有其优点和缺点。决策树、决策规则、朴素贝叶斯和关联规则诱导等不同的机器学习范式对缺失值处理策略的适应性也有所不同。实验结果表明,没有一种策略适用于所有情况,每个数据集都可能有自己“喜欢”的策略。
在实际应用中,需要根据数据的特点、算法类型、计算资源和业务需求等因素综合考虑,选择合适的缺失值处理策略。同时,可以通过一些方法,如创建小“窗口”测试策略效率、利用外部知识或元组合器的概念,来优化策略的选择。未来的研究可以进一步探索如何更有效地选择和组合各种缺失值处理策略,以提高机器学习模型的性能。
超级会员免费看
17万+

被折叠的 条评论
为什么被折叠?



