《机器学习高质量数据集建立初学者指南》

《机器学习高质量数据集构建初学者指南》

数据清洗、可视化、增强和合成数据生成的工具和技术

找出数据复杂性的真正来源可能看起来很像玩“数据侦探”,直到找到能揭示真正有用的信息的“黄金钥匙”。由Michael Dziedzic在Unsplash的照片

智能数据超越大数据。这是“数据中心人工智能”范式的前提。

数据科学家不仅仅应该“简单地预处理”数据,还应该建立一种持续而系统的实践,了解和改进他们的数据集。

这将最终使我们的关注点从盲目地通过使用越来越复杂的算法追求更高的分类结果,转向深入理解分类结果形成的原因,问题复杂性的真正来源以及我们如何调整数据以便分类器能更好地学习问题,从而提高性能。

如果你对机器学习还不熟悉,这可能会有些令人望而却步:“构建高质量数据集的最佳实践是什么,如何实施?”

在本教程中,我们将通过一个简单的案例来利用“数据中心人工智能”范式,实现高质量的数据并改善我们的机器学习分类结果。

遵循“数据中心人工智能”的口号——一切以数据为中心——我们从不涉及模型本身(老实说,它只是一个简单的决策树)。

我们将使用在Kaggle免费提供的Pima Indians Diabetes Dataset(许可证:CC0: Public Domain)。你也可以在Data-Centric AI Community GitHub上找到所有的代码和额外材料。

我们开始吧?

步骤1:进行数据分析以了解数据

在我们开始整理数据集之前,我们需要理解我们要解决的问题以及我们正在处理的数据的特点。全面了解数据特征、问题复杂性和使用案例领域是“数据中心人工智能”的首要原则之一。

这将帮助我们确定沿着机器学习流水线的下一步。

当涉及数据分析时,有几个有趣的开源工具可供选择:我自己做了一些评论,包括ydata-profilingdataprepsweetvizautovizlux

我目前主要使用ydata-profiling:我认为这是一种对数据专家来说非常好的工具,它让我们在几行代码中完成数据特征和可视化的工作,而不需要费力地使用pandas。

首先,您需要安装ydata-profiling(最好使用虚拟环境进行安装——如果您不知道如何安装,请查看这个2分钟的视频,或者如果您以前从未在conda环境中工作过,请查看这个完整教程):

然后,我们可以通过保存所有我们需要开始的特征和可视化的.html报告来获得数据的完整概述:

数据报告可以立即告诉我们数据的整体特征,并强调我们需要注意的一些警告:

YData数据分析报告:找到数据集的基本统计、可视化和质量警告。

数据集包含768个观测值和9个变量/特征。其中8个是数值型,1个被标识为分类型(Outcome似乎是我们的目标)。没有重复的行,而且很明显没有缺失值。最后,某些特征之间存在高相关性警告。此外,几个特征具有大量零值

现在是时候充当数据侦探的角色了。在生物特征中,高相关性是相当常见的,但是这些零值呢?

查看一些突出显示的特征(例如,BMI),我们可以看到这些值与整体分布相差很大。并且根据领域知识,这些“0”值实际上是毫无意义的:对于Pregnancies来说,0是可以接受的,但对于BMI、血糖、胰岛素、血压或皮肤厚度来说则是无效的。

YData数据分析报告:BMI特征,显示零值与分布相去甚远。

我们很快意识到这些零值实际上是编码的缺失数据

现在我们将着手解决这个问题,但彻底的EDA过程可能会发现更多。查看这个探索性数据分析的基本指南,看看你还能从你的数据中发现什么。

第二步:调查数据质量问题

现在我们发现一些列存在无效的零值,我们可以开始处理数据集中的缺失数据问题。

许多机器学习模型和scikit-learn估计器不原生支持缺失值,因此我们需要在将数据集提供给估计器之前以某种方式处理这些NaN值。

首先,我们将将这些0值标记为NaN值:

现在,我们可以使用数据插补来用可行的替代值替换NaN观测值。

“没有免费的午餐”定理告诉我们,并没有适用于每种情况的最佳解决方案——我们应该研究不同解决方案如何影响我们训练数据的复杂性,并确定哪种方法可以最好地提升我们的机器学习模型。这实际上是数据中心化人工智能的另一个原则:不断迭代和改进。

现在,我们将使用一个非常简单的方法——SimpleImputer——将零值替换为每个特征的平均值。这是一种非常天真的方法,可能会在我们的分布中产生一些不希望的“尖峰”,但目标只是展示如何突出和插补缺失数据,我们可以在以后尝试更好的方法:

现在,我们可以尝试一个非常简单的决策树分类器,看看我们的分类结果的基线是什么。顺便提一句,决策树可以通过替代分割或其他方法自然地支持缺失值。实际上,在scikit-learn的文档中,似乎决策树在某些条件下的当前版本(1.3.2)中已经内置了对缺失值的支持。然而,由于我使用的是1.2.2版本,所以遇到了这个错误:

不过,即使NaN值在内部处理过了,用缺失数据训练模型并不是一个好的做法,因为它会危及模型从凌乱和有限信息中学到的概念。

这是混淆矩阵:

分类结果并不好。请记住,我们正在使用一个简单的决策树,但是…对于我们的目标类别,预测之间存在显着的差异。 为什么分类器对于类别“0”的表现比类别“1”好呢?

步骤3:增加未被充分代表的类

如果我们在步骤1中留意到了(也许你已经发现了),我们的目标类别Outcome是不均衡的。也许还不足以触发默认设置中的警告(默认阈值是0.5),但足够使分类器在偏袒多数类的同时忽略少数类。从在数据可视化中呈现的分析报告中可以得到清楚的证据:

YData 分析报告:类别“0”和“1”的Outcome并未被等量地表示。分类器自然倾向于对于较为充分表示的类别“0”有所偏好,忽略类别“1”

请注意,尽管缺失数据可能是由于数据收集、传输或存储过程中的一些错误导致的,但类别不平衡可能反映了领域的自然特征:例如,这家医疗中心诊断出糖尿病的患者较少。

尽管如此,依然有必要采取措施处理训练数据,以确保模型不会忽视少数情况:事实上,这正是我们试图更准确地预测的。

假阳性是不好的,因为它会将错误信息传递给一个健康的病人,让她认为自己患有糖尿病。但是当进行其他测试时,这只会是一个“恐慌”。

然而,在这种情况下,假阴性更糟糕。我们会告诉一个患有糖尿病的病人一切都好,她会被漏诊,疾病会进展。

增加这些数字的一种方法是使用数据过采样技术。数据过采样是数据从业人员中广泛采用的一种技术,用于调整数据集中现有类别或类别之间的比例,以缓解数据不平衡的问题。

而这只是合成数据的许多有趣和有用应用之一。

合成数据可能有多种解释,例如“虚假数据”、“假数据”、“模拟数据”,但在这里我们指的是“基于数据驱动的”合成数据生成。

在这个意义上,合成数据是人工生成的,可以保留真实数据的特征——结构、统计属性、依赖关系和相关性。

存在大量的方法和开源工具可用于生成合成数据——像ydata-syntheticsdvgretel-syntheticsnbsyntheticsynthcity这些都是我过去尝试过的一些。

再一次…世上没有“免费的午餐”:选择最适合的方法将始终取决于合成数据的目标。

为了快速了解合成数据如何用于增广,我们将利用ydata-synthetic包,并尝试他们的高斯混合模型

首先,我们需要安装该软件包:

安装完成后,创建合成数据非常简单:

在获得合成数据之后,我们只需要从合成数据中对新生成的少数类样本进行抽样,将其添加到训练数据中,以创建一个均衡(即50%-50%)的分布:

让我们看看这对我们的决策树学习及其后续结果的影响:

混淆矩阵如下所示:

请注意,对训练集进行如此简单的修改导致了F-分数提高了10%以及少数类敏感性结果的显著改善(从53%提高到73%)。

这就是数据中心人工智能范式的美妙之处:在不触及模型参数化的情况下,仅通过简单的启发式方法和标准技术,就明显改善了我们的训练集质量——想象一下如果用更先进的策略和专门的数据准备流程,我们可以做到什么程度!

当然,0类的召回率稍有下降,但最终我们需要这个模型更加敏感而不是特异性(即在检测阳性类别而非阴性类别时更好),这是因为我们面临着特定的约束:疾病诊断——再次强调,数据中心人工智能的另一个原则是:方法和结果需要根据领域的需求和约束进行评估。

总结和进一步研究方向

在本文中,我们通过一个非常实际的用例实验了数据中心人工智能范式。

我们始终从了解我们的数据开始。我们发现、调查和解决了一些特定的数据质量问题,例如缺失数据并通过合成数据改善我们的训练数据以克服领域的不平衡性。 当然,对于这样一个快速简单的案例研究,我们专注于简单的启发式方法来完成工作,但数据科学家的工作永远不会停下来。

如果我们考虑了不同的插补方法,结果会如何改变?我们如何在合成数据生成过程中获得更好的拟合度?我们是否应该平衡两个类别,或者甚至更高地增加少数类的代表性?某些特征转换或降维是否有助于分类结果?我们是否应该删除一些共线特征?

在任何机器学习项目开始时,这些问题都似乎无法回答。但是,当我们开始衡量并揭示每个数据集中复杂性的源头时,我们可以更好地了解哪些方法可以改进分类结果(一种“元学习”方法)。当然,根据数据的特性和项目的最终目标,数据需要经过处理和改进。

制定一个预定义的流程,并将数据准备视为一种“一刀切”的解决方案,就像盲目飞行一样。相反,一位熟练的数据科学家不断扮演数据侦探角色,试图找到最佳的技术,根据数据留下的线索进行捕捉。通常情况下,我们确实可以找到线索。我们只需要保持警觉!

希望您喜欢这篇教程,像往常一样,非常感谢您的反馈、问题和建议。请在评论中告诉我您希望我写的其他主题!

开始学习数据科学?快来参加我们的下一个聚会,日期是11月23日星期四!

如果您尚未加入数据中心人工智能社区,您真的应该加入。我们是一群友好的数据爱好者,对学习数据科学充满热情。我们偶尔还组织一些非常酷的与我一起编程活动,并且我们正在开始一些非常随意的学习小组。

我将在2023年11月23日主持下一个活动,届时我将分享一些探索性数据分析的概念。

你在那里见吧?

关于我

博士,机器学习研究员,教育家,数据倡导者,全能型人才。在VoAGI上,我写关于数据中心人工智能和数据质量的文章,教育数据科学和机器学习社区,如何从不完善的数据迈向智能的数据。

Developer Relations @ YData | Data-Centric AI Community | GitHub | Google Scholar | LinkedIn