清理缺失数据
重要
对机器学习工作室(经典)的支持将于 2024 年 8 月 31 日结束。 建议在该日期之前转换到 Azure 机器学习。
从 2021 年 12 月 1 日开始,你将无法创建新的机器学习工作室(经典)资源。 在 2024 年 8 月 31 日之前,可继续使用现有的机器学习工作室(经典)资源。
ML 工作室(经典)文档即将停用,将来可能不会更新。
指定如何处理数据集中的缺失值
类别: 数据转换/操作
模块概述
本文介绍如何使用 机器学习 Studio (经典) 中的清理缺失数据模块来删除、替换或推断缺失值。
数据科学家经常需要检查数据中的缺失值,然后执行各种操作来修复数据,或插入新值。 此类清理操作旨在防止训练模型时缺失的数据造成问题。
此模块支持使用多种类型的操作来“清理”缺失值,包括:
- 将缺失值替换为占位符、平均值或其他值
- 完全删除存在缺失值的行和列
- 基于统计方法推断值
提示
不熟悉机器学习? 本文提供了一个很好的解释,说明为什么要使用每种不同的方法来替换缺失值: 用于处理缺失值的方法
使用此模块不会更改源数据集, 而是在工作区中创建可在后续工作流中使用的新数据集。 还可以保存新的已清理数据集以供重复使用。
此模块还会输出用于清理缺失值的转换的定义。 可以使用应用转换模块,对采用相同架构的其他数据集重复使用此转换。
如何使用“清理缺失数据”
在此模块中可以定义清理操作。 还可以保存清理操作,以便日后将其应用于新数据。 请参阅以下链接中有关如何创建和保存清理过程的说明:
重要
用于处理缺失值的清理方法可能会对结果产生严重的影响。 建议体验不同的方法。 同时考虑到使用特定方法的理由,以及结果的质量。
替换缺失值
每次将清理缺失数据模块应用到一组数据时,将向所选的所有列应用相同的清理操作。 因此,如果需要使用不同的方法清理不同的列,请使用该模块的不同实例。
将 "清理缺失数据" 模块添加到试验,并连接具有缺失值的数据集。
对于“要清理的列”,请选择包含要更改的缺失值的列。 可以选择多个列,但必须在所有选定列中使用相同的替换方法。 因此,通常需要单独清理字符串列和数字列。
例如,若要检查所有数字列中的缺失值:
打开“列选择器”,然后选择“使用规则”。
对于“开头为”,请选择“无列”。
也可以从“所有列”开始,然后排除列。 最初,如果先单击“所有列”,则不会显示规则。但是,可以单击“无列”并再次单击“所有列”以从所有列开始,然后基于名称、数据类型或列索引筛选出(排除)列。
对于“包含”,请从下拉列表中选择“列类型”,然后选择“数字”或更具体的数字类型。
所选的任何清理或替换方法必须适用于所选的所有列。 如果任何列中的数据与指定的操作不兼容,模块将返回错误并停止试验。
对于“最小缺失值比率”,请指定执行操作所需的最小缺失值数目。
将此选项与“最大缺失值比率”结合使用可以定义针对数据集执行清理操作所要依据的条件。 如果太多或太少的少存在缺失值,则无法执行该操作。
输入的数字表示列中缺失值与所有值的比。 “最小缺失值比率”属性默认设置为 0。 这意味着,即使只有一个缺失值,也会清理缺失值。 有关如何使用此选项的示例,请参阅 设置清理操作阈值。
警告
每个列都必须满足此条件,才能应用指定的操作。 例如,假设选择了三个列,然后将最小缺失值比率设置为 0.2 (20%),但实际上只有一个列存在 20% 的缺少值。 在这种情况下,清理操作只会应用到缺失值超过 20% 的列。 因此,其他列将保持不变。
如果对缺失值是否已更改有任何疑问,请选择选项“生成缺失值指示器列”。 这会将某个列追加到数据集,以指示每个列是否满足最小和最大范围的指定条件。
对于“最大缺失值比率”,请指定要能够执行操作,最多可以存在多少个缺失值。
例如,你可能希望仅当 30% 或更少的行包含缺失值时才执行缺失值替换,并在 30% 以上的行包含缺失值时将值保持原样。
可将数字定义为列中缺失值与所有值的比。 “最大缺失值比率”默认设置为 1。 这意味着,即使列中缺少 100% 的值,也会清理缺失值。
注意
使用选项"最小缺失值 比率 "或" 最大缺失值比率"设置阈值时,即使所选列之一不符合条件,也无法执行清理操作。
对于“清理模式”,请选择以下用于替换或删除缺失值的选项之一:
使用 MICE 替换:对于每个缺失值,此选项将分配一个新值,该值是使用统计学中描述的"使用链式公式进行多变量估算"或"由链式公式进行多重估算"的方法计算的。 使用 多个计算方法,在填充缺失值之前,使用数据中其他变量对缺少数据的每个变量进行有条件建模。 相反,在单个计算方法中 (将缺失值替换为列平均值) 对数据进行一次传递以确定填充值。
所有计算方法都引入了一些错误或偏差,但多次计算可以更好地模拟生成数据和数据的概率分布的过程。
有关处理缺失值的方法的一般介绍,请参阅 缺失数据:最先进的状态。2002 年,Schafer 和)和 2002 年。
警告
此选项不能应用于完全空的列。 此类列必须被删除或按原样传递到输出。
自定义替换值:使用此选项可以指定应用到所有缺失值的占位符值(例如 0 或 NA)。 指定为替换值的值必须与列的数据类型兼容。
替换为平均值:计算列的平均值,并使用该平均值作为列中每个缺失值的替换值。
仅适用于“整数”、“双精度”或“布尔值”数据类型的列。 有关详细信息 ,请参阅 技术说明部分。
替换为中间值:计算列的中间值,并使用该中间值作为列中任何缺失值的替换值。
仅适用于“整数”或“双精度”数据类型的列。 有关详细信息 ,请参阅 技术说明部分。
替换为模式:计算列的模式,并使用该模式作为列中每个缺失值的替换值。
适用于“整数”、“双精度”、“布尔值”或“分类”数据类型的列。 有关详细信息 ,请参阅 技术说明部分。
删除整行:完全删除数据集中包含一个或多个缺失值的任何行。 如果可将缺失值视为随机缺失,此选项非常有用。
删除整列:完全删除数据集中包含一个或多个缺失值的任何列。
使用概率 PCA 替换 :通过使用线性模型替换缺失值,该模型分析列之间的相关性并估计数据的低维近似值,从中重新构造完整数据。 基础的维度减少是概率形式的主成分分析 (PCA)。它实现了 Tipping 和 Bishop 在《皇家统计学会》期刊系列 B 21(3) 第 611–622 页中提出的模型的变体。
与其他选项相比,例如基于链式方程的多重插补 (MICE),此选项的优点是不需要应用每个列的预测值。 取而代之,此选项计算完整数据集的协方差近似值。 因此,它可能会为许多列中缺少值的数据集提供更好的性能。
此方法的主要限制是它将分类列扩展到数字指示器中,然后计算所生成数据的密集型协方差矩阵。 另外,它没有为稀疏表示形式进行优化。 出于这些原因,由于很高的磁盘空间占用量而不支持具有大量列和/或大型分类域(成千上万)的数据集。
提示
请记住,所选方法应用于所选内容的所有列。 因此,如果要将某些缺失值替换为某些列中的零,但在其他列中插入占位符,则应该使用"选择数据集中的列"来分隔数据并使用"清理缺失数据"模块的不同实例。
如果选择了选项“自定义替换值”,则选项“替换值”可用。 键入一个新值,用作列中所有缺失值的替换值。
请注意,只能在“整数”、“双精度”、“布尔值”或“日期”数据类型的列中使用此选项。 对于日期列,也可以输入从 0001 年 1 月 1 日凌晨 12:00 开始算起的 100 纳秒时钟周期数作为替换值。
生成缺失值指示器列:若要输出某些信息来指示列中的值是否满足缺失值清理条件,请选择此选项。 设置新的清理操作并想要确保它按设计方式工作时,此选项特别有用。
运行试验,或选择" 清理缺失数据"模块 ,然后单击" 运行所选项"。
结果
模块将返回两个输出:
已清理的数据集:由所选列(已根据指定处理其中的缺失值)以及指示器列(如果选择了该选项)构成的数据集。
也会“传递”未选择进行清理的列。
清理转换:用于清理的数据转换,可以保存在工作区中,并在以后应用于新数据。
将保存的清理操作应用于新数据
如果需要经常重复执行清理操作,我们建议将用于数据清理的脚本保存为转换,以便重复用于同一数据集。 如果必须频繁地重新导入再清理采用相同架构的数据,则保存清理转换特别有用。
将 "应用转换" 模块添加到试验。
添加要清理的数据集,并将该数据集连接到右侧输入端口。
展开 工作室左侧 窗格中的"转换"组 (经典) 。 找到保存的转换并将其拖动到试验中。
将已保存的转换连接到应用转换的左侧输入端口。
应用保存的转换时,无法选择要应用该转换的列。 这是因为转换已定义并自动应用于原始操作中指定的数据类型。
但是,假设你基于数字列的子集创建了转换。 可将此转换应用到混合列类型的数据集而不会引发错误,因为只有匹配的数字列中的缺失值才会发生更改。
运行试验。
示例
请参阅以下示例,了解如何在此Azure AI 库:
学生性能预测:此示例中,为缺失值插入零。
二元分类器交叉验证示例:零用于填充缺失值,并创建一个指示器列来跟踪更改。 包含所有缺失值的列也会被保留。
航班延误预测示例:完全删除空行。
技术说明
本部分包含实现详细信息,以及已知问题和常见问题。
如果选择任何字符串列时使用了平均值或中间值选项,则会发生错误。 如果需要处理不同数据类型的列,请创建“清理缺失数据”的两个实例。
使用布尔值、整数、DateTime 或 TimeSpan 数据类型将列中的缺失值替换为平均值时,首先将列转换为浮点数,计算平均值,然后将结果舍入为原始数据类型的最近值。
当你键入替换值时,该值必须与选定列中的数据类型兼容。
对于数据类型
NaN
Inf
为–Inf
Double 的列,允许 、 和 的值。使用 MICE 方法时,使用经过训练的 MICE 模型来预测替换值。
使用 "清理缺失数据 "可以将其他列类型重置为 特征。 如果数据包含其他类型的列(如标签),请使用编辑 元数据 更正列类型。
对清理转换的使用限制
使用基于清理缺失数据 (保存的转换) 应用于新数据:
保存的转换无法生成指示器值,即使在原始清理操作中使用此选项。 在测试新转换时,将指示器值视为最有用。
转换不会基于新数据集计算新值。 换而言之,如果在数据集 A 上使用了"清理缺失数据"并生成平均值 0.5,则无论数据集 B 中的实际值如何,都将应用与在数据集 B 中替换缺失值的平均值相同的值。
新数据集中列的数据类型必须与最初创建转换的列的数据类型匹配。 如果对隐式更改数据类型的列执行任何操作,将引发错误。
例如,假设为整数数据列 [Col1] 创建平均值,并保存转换。 现在,你想要将清理转换应用于已使用公式调整的 [Col1] 的副本,例如 ([Col1] /1.5) 。 若要确保结果为整数,请对结果进行舍入,但在应用转换时仍收到错误。 但是,如果使用公式(如 ([Col 1] * 10) ,则不引发任何错误!
若要避免此类问题,请使用 编辑元数据 将数据类型显式重置为整数。 一般情况下,"应用 数学运算"模块 中的操作将数值列隐式更改为
double
。
设置和解释阈值
使用选项"最小缺失值比率"或"最大缺失值比率"指定清理操作阈值时,结果可能意外或令人困惑。 为了说明最大和最小缺失值选项如何工作,我们提供了汽车价格示例数据集中的一些示例,该数据集具有许多缺失值的列。
下表显示了该数据集中多个列的缺失值计数,以及针对数据集计算的缺失值的比率。 最右侧列 (缺失值的比率) 该值将用于根据指定的阈值评估数据集。
假设将" 最小缺失值比率"设置为 0.019,将 "最大缺失值比率 "设置为 0.020。 根据下表中的值,某些列满足阈值条件,有些列不满足阈值条件:
bore
列和stroke
满足阈值条件。normalized-losses
列 和compression-ratio
不满足阈值条件。
列名称 | 缺少值计数 | 缺少值比率 |
---|---|---|
规范化损失 | 41 | 0.2 |
缸径 | 4 | 0.019512195 |
笔划 | 4 | 0.019512195 |
压缩率 | 0 | 0 |
由于 所选 内容中的某些列不符合指定条件,因此未对任意列执行清理操作。 为了帮助你找出发生的情况,模块在两个指示器列中返回 值 FALSE , 和 bore_IsMissing
stroke_IsMissing
。
但是,如果将阈值更改回"最小缺失值比率"的默认值 0,将"最大缺失值比率"更改为 1,将返回所有选定列的指示器列,并执行指定的操作。
提示
如果不确定缺失值清理是否按预期工作,请选择"生成 缺失值指示器列" 选项。
已知问题
如果使用 MICE 方法清理数据,然后处理包含缺失值的数据集,则可能会收到以下错误:"AFx 库库异常:模型未训练。 (错误 1000 ) "
仅当选择了鼠标方法,且定型数据集不包含缺失值但测试数据集执行此操作时,才会发生此错误。
预期输入
名称 | 类型 | 说明 |
---|---|---|
数据集 | 数据表 | 要清理的数据集 |
模块参数
名称 | 范围 | 类型 | 默认 | 说明 |
---|---|---|---|---|
要清理的列 | 任意 | ColumnSelection | 全部 | 选择要执行缺失值清理操作的列。 |
最小缺失值比率 | [0.0;1.0] | Float | 0.0 | 仅清除其缺失值比率高于指定值、在所有选定列集中的列。 |
最大缺失值比率 | [0.0;1.0] | Float | 1.0 | 从所有选定列的集中,仅清理缺失值比率低于以上指定值的列。 |
清理模式 | 列表 | 处理策略 | 自定义替换值 | 选择在清理缺失值时要使用的算法。 |
替换值 | 任意 | 字符串 | "0" | 键入一个值来代替缺失值。 此值是可选的。 |
包含所有缺失值的列 | 任意 | ColumnsWithAllValuesMissing | 删除 | 指示是否应在输出中保留所有缺失值的列。 |
生成缺失值指示器列 | 任意 | 布尔 | false | 生成一个列来指示清理了哪些行。 |
迭代数 | [1;10] | Integer | 5 | 指定使用 MICE 时的迭代数。 |
PCA 预测的迭代数 | [1; 50] | Integer | 10 | 指定使用 PCA 预测时的迭代数。 |
Outputs
名称 | 类型 | 说明 |
---|---|---|
已清理的数据集 | 数据表 | 已清理的数据集 |
清理转换 | ITransform 接口 | 要传递给“应用转换”模块以清理新数据的转换。 |
例外
异常 | 描述 |
---|---|
错误 0002 | 如果一个或多个参数无法解析或者无法从指定的类型转换成目标方法所需的类型,则会发生异常。 |
错误 0003 | 如果一个或多个输入数据集为 null 或为空,则会发生异常。 |
错误 0008 | 如果参数不在范围内,则会发生异常。 |
错误 0013 | 如果传递给该模块的精简程序具有无效的类型,则会发生异常。 |
错误 0018 | 如果输入数据集无效,则会发生异常。 |
错误 0039 | 如果操作失败,则会发生异常。 |
有关特定于 Studio (经典) 模块的错误列表,请参阅机器学习错误代码。
有关 API 异常的列表,请参阅机器学习 REST API 错误代码。