推荐 :识别并解决数据质量问题的数据科学家指南

2024-04-28 11:48

本文主要是介绍推荐 :识别并解决数据质量问题的数据科学家指南,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

作者:Arunn Thevapalan  翻译:陈超  校对:王紫岳

本文约3000字,建议阅读9分钟
本文介绍了Python中的Ydata-quality库如何应用于数据质量诊断,并给出数据实例进行详细的一步步解释。

在你的下一个项目之前早点这么做将会让你免于几周的辛苦和压力。

b97aa7abf92574cb7ae2a13b7d2e2b85.png

图片由 Mikael Blomkvist拍摄 来自 Pexels


如果你在处理现实数据的AI行业工作,那么你会理解这种痛苦。无论数据收集过程多么精简 ,我们用于建模的数据总是一片狼藉。

就像IBM描述的那样,80/20规则在数据科学领域同样适用。数据科学家80%的宝贵时间都花费在发现、清洗以及组织数据上。仅仅留下了20%的时间用于真正的数据分析。

整理数据并不有趣。对于“垃圾输入进去,垃圾输出出来”这句话,我知道它的重要性,但是我真的不能享受清洗空白格,修正正则表达式,并且解决数据中无法预料的问题的过程。

根据谷歌研究:“每个人都想做建模工作,而不是数据工作”——我对此感到非常愧疚。另外 ,本文介绍了一种叫做数据级联(data cascade)的现象,这种现象是指由底层数据问题引发的不利的后续影响的混合事件。实际上,该问题目前有三个方面 :

  •   绝大多数数据科学技术并不喜欢清理和整理数据;

  •   只有20%的时间是在做有用的分析;

  •   数据质量问题如果不尽早处理,将会产生级联现象并影响后续工作。

只有解决了这些问题才能确保清理数据是容易,快捷,自然的。我们需要工具和技术来帮助我们这些数据科学家快速识别并解决数据质量问题,并以此将我们宝贵的时间投入到分析和AI领域——那些我们真正喜欢的工作当中。

在本文当中,我将呈现一种帮助我们基于预期优先级来提前识别数据质量问题的开源工具(https://github.com/ydataai/ydata-quality)。我很庆幸有这个工具存在,并且我等不及要跟你们分享它。

ydata-quality库拯救数据质量

2e54847c4f96fa56880abd7702795cfd.png

作者截图


Ydata-quality是一个开源的Python库,用于数据管道发展的多个阶段来评估数据质量。该库是直观、易用的,并且你可以直接将其整合进入你的机器学习工作流。

对我个人而言,这个库的好处在于它可以基于数据质量问题(接下来展开)的优先级排序。在我们时间有限时,这是很有帮助的,并且我们也想优先处理对我们数据质量影响较大的问题。

 

让我向你们展示一下如何使用一团乱麻的数据的现实例子。在这个例子当中,我们将会:

  1.   加载一个混乱的数据集;

  2.   分析数据质量问题;

  3.   进一步挖掘警告信息;

  4.   应用策略来减轻这些问题;

  5.   检查在半清洗过后的数据的最终质量分析报告。

在安装任何库之前,最好使用venv或者conda来为项目创建虚拟环境,一旦这一步完成,在你的终端输入下面这行代码来安装库:

pip install ydata-quality

现在你的环境已经准备就绪,让我们转移到数据上吧。

现实生活中混乱的数据

2299cc89bb5cfb0a7415ff4562781386.png

忍受混乱一段时间(图片由Pixabay拍摄来自Pexels)

在这个例子当中我们将会使用变换的人口普查数据,你可以从Github 库(https://github.com/ydataai/ydata-quality/blob/master/datasets/transformed/census_10k.csv)下载。你可以在这个Jupyter Notebook(https://github.com/ydataai/ydata-quality/blob/master/tutorials/main.ipynb)当中找到本教程当中所有的代码。我推荐你复制这个库或者下载这个notebook来跟上这个例子。

第一步:加载数据集

第一步中,我们将会加载数据集以及必要的库。注意,这个库有多个模块(偏差&公正,数据期望,数据关系,漂移分析,错误数据,标签,缺失值)用于单独的数据质量问题,但是我们可以从DataQuality引擎开始,该引擎把所有的个体引擎打包成了一个类。

 
 
from ydata_quality import DataQuality
import pandas as pd
df = pd.read_csv('../datasets/transformed/census_10k.csv')

第二步:分析数据质量问题

这是一个漫长的过程,但是DataQuality引擎在抽取所有细节方面确实做的很好 。只要简单地创建主类并使用evaluate() 方法。

# create the main class that holds all quality modules
dq = DataQuality(df=df)# run the tests
results = dq.evaluate()

我们将收到一个数据质量问题的报告。

Warnings:TOTAL: 5 warning(s)Priority 1: 1 warning(s)Priority 2: 4 warning(s)Priority 1 - heavy impact expected:* [DUPLICATES - DUPLICATE COLUMNS] Found 1 columns with exactly the same feature values as other columns.
Priority 2 - usage allowed, limited human intelligibility:* [DATA RELATIONS - HIGH COLLINEARITY - NUMERICAL] Found 3 numerical variables with high Variance Inflation Factor (VIF>5.0). The variables listed in results are highly collinear with other variables in the dataset. These will make model explainability harder and potentially give way to issues like overfitting. Depending on your end goal you might want to remove the highest VIF variables.* [ERRONEOUS DATA - PREDEFINED ERRONEOUS DATA] Found 1960 ED values in the dataset.* [DATA RELATIONS - HIGH COLLINEARITY - CATEGORICAL] Found 10 categorical variables with significant collinearity (p-value < 0.05). The variables listed in results are highly collinear with other variables in the dataset and sorted descending according to propensity. These will make model explainability harder and potentially give way to issues like overfitting. Depending on your end goal you might want to remove variables following the provided order.* [DUPLICATES - EXACT DUPLICATES] Found 3 instances with exact duplicate feature values.

让我们来仔细分析一下这个报告:

  • 警告(Warning):其中包括数据质量分析过程中检测到的问题细节。

  • 优先级(Priority):对每一个检测到的问题,基于该问题预期的影响来分配一个优先级(越低的值表明越高的优先性)。

  • 模块(Modules):每个检测到的问题与某一个模块(例如:数据关系,重复值,等)执行的数据质量检验相关联。

把所有的东西联系在一起,我们注意到有五个警告被识别出来,其中之一就是高优先级问题。它被“重复值”模块被检测出来,这意味着我们有一整个重复列需要修复。为了更深入地处理该问题,我们使用get_warnings()  方法。

输入下方内容:

dq.get_warnings(test="DuplicateColumns")

我们可以看到针对我们想解决问题的详细输出。

[QualityWarning(category='Duplicates', test='Duplicate Columns', description='Found 1 columns with exactly the same feature values as other columns.', priority=<Priority.P1: 1>, data={'workclass': ['workclass2']})]

根据这一结果,我们可以看到列workclass和workclass2是完全重复的[37] ,这可能会产生严重后果。

第三步:使用特定的模块分析数据质量问题

数据质量的全貌需要多个角度分析,因此我们需要八个不同的模块。虽然它们被封装在DataQuality 类当中,但一些模块并不会运行,除非我们提供特定的参数。

例如,DataQuality类不会执行偏差与公正(Bias & Fairness)质量检验,因为我们并没有指出敏感性特征。但是这个库的妙处在于,我们可以将其作为独立的检验并执行它。

让我们来通过运行偏差与公正检验来更好地理解它。

 
from ydata_quality.bias_fairness import BiasFairness#create the main class that holds all quality modules
bf = BiasFairness(df=df, sensitive_features=['race', 'sex'], label='income')# run the tests
bf_results = bf.evaluate()

当我们运行以上代码的时候,我们将会收到一份针对选定模块的相似的报告。

Warnings:TOTAL: 2 warning(s)Priority 2: 2 warning(s)Priority 2 - usage allowed, limited human intelligibility:* [BIAS&FAIRNESS - PROXY IDENTIFICATION] Found 1 feature pairs of correlation to sensitive attributes with values higher than defined threshold (0.5).* [BIAS&FAIRNESS - SENSITIVE ATTRIBUTE REPRESENTATIVITY] Found 2 values of 'race' sensitive attribute with low representativity in the dataset (below 1.00%).

从该报告中,我们了解到我们可能有一个泄露一种敏感性属性信息的代理特征,并且敏感性属性的特征严重不足。为了调查第一个Warning,我们可以利用筛选特定测试的get_warnings()方法来获得更多详细信息。

bf.get_warnings(test='Proxy Identification')

我们可以看到我们想要解决的问题的详细描述:

 
[QualityWarning(category='Bias&Fairness', test='Proxy Identification', description='Found 1 feature pairs of correlation to sensitive attributes with values higher than defined threshold (0.5).', priority=<Priority.P2: 2>, data=featuresrelationship_sex    0.650656Name: association, dtype: float64)]

基于详细的Warning,我们检查了relationship和sex列,并且注意到一些关系状态(例如,丈夫,妻子)是基于特定性别的,从而影响了相关性。我们可以将这些分类值改成性别中立(例如,已婚)。

第四步:解决识别的问题

让我们实际一点儿。我们永远不会拥有100%清洗过的数据。我们所要做的是在有限的时间内解决对数据影响最大的问题。对数据科学家来说,这是一个需要你根据当前情景的限制做出的决策。

对这个例子来说,让我们聚焦于消灭高优先级(P1)问题并解决至少一个偏差和公正Warning。基于warning的简单的数据清理函数如下:

def improve_quality(df: pd.DataFrame):"""Clean the data based on the Data Quality issues found previously."""# Bias & Fairnessdf = df.replace({'relationship': {'Husband': 'Married', 'Wife': 'Married'}}) # Substitute gender-based 'Husband'/'Wife' for generic 'Married'# Duplicatesdf = df.drop(columns=['workclass2']) # Remove the duplicated columndf = df.drop_duplicates()            # Remove exact feature value duplicatesreturn dfclean_df = improve_quality(df.copy())

我们可以放弃重复列work_class2并且替代 relationship 列的值为更通用且性别中立的。

如果你想进一步地数据清理,请继续你的工作。如果你选择继续,我想看看数据清理是什么样的。记住,你是数据科学家——决策掌握在你的手中。

第五步:运行最后的质量检验

你可能会跳过这一步,但是当我使用额外的最终检验来检查我处理过的数据时,我会感到安心。我非常推荐你也这样做,这样你会知道在完成数据清洗转换之后,你的数据的状态。

你可以先简单地调用质量引擎,然后调用evaluate()方法来再次检索示例报告。下面是清理数据后DataQuality引擎和BiasFairness引擎的报告。

*DataQuality Engine Report:*Warnings:TOTAL: 3 warning(s)Priority 2: 3 warning(s)Priority 2 - usage allowed, limited human intelligibility:* [ERRONEOUS DATA - PREDEFINED ERRONEOUS DATA] Found 1360 ED values in the dataset.* [DATA RELATIONS - HIGH COLLINEARITY - NUMERICAL] Found 3 numerical variables with high Variance Inflation Factor (VIF>5.0). The variables listed in results are highly collinear with other variables in the dataset. These will make model explainability harder and potentially give way to issues like overfitting. Depending on your end goal you might want to remove the highest VIF variables.* [DATA RELATIONS - HIGH COLLINEARITY - CATEGORICAL] Found 9 categorical variables with significant collinearity (p-value < 0.05). The variables listed in results are highly collinear with other variables in the dataset and sorted descending according to propensity. These will make model explainability harder and potentially give way to issues like overfitting. Depending on your end goal you might want to remove variables following the provided order.*Bias & Fairness Report:*Warnings:TOTAL: 1 warning(s)Priority 2: 1 warning(s)Priority 2 - usage allowed, limited human intelligibility:* [BIAS&FAIRNESS - SENSITIVE ATTRIBUTE REPRESENTATIVITY] Found 2 values of 'race' sensitive attribute with low representativity in the dataset (below 1.00%).

我们可以从上面的两个报告当中推断出,我们的高优先级问题已经被解决了,并且另外一个低优先级问题已经如我们所预料地解决了。

结束寄语

83719a6658386d61195835266bd8cf03.png

因为ydata-quality的存在我太轻松了(图片由Cookie_studio制作来自Freepik)

看,虽然我们痛恨清理数据,但是这并不意味着我们不会做这项工作。这就是为什么它是机器学习工作流(https://towardsdatascience.com/the-machine-learning-workflow-explained-557abf882079)当中的一个不可分割的阶段,而它的解决方法就是整合像ydata-quality(https://github.com/ydataai/ydata-quality)这样有价值的工具和库进入到我们的工作流里。

在这篇文章中,我们学到如何使用开源包来评估数据集的数据质量,用 DataQuality 主引擎和特定的模块引擎(例如BiasFairness)。进一步地,我们看到QualityWarning 如何提供高水平的严重性评定并向我们指出产生Warning的原始数据。

在这之后,我们基于数据质量问题定义数据清理管道,同时对混乱的数据进行转换,并观察它如何解决我们的目标Warning的。

YData团队开发了这个库,这个团队的使命就是改善人工智能行业的数据质量。更多问题请加入友好的slack社区并然后直接向开发团队询问所有问题(你也可以在那里找到我!)

我们一起肯定可以改善这个库,你的反馈将意味着这个库解决了你在未来的大部分紧迫问题。我迫不及待地想看到你使用这个ydata-Quality,并得到你在社区内的反馈。

原文标题:

A Data Scientist’s Guide to Identifyand Resolve Data Quality Issues

原文链接:

https://towardsdatascience.com/a-data-scientists-guide-to-identify-and-resolve-data-quality-issues-1fae1fc09c8d?gi=cbccd2061ee2

译者简介:陈超,北京大学应用心理硕士在读。本科曾混迹于计算机专业,后又在心理学的道路上不懈求索。越来越发现数据分析和编程已然成为了两门必修的生存技能,因此在日常生活中尽一切努力更好地去接触和了解相关知识,但前路漫漫,我仍在路上。

转自:数据派THU 公众号;

END


版权声明:本号内容部分来自互联网,转载请注明原文链接和作者,如有侵权或出处有误请和我们联系。


合作请加QQ:365242293  

数据分析(ID : ecshujufenxi )互联网科技与数据圈自己的微信,也是WeMedia自媒体联盟成员之一,WeMedia联盟覆盖5000万人群。

1d842acd408dfbccde1540ec68179b1a.png

这篇关于推荐 :识别并解决数据质量问题的数据科学家指南的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/943190

相关文章

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性

Python正则表达式匹配和替换的操作指南

《Python正则表达式匹配和替换的操作指南》正则表达式是处理文本的强大工具,Python通过re模块提供了完整的正则表达式功能,本文将通过代码示例详细介绍Python中的正则匹配和替换操作,需要的朋... 目录基础语法导入re模块基本元字符常用匹配方法1. re.match() - 从字符串开头匹配2.

C++右移运算符的一个小坑及解决

《C++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

Vue3绑定props默认值问题

《Vue3绑定props默认值问题》使用Vue3的defineProps配合TypeScript的interface定义props类型,并通过withDefaults设置默认值,使组件能安全访问传入的... 目录前言步骤步骤1:使用 defineProps 定义 Props步骤2:设置默认值总结前言使用T

Python实现精确小数计算的完全指南

《Python实现精确小数计算的完全指南》在金融计算、科学实验和工程领域,浮点数精度问题一直是开发者面临的重大挑战,本文将深入解析Python精确小数计算技术体系,感兴趣的小伙伴可以了解一下... 目录引言:小数精度问题的核心挑战一、浮点数精度问题分析1.1 浮点数精度陷阱1.2 浮点数误差来源二、基础解决