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

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

相关文章

spring boot中数据验证validated的使用

前言 spring-boot中在Controller层里面可以用@validated来校验数据再进入业务逻辑层,如果数据异常则会统一抛出异常,方便异常中心统一处理。 比如,我们判断一个输入的用户名长度限制以及密码的正则验证. 使用流程 1.Controller层数据使用@validated注解 @PostMapping("/userLogin")@ResponseBodypublic

SpringMVC日期参数转换问题Can not deserialize value of type java.util.Date from String 2018-07-19 15:59:34

问题分析 报错日志 Caused by: com.fasterxml.jackson.databind.exc.InvalidFormatException: Can not deserializevalue of type java.util.Date from Stringto parse Date value '2018-07-19 15:59:34': Can not parse da

Spring集成MyBatis问题: No MyBatis mapper was found in '[xx.xx]' package. Please check your configuration

问题出现情况 在使用SpringBoot集成MyBatis的过程中,项目正常启动异常,控制台打出如下日志: No MyBatis mapper was found in ‘[xx.xxx]’ package. Please check your configuration. Description: A component required a bean of type ‘xx.xxx.

Fragment嵌套Fragment中getChildFragmentManager的问题

前言 项目中在使用Fragment中嵌套Fragment时,你可能会遇到这么一个问题,多次显示隐藏父Fragment之后子Fragment不显示。具体的表现是在父Fragment A中嵌套添加了一个子Fragment B。外部调用父Fragment A第一次显示时,FragmentA、B都正常显示;外部第二次调用父Fragment显示时,Fragment A正常显示,Fragment B显示空白

树莓派4B安装opencv以及错误解决

欢迎访问我的博客:konosuba.xyz 更新于2020/4/27 更新:换了个树莓派4B,安装opencv的时候遇到了一些之前没碰到的问题,在这里记录一下 主要参考opencv官网文档和博客树莓派+Opencv(一)图像处理 树莓派4B上安装参考:树莓派4B 安装opencv完整教程基于python3(各种错误解决) 下载安装依赖项 sudo apt-get install b

什么是缓存穿透,如何解决?

日常开发中,大家经常使用缓存,但是你知道大型的互联网公司面对高并发流量,要注意缓存穿透问题吗!!!    本文会介绍布隆过滤器,空间换时间,以较低的内存空间、高效解决这个问题。 1、性能不够,缓存来凑 现在的年轻人都喜欢网购,没事就逛逛淘宝,剁剁手,买些自己喜欢的东西,释放下工作压力。 地址: https://detail.tmall.com/item.htm?id=62899

poj 3303 Halls dp能过但有问题...待解决

poj3303 Halls 题意 展览会租大厅,一共8间展厅备选,有 R <=12 个需求需要满足,每个需求有k个备选大厅,需要在[a,b]时间区间内有且只有1个展厅全程服务(1<=a<=1000)。 思路 DP!!! 想法: 把每个需求分成两个点,一个为占用大厅(标号为偶数),一个为释放大厅(奇数),对需求的时间排序,时间相同时占用优先于释放,共至多12*2个节点。然后按照这个顺序,

Blender2.8 简易形变-bend弯曲中的问题

在blender2.8中发现一个问题,就是使用简易形变中弯曲的时候不能正常弯曲 以正方体为例, 将正方体向x轴方向伸长,分段,使用bend,绕x轴发现上下面绕x轴弯曲成平面重合(非想象中效果), 绕y轴发现上下面绕y轴弯曲成平面重合(非想象中效果), 绕z轴可以获得一个椭圆柱,x轴上的前后面绕z轴弯曲.   这时候,创建一个空物体轴,原心选取为空物体,绕z轴,可弯曲形变.   而将

跨域数据流动:数据提取过程中的治理与安全双轮驱动

跨域数据流动:数据提取过程中的治理与安全双轮驱动 随着信息技术的飞速发展,跨域数据流动已成为现代社会的常态。从医疗记录到金融交易,从社交媒体到企业运营,数据在各个领域之间频繁交换,为社会发展带来了极大的便利。然而,这种跨域数据流动也带来了治理和安全的双重挑战。本文将从治理和安全两个维度,探讨在数据提取过程中的双轮驱动策略。 一、数据治理:构建有序的跨域数据流动体系 在跨域数据流动的背景下,数

几个人脸库对于面部动作识别的功能比较

经粗略研究,insightface只能识别面部特征点的位置,根据这些位置不能直接推出一个人是否在睡觉。 OpenFace 是一个高级的面部行为分析工具,它能够识别和分析多种面部动作单位(Facial Action Coding System, FACS),这些动作单位是根据面部肌肉活动定义的。每个动作单位(AU)代表了面部表情中的一个具体部分的变化。下面是一些动作单位的含义,以及它们在面部表达中