在分类问题中处理大量 NA

数据挖掘 分类 数据清理 预处理 缺失数据
2022-02-21 23:57:15

我正在研究一个分类问题。数据集维度为 187,643 x 203。第一列包含没有 NA 的类标签。数据集的其余部分是频率数据,可以是 0 到 1 之间的任何值。这是数据集的快照

|class|groupA|groupB|groupC|
----------------------------
|0    |  NA  | 0.45 |0.001 |
----------------------------
|1    |0.001 |0.0008|0.001 |

数据集包含大量的 NA。列中 NA 的最小和最大数量分别为 24% 和 90%。

为了处理 NA,我正在考虑为 NA 计数定义一个截止值(比如说 30%),删除 NA 计数大于 cut-0ff 值的列,并用特定类别的平均值替换每个剩余列中的 NA。但是,这样做会丢失一些基于数据探索性分析的分类工作似乎非常重要的特征。例如,有一个变量有 64% 的缺失值,但它可以对样本进行分类,其AUC [95% CI]: 73.23 [72.86 - 73.61]我确实想保留这种变量。

另一方面,保留缺失值将需要使用可以处理它们的算法,例如 k-NN 和朴素贝叶斯以及随机森林。但似乎这些算法的 sklearn 实现不支持缺失值的存在。

2021 年 8 月 25 日更新:我知道有一些建议可以避免对大多数 ML 任务的数字特征进行离散化,但在这种情况下,如果我将特征转换为分类变量,然后为 NAs 案例分配一个组名,我将能够保留该功能。你觉得这听起来如何?

我对这个领域有点陌生,并试图找出处理数据集中 NA 的最佳方法。

如果您对此有任何想法,我将不胜感激。

2个回答

关于处理 NA 值没有完美的答案:

  • 有时完全删除具有高比例 NA 的特征(从所有实例中)是有意义的。但是在您的情况下,只有 3 个功能,因此这会导致大量信息丢失。
  • 用特征的平均值估算缺失值确实是另一种选择,但这种人工数据可能会在模型中引入偏差,尤其是当它占数据的比例很高时。
  • 还有另一种选择:删除包含至少一个 NA 值的实例。由于您有大量数据,因此可以在您的情况下考虑这一点。但请注意,这也会引入偏差,特别是如果 NA 值的分布不是随机的。
  • 一个经常与分类特征一起使用的选项是分配一个特殊的值NA对于数值变量,类似的方法是添加一个二进制特征,指示实例是否有缺失值(可能每个数值特征都有一个二进制特征)。这可能适用于某些学习算法,但不适用于其他算法。

有一些 ML 库可以处理缺失值,我知道Weka可以。

对于任何类型的预处理/特征选择过程,领域知识是人们可以拥有的主要和最重要的工具。因此,即使您的模型或您对数据所做的测试表明您应该删除某些数据,您仍然应该保留它。话虽如此,在您的情况下,您以相同的顺序尝试以下一些事情:-

1.) 如果某个特征具有大量NaN值(例如,某列中 90% 的值丢失),明智的做法是删除该特征,因为估算该列中的值没有意义。

2.)如果一列的NaN值百分比很高,但不是 90%(比如在您的情况下,一个特征有 65%NaN的值),而不是用meanor估算median,您可以为该特征引入一个新列,该列提供以下信息天气该列是否包含NaN值,即二进制值列。这种技术的一个优点是,如果您的特征数量极少,它将增加数据集的信息/数据。但此方法仅适用于某些算法,因为并非所有算法都可以处理缺失值。(据我所知,只有梯度提升算法可以处理缺失值)

3.) 这是最简单的出路!只需使用数字特征和分类特征来估算NaN值。(记住在之间的差异较小时使用,在差异较大时使用)。meanmedianmodemeanmeanmedianmedian