在当今世界,从多个来源收集数据,用于分析、生成洞察、验证理论等。这些来自不同资源的数据可能经常有一些信息缺失,这可能是由于数据收集或提取过程中的问题,可能是人为错误。因此,处理这些缺失值成为数据预处理中的一个重要步骤。选择估算方法至关重要,因为它可能显著影响工作结果。大多数统计和机器学习算法都基于数据集的完整观测值。因此,处理缺失信息变得至关重要。统计学中有大量文献讨论缺失值的来源及克服问题的方法。最好的方法是用估计值来填补这些缺失的观测值。
数据集中的缺失值可能是任何数据科学家的难题。具有缺失值的变量可能是一个非同小可的问题,因为没有简单的方法来处理它们。通常,如果数据中缺失观测值的比例相对于总观测值数量很小,可以简单地删除这些观测值。然而,情况并非总是如此。删除包含缺失值的行可能会导致失去有用的信息或模式。在统计学中,这导致自由度减少,因为独立信息的数量减少了。
在收集关于变量的观测值时,缺失值的出现是一个值得关注的问题。缺失值可能由于多种原因而发生,例如——机械/设备错误、研究者错误、受访者不可用、观测值意外删除、受访者遗忘、会计错误等。已经开发了框架来解释缺失值的原因和模式(Little & Rubin (2002), Salgado et. al. (2016)),这有助于确定随后的估算方法。缺失值的类型通常可以分类为:
用于缺失值估算的单变量方法是一种简单的估算值方法,可能并不总是提供准确的图像。例如,假设有与道路上汽车密度和空气中污染物水平相关的变量,并且有一些污染物水平的观测值缺失,通过均值/中位数水平的污染物来估算污染物水平可能不一定是适当的策略。在这种情况下,像k-最近邻(kNN)这样的算法可以帮助估算缺失数据的值。社会学家和社区研究人员认为,人类生活在社区中,因为邻居产生安全感和安全感,对社区的依恋,以及通过参与各种活动而产生的社区身份感。
类似的估算方法在数据上工作的是k-最近邻(kNN),它通过距离度量识别邻近点,并使用邻近观测值的完整值来估算缺失值。例如,假设家里缺少必要的食品,由于封锁,附近的商店都不开门。因此,向邻居求助,最终会煮他们提供给任何东西。这是从1-最近邻(向最近的邻居求助)的估算示例。相反,如果确定3个邻居,并向他们求助,并选择结合3个最近邻居提供的物品,那么这就是从3-最近邻的估算示例。同样,数据集中的缺失值可以通过数据集中k-最近邻的观测值来估算。数据集的邻近点是通过某些距离度量来识别的,通常是欧几里得距离。
让看一个例子来理解这一点。考虑在二维空间中的一对观测值(2,0),(2,2),(3,3)。这些点的图形表示如下所示:基于欧几里得距离的最短距离的点被认为是最近的邻居。例如,点A的1-最近邻是点B。对于点B,1-最近邻是点C。在存在缺失坐标的情况下,通过忽略缺失值并增加非缺失坐标的权重来计算欧几里得距离。
from sklearn.impute import KNNImputer
import numpy as np
# 示例数据集,包含缺失值
X = [ [3, np.NaN, 5], [1, 0, 0], [3, 3, 3] ]
print("X: ", X)
print("===========")
# 使用1个最近邻进行估算
imputer = KNNImputer(n_neighbors=1)
impute_with_1 = imputer.fit_transform(X)
print("\n使用1个最近邻估算: \n", impute_with_1)
# 使用2个最近邻进行估算
imputer = KNNImputer(n_neighbors=2)
impute_with_2 = imputer.fit_transform(X)
print("\n使用2个最近邻估算: \n", impute_with_2)
在上面的代码中,观测值1(3, NA, 5)和观测值3(3, 3, 3)在距离上最近(~2.45)。因此,使用1-最近邻估算观测值1(3, NA, 5)中的缺失值将给出一个估计值3,这与观测值3(3, 3, 3)的第二维相同。此外,使用2-最近邻估算观测值1(3, NA, 5)中的缺失值将给出一个估计值1.5,这与观测值2和3的第二维的平均值相同,即(1, 0, 0)和(3, 3, 3)。