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

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

相关文章

MybatisGenerator文件生成不出对应文件的问题

《MybatisGenerator文件生成不出对应文件的问题》本文介绍了使用MybatisGenerator生成文件时遇到的问题及解决方法,主要步骤包括检查目标表是否存在、是否能连接到数据库、配置生成... 目录MyBATisGenerator 文件生成不出对应文件先在项目结构里引入“targetProje

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

Golang的CSP模型简介(最新推荐)

《Golang的CSP模型简介(最新推荐)》Golang采用了CSP(CommunicatingSequentialProcesses,通信顺序进程)并发模型,通过goroutine和channe... 目录前言一、介绍1. 什么是 CSP 模型2. Goroutine3. Channel4. Channe

Python MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat

Linux使用dd命令来复制和转换数据的操作方法

《Linux使用dd命令来复制和转换数据的操作方法》Linux中的dd命令是一个功能强大的数据复制和转换实用程序,它以较低级别运行,通常用于创建可启动的USB驱动器、克隆磁盘和生成随机数据等任务,本文... 目录简介功能和能力语法常用选项示例用法基础用法创建可启动www.chinasem.cn的 USB 驱动

numpy求解线性代数相关问题

《numpy求解线性代数相关问题》本文主要介绍了numpy求解线性代数相关问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 在numpy中有numpy.array类型和numpy.mat类型,前者是数组类型,后者是矩阵类型。数组

Python使用qrcode库实现生成二维码的操作指南

《Python使用qrcode库实现生成二维码的操作指南》二维码是一种广泛使用的二维条码,因其高效的数据存储能力和易于扫描的特点,广泛应用于支付、身份验证、营销推广等领域,Pythonqrcode库是... 目录一、安装 python qrcode 库二、基本使用方法1. 生成简单二维码2. 生成带 Log

解决systemctl reload nginx重启Nginx服务报错:Job for nginx.service invalid问题

《解决systemctlreloadnginx重启Nginx服务报错:Jobfornginx.serviceinvalid问题》文章描述了通过`systemctlstatusnginx.se... 目录systemctl reload nginx重启Nginx服务报错:Job for nginx.javas

Oracle数据库使用 listagg去重删除重复数据的方法汇总

《Oracle数据库使用listagg去重删除重复数据的方法汇总》文章介绍了在Oracle数据库中使用LISTAGG和XMLAGG函数进行字符串聚合并去重的方法,包括去重聚合、使用XML解析和CLO... 目录案例表第一种:使用wm_concat() + distinct去重聚合第二种:使用listagg,