Python 中的 ML Libs 是否对缺失数据具有鲁棒性?

数据挖掘 机器学习 Python scikit-学习 缺失数据
2022-02-24 12:54:01

因此,我正在寻找如何处理丢失的数据,并从 Machine Learning Mastery 中发现了这篇文章。

本文指出,一些算法可以对缺失数据具有鲁棒性,例如朴素贝叶斯和 KNN。

当缺少数据时,并非所有算法都会失败。
有一些算法可以对丢失的数据变得鲁棒,例如 k-最近邻,当一个值丢失时,它可以从距离度量中忽略一列。朴素贝叶斯还可以在进行预测时支持缺失值。

但随后它说 sklearn 的实现对丢失的数据并不健壮。

遗憾的是,朴素贝叶斯、决策树和 k-最近邻算法的 scikit-learn 实现对缺失值并不稳健。

是否有 ML 库(最好在 Python 中,但也可以在其他语言中)这些算法对缺失数据具有鲁棒性?

4个回答

一般来说, Weka可以处理缺失值,这些缺失值被标记为?.arff格式然而,这并不意味着 Weka 中的每个学习算法都有特定的机制来处理它们,不幸的是,关于这一点的文档有点差。因此,据我所知,必须研究源代码和/或做一些实验才能准确找出特定类对缺失值的作用。

Weka 是用 Java 编写的,但有一个Python包装器。

据我所知,NaN's在 scikit-learn / Python 中支持的唯一算法是HistGradientBoostingClassifier这可以通过设置来使用:

# explicitly require this experimental feature
from sklearn.experimental import enable_hist_gradient_boosting  # noqa
# now you can import normally from ensemble
from sklearn.ensemble import HistGradientBoostingClassifier

但这仍处于实验阶段。

来自 scikit-learn 文档:

此估算器对缺失值 (NaN) 具有原生支持。在训练过程中,树种植者根据潜在增益在每个分割点学习具有缺失值的样本是应该去左孩子还是右孩子。在预测时,具有缺失值的样本因此被分配给左孩子或右孩子。如果在训练期间没有遇到给定特征的缺失值,则将具有缺失值的样本映射到拥有最多样本的子节点。这个实现受到 LightGBM 的启发。

在此处输入图像描述

我想补充一点,除了 ML 库对(可以处理)Nan 值(例如XGBoost、kNN 实现)具有鲁棒性之外,还缺少数据插补技术。一旦你实现了它们,你就可以尝试任何 ML 算法。但是,其中有一些,您必须查看最有效的方法。作为参考,您可以查看hot deck imputation

有几个 scikit learn 的 CatBoost 和 LGBM 实现(不确定这个)对 nan 值是健壮的。我确信 catboost 可以处理 nan 值。