如前所述,数据很少是完美无缺的。您会遇到的最常见缺陷之一是数据缺失。假设您正在预测房价,但有几套房子的面积没有记录。或者您正在对客户评论进行分类,而有些条目是空白的。大多数机器学习算法都要求数据集完整;它们本身不知道如何处理这些空缺。向它们提供含有缺失值的数据通常会导致错误或无法预料的结果。因此,处理缺失数据是数据准备中的一个基本步骤。识别缺失数据在处理缺失值之前,您需要找到它们。缺失数据可以以多种形式出现:标准空值: 许多编程环境和库将缺失的数值数据表示为 NaN(非数字),将缺失的对象或字符串表示为 None 或 null。这些通常最容易自动检测到。空字符串: 有时,缺失的文本数据表示为空字符串 ""。这可能需要进行特定检查。占位符代码: 数据集可能使用 999、-1、"N/A"、"?" 或 "Unknown" 等特定代码来表示缺失信息。查阅任何可用的数据文档或元数据以了解特定数据集中缺失值的编码方式很重要。如果存在此类代码,您需要告知工具将其视为缺失值。Pandas 等库在 Python 中提供了自动检测标准空值(NaN、None)的功能,使识别更容易。但是,请警惕非标准占位符。快速查看每列中的唯一值通常可以帮助发现这些自定义代码。处理缺失值的常见方法一旦识别出缺失数据,您有几种主要方法来处理它们。最好的方法取决于具体情况、缺失数据的量及其对您分析的潜在影响。1. 删除一种直接的方法是简单地移除缺失的数据。这可以通过两种方式完成:删除行(列表式删除): 如果特定观测值(行)在重要列中包含一个或多个缺失值,则可以移除整行。优点: 实施起来非常简单。如果缺失数据量极小(例如,少于 1-5% 的行)且随机分布,这可能不会显著损害模型的性能。它确保剩余数据点是完整的。缺点: 可能丢弃大量数据,特别是当缺失值分布在许多行中,或者即使一个缺失值导致行删除时。这会减少训练集的大小,可能削弱您的模型。如果数据并非完全随机缺失(例如,某些群体更可能存在缺失值),删除行可能会在您的分析中引入偏差,使模型对真实总体的代表性降低。删除列(特征删除): 如果某个特定特征(列)有很大比例的缺失值(例如,缺失超过 50-70%),它可能不包含太多有用信息,或者填充这些值的努力可能不值得。在这种情况下,您可能会决定移除整个列。优点: 简单。可以防止大部分为空的特征对模型产生负面影响或需要复杂的填充。缺点: 您会丢失该特征可能包含的任何信息,即使它很稀疏。选择正确的删除阈值(例如 50%、70%、90%)需要判断和对特征潜在重要性的理解。digraph G {rankdir=LR; node [shape=box, style=filled, fontname="sans-serif", fontsize=10]; A[label="带有缺失值的原始数据", fillcolor="#ffc9c9"]; B[label="删除行", fillcolor="#e9ecef"]; C[label="删除列", fillcolor="#e9ecef"]; D[label="简单填充(均值/中位数/众数)", fillcolor="#b2f2bb"]; A -> B; A -> C; A -> D;} 缺失数据(如 '?'、NaN)可以通过删除包含缺失值的行或通过填充(估算)估计值来处理。如果特征大部分缺失,删除列是另一种选择。2. 填充填充不是移除数据,而是用替代值填补缺失值。这可以保留您的样本量。简单的填充方法是初学者的常见起点:均值填充: 用该列中观测值的均值(平均值)替换缺失的数值。使用时机: 当数值特征的分布相当对称(没有严重偏斜)且没有明显异常值(极端高或低值)时使用。计算方法: 计算列中所有非缺失值的平均值。使用该平均值填补空缺。例如,如果温度是 [25, NaN, 28, 19],则 (25 + 28 + 19) / 3 的均值为 72 / 3 = 24。NaN 将被 24 替换。中位数填充: 用该列中观测值的中位数(排序后的中间值)替换缺失的数值。使用时机: 当数值特征存在异常值或偏斜分布时使用。中位数受极端值的影响小于均值。计算方法: 对列中的非缺失值进行排序并找到中间值。如果温度是 [25, NaN, 28, 19, 100],则排序后的非缺失值为 [19, 25, 28, 100]。中位数是两个中间值的平均值 (25 + 28) / 2 = 26.5。NaN 将被 26.5 替换。(如果是奇数个值,中位数就是单个中间值)。众数填充: 用该列中观测值的众数(最常出现的值)替换缺失的类别值(或有时是离散数值)。使用时机: 处理非数值特征(如颜色、类别:“晴天”、“多云”、“雨天”)或平均值没有意义的离散数字时使用。计算方法: 计算列中非缺失部分每个类别的频率。找到出现次数最多的类别。使用此众数填补空缺。如果天气是 ["Sunny", "?", "Cloudy", "Sunny", "Rainy"],则“Sunny”出现两次,而“Cloudy”和“Rainy”各出现一次。众数是“Sunny”,因此 ? 将被“Sunny”替换。简单填充的优点:易于理解和实现。保留样本量,因为不会仅仅因为缺失值而丢弃任何行。通常足以满足基本模型或作为初始方法。简单填充的缺点:减小特征的方差(分散程度),因为它引入了相同的值(均值、中位数或众数)。这可能使数据看起来比实际更不具变异性。扭曲特征之间的关系(协方差和相关性)。填充值仅基于列本身,忽略了与同一行中其他特征的潜在关系(例如,湿度可能与天气类型相关,但简单填充会忽略这一点)。可能引入偏差,特别是如果缺失值并非随机分布。例如,如果高收入者不太可能报告其收入,填充平均收入可能会使结果偏斜。尽管存在这些缺点,但简单填充是您数据准备工具箱中的一个有用工具,尤其是在刚开始时。更复杂的技术存在,例如根据其他特征预测缺失值(回归填充)或使用相似数据点的值(K-最近邻填充),但这些会增加复杂性,通常在后续内容中讲述。选择正确的方法没有单一的“最佳”方法来处理缺失数据;选择涉及权衡,并取决于您的具体情况:缺失数据的量: 如果只有极少量数据缺失(例如,<1-5%)且看起来是随机分布的,则删除行(列表式删除)可能是最简单且危害最小的选择。如果一列大部分为空(例如,缺失 >50-70%),删除该列可能是合理的,但要考虑即使是稀疏数据是否仍有用。数据类型: 数值特征使用均值/中位数填充,类别特征使用众数填充。数据分布: 对于数值数据,检查是否存在异常值或偏度。如果存在,优先选择中位数填充而不是均值填充。缺失的性质(进阶话题): 理想情况下,数据是完全随机缺失(MCAR)的,这意味着值缺失的概率与观测值和未观测值均无关。如果缺失性取决于其他观测特征(随机缺失 - MAR)或缺失值本身(非随机缺失 - MNAR),则删除可能引入显著偏差,使得填充可能更合适,尽管简单填充仍可能有局限性。充分理解这一点更进阶,但请注意数据缺失的原因会影响最佳策略。算法敏感性: 一些机器学习模型对缺失数据的处理方式比其他模型更敏感。通常好的做法是尝试几种合理的方法(例如,如果缺失数据很少,比较中位数填充与行删除),并在评估期间查看每种方法如何影响模型的性能。无论您选择哪种方法,请务必记录下来。这有助于确保可复现性,并允许您解释对最终结果的潜在影响。正确处理缺失值可确保您的算法接收完整数据,从而防止错误并使其更有效地学习模式。这是处理策展教科书示例之外的数据的实际必要条件。