如何以通常的方式估算缺失值?

数据挖掘 机器学习 深度学习 数据挖掘 预测建模 缺失数据
2021-10-03 06:22:05

我有一个包含 4712 条记录的数据集,用于二进制分类。标签 1 为 33%,标签 0 为 67%。我不能删除记录,因为我的样本已经很小。因为很少有列有大约 250-350 条缺失记录。

我怎么知道这是missing at random,missing completely at random还是missing not at random. 例如:4400 名患者有读数,330 名患者没有读数。但我们希望这些 330 有读数,因为这是一个非常常见的测量值。那么这叫什么?

此外,对于我的数据集,使用meanmedian直接填充缺失值是没有意义的。我一直在阅读诸如等之类的Multiple Imputation算法Maximum Likelihood

有没有其他算法可以很好地以稳健的方式填充缺失值?

有没有这方面的python包?

有人可以帮我弄这个吗?

4个回答

为了决定哪种策略是合适的,重要的是调查导致缺失值的机制,以确定缺失数据是完全随机缺失 (MCAR)、随机缺失 (MAR) 还是非随机缺失 (MNAR) )。

  • MCAR意味着数据的缺失与任何值之间没有关系。
  • MAR意味着缺失值的倾向与观察到的数据之间存在系统关系,但与缺失数据无关。
  • MNAR意味着一个值的缺失倾向与其值之间存在系统的关系。

鉴于您所说的可能是其MCAR(假设您已经尝试自己找到这种倾向(领域知识)或在缺失的列和其他特征之间建立模型但没有这样做)

其他一些估算数据的技术,我建议查看 KNN 估算(根据经验总是可靠的结果),但您应该尝试不同的方法

精美的估算支持这种估算,使用以下 API:

from fancyimpute import KNN    

# Use 10 nearest rows which have a feature to fill in each row's missing features
X_fill_knn = KNN(k=10).fit_transform(X)

以下是此软件包还支持的不同方法:

•SimpleFill:用每列的平均值或中值替换缺失的条目。

•KNN:最近邻插补,使用两行都有观测数据的特征的均方差对样本进行加权。

•SoftImpute:通过SVD分解的迭代软阈值完成矩阵。受 R 的 softImpute 包的启发,该包基于 Mazumder 等人的用于学习大型不完整矩阵的谱正则化算法。人。

•IterativeSVD:通过迭代低秩 SVD 分解完成矩阵。应该类似于 Troyanskaya 等人的 DNA 微阵列缺失值估计方法中的 SVDimpute。人。

•MICE:通过链式方程重新实现多重插补。

•MatrixFactorization:将不完整矩阵直接分解为低秩U 和V,对U 的元素进行L1 稀疏惩罚,对V 的元素进行L2 惩罚。通过梯度下降求解。

•NuclearNormMinimization:Emmanuel Candes 和Benjamin Recht 使用cvxpy 通过凸优化简单实现精确矩阵完成。对于大型矩阵来说太慢了。

•BiScaler:行/列均值和标准差的迭代估计以获得双重归一化矩阵。不保证收敛,但在实践中效果很好。通过快速交替最小二乘法取自矩阵完成和低秩 SVD。

编辑:MICE 已被弃用,他们将其移至迭代插补下的 sklearn

我在 Kaggle 上看到的一个技巧。

第 1 步:将 NAN 替换为均值或中位数。如果数据服从正态分布,则为均值,否则为中位数。

就我而言,我有年龄的 NAN。

在此处输入图像描述

第 2 步:添加一个新列“NAN_Age”。NAN 为 1,否则为 0。如果 NAN 中有一个模式,你可以帮助算法捕捉它。一个不错的好处是这个策略不关心它是 MAR 还是 MNAR(见上文)。

在此处输入图像描述

对经常建议的均值/中值插补的一个小评论。

应用此方法将假定您的分析仅取决于变量分布的第一时刻。

试想一下,您将用 mean/median 估算变量的所有值平均值/中位数可能会有非常低的偏差。但是方差会(接近)零偏度/峰度也会显着偏差。

解决此问题的一种方法是使用x为每个插补添加一个随机值E(x) = 0E(x^2) > 0

scikit learn 本身有一些很好的现成包用于插补。详情在这里

据我所知,MICE 在 scikit learn 中不可用。请检查 statsmodel 以获取 MICE statsmodels.imputation.mice.MICEDATA