现实世界的数据通常存在许多缺失值。导致缺失值的原因可能是数据损坏或未能记录数据。在数据集的预处理过程中,处理缺失数据非常重要,因为许多机器学习算法不支持缺失值。
本文介绍了处理数据集中缺失值的七种方法:
- 删除具有缺失值的行
- 为连续变量填补缺失值
- 为分类变量填补缺失值
- 其他插补方法
- 使用支持缺失值的算法
- 预测缺失值
- 使用深度学习库Datawig进行插补
使用的数据来自于 Kaggle 上的Titanic 数据集
(图片由作者提供),缺失值可视化:白色线表示存在缺失值
删除具有缺失值的行:
可以通过删除具有 null 值的行或列来处理缺失值。如果列中超过一半的行为 null,则可以删除整个列。也可以删除其中一个或多个列值为 null 的行。
(图片由作者提供)左侧:带有 Null 值的数据,右侧:删除 Null 值后的数据
优点:
- 使用删除所有缺失值的模型可以创建健壮的模型。
缺点:
- 丢失了大量信息。
- 如果缺失值的百分比与完整数据集相比过高,则效果不佳。
使用平均数/中位数填补缺失值:
可以将具有数值连续值的数据集中的列替换为该列中其余值的平均值、中位数或众数。与前一种方法相比,该方法可以避免数据丢失。用上述两个近似值(平均值、中位数)替换缺失值是一种处理缺失值的统计方法。
(图片由作者提供)左侧:插补之前的 Age 列,右侧:插补后的 Age 列(使用平均值)
在上面的示例中,缺失值被平均值替换,同样可以使用中位数替换。
优点:
- 避免数据丢失,避免删除行或列。
- 在小数据集中效果良好,易于实现。
缺点:
- 仅适用于数值连续变量。
- 可能导致数据泄漏。
- 不考虑特征之间的协方差。
分类列的插补方法:
当缺失值来自分类列(字符串或数字)时,可以使用最常见的类别替换缺失值。如果缺失值的数量非常大,则可以用新类别替换缺失值。
(图片由作者提供)左侧:插补之前的数据,右侧:使用 'U' 插补后的 Cabin 列
优点:
- 避免数据丢失,避免删除行或列。
- 在小数据集中效果良好,易于实现。
- 通过添加一个独特的类别抵消了数据丢失。
缺点:
- 仅适用于分类变量。
- 编码时添加新特征可能会导致性能下降。
其他插补方法:
根据数据的性质或数据类型,可能有一些其他插补方法更适合插补缺失值。
例如,对于具有纵向行为的数据变量,使用最后一个有效观察值来填充缺失值可能是有意义的。这称为 Last observation carried forward (LOCF) 方法。
对于时间序列数据集变量,使用时间戳前后变量的插值填充缺失值可能是有意义的。
使用支持缺失值的算法:
并非所有机器学习算法都支持数据集中的缺失值,但是一些机器学习算法对数据集中的缺失值具有鲁棒性。当数据集包含 null 或缺失值时,k-NN 算法可以在距离度量中忽略某列。朴素贝叶斯在进行预测时也可以支持缺失值。这些算法可以在数据集包含 null 或缺失值时使用。
Python 中的 scikit-learn 实现的朴素贝叶斯和 k-Nearest Neighbors 不支持缺失值。
另一个可以在此处使用的算法是 RandomForest,它适用于非线性和分类数据。它根据数据结构进行自适应,考虑高方差或偏差,对大型数据集产生更好的结果。
优点:
- 无需处理每个列中的缺失值,因为机器学习算法可以有效地处理它们。
缺点:
- scikit-learn 库中没有实现这些机器学习算法。
预测缺失值:
在处理缺失值的早期方法中,我们没有利用包含缺失值的变量与其他变量的相关性优势。可以使用不包含 null 值的其他特征来预测缺失值。
根据具有缺失值的特征的性质(分类或连续),可以使用回归或分类模型来预测缺失值。
Here 'Age' column contains missing values so for prediction of null values the spliting of data will be,y_train: rows from data["Age"] with non null values
y_test: rows from data["Age"] with null values
X_train: Dataset except data["Age"] features with non null values
X_test: Dataset except data["Age"] features with null values
(作者编写的代码)
优点:
- 比之前的方法效果更好
- 考虑了缺失值列与其他列之间的协方差。
缺点:
- 只被认为是真实值的代理
使用深度学习库——Datawig进行插补
该方法在分类、连续和非数值特征上表现非常好。Datawig是一个库,它使用深度神经网络学习ML模型,以填充数据图中的缺失值。
Install datawig library,
pip3 install datawig
Datawig可以接受数据框并为每个包含缺失值的列拟合一个插补模型,所有其他列作为输入。
下面是填充_Age_列中的缺失值的代码
(作者编写的代码)
优点:
- 与其他方法相比非常准确。
- 它支持CPU和GPU。
缺点:
- 在处理大型数据集时可能会很慢。
结论:
每个数据集都有需要智能处理的缺失值,以创建一个健壮的模型。在本文中,我讨论了7种处理缺失值的方法,可以处理每种类型的列中的缺失值。没有处理缺失值的特定方法的规则,最好的表现是得到健壮的模型的方法。可以根据数据的如何以及内容使用不同的方法来处理不同的特征。具有关于数据集的领域知识很重要,可以提供有关如何预处理数据和处理缺失值的见解。
参考资料:
[1] Datawig: https://github.com/awslabs/datawig
译自:https://towardsdatascience.com/7-ways-to-handle-missing-values-in-machine-learning-1a6326adf79e
评论(0)