本篇文章3580字,读完约9分钟

机器的心

从towardsdatascience中选择

作者: lianne &; 朱丁

机器的心在编译

参与:魔王,杜伟

要得到好的模型,首先需要清洗数据。 这是如何在python上执行数据清洗的逐步指南。

在拟合机器学习和统计模型之前,必须清洗数据。 用杂乱的数据训练的模型不能输出有意义的结果。

数据清洗:从记录集、表或数据库中检测和修改(或删除)损坏或不正确记录的过程。 识别数据不完整、不准确或不相关的部分,替换、编辑或删除这些脏数据。

“数据清洗”的光定义这么长,执行过程一定很无聊,很花时间。

图来源: KD nuggets// 09/cartoon-machine-learning-class

为了简化数据清洗,介绍了支持python中的数据清洗过程的新的完整的步骤指南。 网民可以学习如何找到和清洗以下数据。

没有数据。

不规则的数据(异常值)

不需要的数据:重复数据( repetitive data )、复制数据( duplicate data )等

不一致数据:大写字母、地址等;

本指南采用的数据集是kaggle竞赛sberbank俄罗斯房地产价值预测竞赛数据(该项目的目标是预测俄罗斯房价波动)。 。 本文并不采用所有的数据,只选择了其中的一部分样本。

本文作者lianne &两位贾斯汀。

在进入数据清洗过程之前,先看看数据的概要。

# importpackagesimportpandasaspdimportnumpyasnpimportseabornassns

importmatplotlib.pyplotaspltimportmatplotlib.mlabasmlabimportmatplotlibplt.style.use ( ' gg plot ' ) frommatplotlib.PP

% matplotlibinlinematplotlib.rcparams [ ' figure.fig size ' ] = ( 12,8 )

PD.options.mode.chained _ assignment = none

# readthedatadf = PD.read _ CSV ( ' SBerbank.CSV ' )

# shapeanddatatypesofthedataprint ( df.shape ) print ( df.dtypes )。

# selectnumericcolumnsdf _ numeric = df.select _ dtypes ( include = [ NP.number ] ) numeric _ cols = df _ numeric.ock

# selectnonnumericcolumnsdf _ non _ numeric = df.select _ dtypes ( exclude = [ NP.number ] ) non _ numeric _ cols = ds

根据以上结果,该数据集有30、471行、292列,可以判别特征是数值变量还是分类变量。 这些都是有效的信息。

然后,可以参照“脏”数据类型核对表,一个一个地进行突破。

开始吧!

没有数据。

解决缺少的数据/缺少的值是数据清洗中最困难和最常见的部分。 许多模型可以与其他数据问题和平共处,但许多模型不能接受缺少的数据问题。

怎样才能找到缺失的数据?

本文介绍了理解数据集中缺少数据的三种方法。。

做法1 :没有数据的热图

特征数少时,可以用热地图可视化缺少的数据。

cols = df.columns [:30 ] # first 30 columns colours = [ ' # 00099 ',' # ffff 00 ' ] # specifythecolours-yelowismising .。

下表列出了前30个特征的缺少数据模式。 横轴表示特征名,纵轴表示注意值/行数,黄色表示缺少数据,蓝色表示没有缺少的数据。

例如,下图中的特征life_sq在多行中有一个缺少值。 特征性的floor只在第7000行左右出现缺失值。

没有数据的热图

方法2 :列出缺少数据的百分比

如果数据集存在很多特性,则可以列出每个特性的缺少数据的百分比。

# ifit ' salargerdatasetandthevisualizationtakestoolongcandothis.# % of missing.forcolindf.columns:PCT _ mising = NP.IS null ( ) PRR

下表列出了每个特征的缺少值的百分比。

具体地说,从下表可知,特征life_sq有21%的缺失数据,特征floor只有1%的缺失数据。 该列表比较有效地总结了各特征的缺失数据的比例,补充了热图的可视化。

前30个特征中缺少数据的百分比列表

方法3 :没有数据直方图

在存在很多特征的情况下,缺少数据直方图也是有效的方法。

为了更深入地理解注意值的缺少值模式,可以将其可视化为直方图。

# firstcreatemissingindicatorforfeatureswithmissingdataforcolindf.columns:missing = df [ col ].is null ( ) num _ mising

if num_missing >; 0:print ( ' createdmissingindicatorfor:{ } '.Format ( COL ) ) DF [ ' { } _ IS Mising '.Format

# then based on the indicator,plotthehistogramofmissingvaluesismissing _ cols = [ colforcolindf.columns if ' is missing ' ion cl ]

df [ ' num _ missing ' ].value _ counts ( ).reset _ index ( ).sort _ values ( by = ' index ' ).plot .32

直方图有助于识别30,471个注意值中缺少值的情况。

例如,从下图可以看到,6000多个注意值中不存在缺少值,接近4000个注意值中存在缺少值。

缺失数据直方图。

如何解决缺失数据?

在这方面没有统一的处理方案。 我们必须研究特定的特征和数据集并据此决定解决缺失数据的最好方法。

下面介绍四种最常见的缺失数据的解决方案。 但是,在情况多而复杂的情况下,需要创造性地采用更多复杂的方法,例如数据建模不足。

处理方法1 :废弃注意值

在统计学中,这种方法称为“删除列”( listwise deletion ),必须放弃整个列(包括缺少值)的注意值。

只有在数据明确缺失,无法提供新闻时,才能执行此操作。 否则,必须考虑其他处理方法。

此外,还有其他标准。

例如,从缺少的数据直方图中可以看到缺少的值的数量超过35。 因此,可以创建删除了缺少值数量超过35的注意值的新数据集df_less_missing_rows。

# droprowswithalotofmissingvalues.ind _ missing = df [ df ] [ ' num _ missing ' ] & gt; 35 ).index df _ less _ missing _ rows = df.drop ( ind _ missing,axis=0)

方案2 :放弃特征

和处理方案1一样,只有在明确某个特征不能提供有用的消息时才废弃。

例如,从缺少数据的百分比列表中可以看到,hospital_beds_raion缺少值的百分比高47%。 这是因为我们放弃了整个这个特性。

# hospital _ beds _ raionhasalotofmissing.# ifwewanttodrop.cols _ to _ drop = [ ' hospital _ beds _ raion ' ] df _ df

方案3 :填写缺少的数据

如果特征是数字变量,则执行缺少的数据填充。 同一特征的其他未缺少数据取平均值或中值,用该值替换缺少的值。

如果特征是分类变量,则用最频值(最频值)填充缺少的值。

以特征life_sq为例,可以将缺失值置换为特征中央值。

# replacemissingvalueswiththemedian.MED = DF

另外,也可以对所有的数值特征一次不重复应用相同的填充策略。

# imputethemissingvaluesandcreatethemissingvalueindicatorvariablesforeachnumericcolumn.df _ numeric = df.select _ dy Pes

forcolinnumeric _ cols:missing = df [ col ].is null ( ) num _ missing = NP.sum ( missing ) ifnum _ missing & gt; 0:# onlydotheimputationforthecolumnsthathavemissingvalues.print ( ' imputingmissingvaluesfor:{ } '.format ( col ) df ) _ is Missing '。

幸运的是,本文采用的数据集的分类特征没有缺少值。 否则,不必对所有分类特征一次重复应用最频填充策略。

# imputethemissingvaluesandcreatethemissingvalueindicatorvariablesforeachnon-numeric column.df _ non _ numeric = df.sless number .。

forcolinnon _ numeric _ cols:Missing = DF [ COL ].IS NULL onlydotheimputationforthecolumnsthathavemissingvalues.print ( ' imputingmissingvaluesfor:{ } '.Format ( col ) DF ) _ is Missing '.Forr

处理方法4 :替换缺少的值

也可以向分类特征添加新的带值类别,如_missing_。 在数值特征中,可以用特定的值(如-999 )替换缺少的值。

这样可以保存缺少的值,提供有价值的消息。

# categorical df [ ' sub _ area ' ] = df [ ' sub _ area ' ].fill na ( ' _ missing _ ' )

# numeric df [ ' life _ sq ' ] = df [ ' life _ sq ' ].fill na (-999 )

不规则数据(异常值)

异常值是指与其他注意值有显着差异的数据,可以是真正的异常值也可以是错误。

怎么找到异常值?

根据特征的属性(数值和分类),用不同的方法研究其分布,检测异常值。

做法1 :直方图/箱形图

特征为数值变量时,使用直方图和箱形图检测异常值。

下图显示了特征life_sq的直方图。

# histogramoflife _ sq.df [ ' life _ sq ' ].hist ( BINS = 100 )

由于数据可能有异常值,因此下图中的数据高度倾斜。

直方图。

为了进一步探讨特征,让我们看看箱形图。

# box plot.df.box plot ( column = [ ' life _ sq ' ] )

从下图可以看到,异常值是大于7000的值。

箱形图

方法二:说明统计学

在数值特征中,异常值太独特时,该值不会显示在箱形图形中。 因此,可以看到其描述统计学。

例如,对于特征life_sq,可以看到最大值为7478,前4位(数据的第75个百分比)为43。 因为这个值7478是异常值。

df['life_sq'].describe ( )

方法3 :条形图

如果特征是分类变量,则可以使用条形图了解类别和分布。

例如,特征ecology具有合理的分布。 但是,如果类“other”只有一个值,则为异常值。

# bar chart-distributionofacategoricalvariabledf [ ' ecology ' ].value _ counts ( ).plot.bar ( )

长条图

其他方法:有很多方法可以找到散点图、z分数、聚类等异常值,但本文很少讨论所有的方法。

如何解决异常值?

异常值的检测不难,但必须选择合适的解决方案。 这很大程度上取决于数据集和项目的目标。

解决异常值的方法与解决缺少值的方法类似。 销毁、编辑还是保存。 (网民可以返回到上一章解决缺少值的部分,并查看相关的处理方案。 )

不需要的数据

解决了缺少的数据和异常值后,现在查看不需要的数据,解决不需要的数据的方法会更直接。

输入到模型中的所有数据都必须为项目的目标服务。 不必要的数据不能增加有价值的数据。

下面介绍三种主要的不必要的数据类型。

不必要的数据类型1 :新闻不足/重复

由于具有相同值的行太多,一个特征可能不会提供新闻。

如何找到重复的数据?

可以创建具有相同值的特征列表。

例如,下图显示了95%的行具有相同值的特性。

num _ rows = len ( df.index ) low _ information _ cols = [ ] #

forcolindf.columns:CNTs = df [ col ].value _ counts ( drop na = false ) top _ PCT

你可以逐一查看这些变量,看看是否提供了有用的消息。 (这里不详述。 )

如何解决重复数据?

你需要知道重复特征背后的理由。 如果他们确实不能提供有用的消息,我们可以扔掉它。

不需要的数据类型2 :无关联

我再次强调数据需要为项目提供有价值的消息。 如果特征与项目试图处理的问题无关,则这些特征不关联数据。

怎么找到不相关的数据?

浏览特征并找到不相关的数据。

例如,记录多伦多气温的特征不能为俄罗斯房价预测项目提供有用的消息。

如何解决不相关的数据?

如果这些特征不能为项目目标服务,请将其删除。

不需要的数据类型3 :复制

请注意,复制数据时,值中存在副本。

复制数据有两种主要类型。

复制数据类型1 :基于所有特征

如何找到基于所有特征的复制数据?

这个副本在注意值内所有特征的值相同的情况下发生,很容易找到。

必须删除数据集内的唯一标识符id,然后删除复制数据以获得数据集df_dedupped。 对于df和df_dedupped这两种数据集的形式,找到要复制的行数。

# we know that column 'id' is unique,but what if we drop it? df_dedupped = df.drop('id ',axis=1).drop_duplicates ( )

选择# therewereduplicaterowsprint ( df.shape ) print ( df _ ded upped.shape )。

发现10行是完全复制的注意值。

如何解决基于所有特征的复制数据?

删除这些复制数据。

数据类型副本2 :基于关键特征

如何找到基于重要特征的复制数据??

在某些情况下,建议删除基于一组唯一标识符的复制数据。

例如,同样的招聘面积、同样的价格、同样的建设年限两次房地产交易,发生的概率接近零。

可以将一组重要特征(如timestamp、full_sq、life_sq、floor、build_year、num_room和price_doc )设置为唯一标识符。 然后根据这些特征来检查是否存在复制数据。

key = ['timestamp ',' full_sq ',' life_sq ',' floor ',' build_year ',' num_room ' ,32

df.fill na (-999 ).group by ( key ) [ ' id ' ].count ( ).sort _ values ( ascending = false ).head

基于这个重要的特征,我们找到了16个复制数据。

您如何解决基于重要特征的复制数据?

删除这些复制数据。

# dropduplicatesbasedonansubsetofvariables。

key = ['timestamp '、' full_sq '、' life_sq

print ( df.shape ) print ( df _ ded upped2. shape )

删除16个复制数据,得到新的数据集df_dedupped2。

不一致数据

在适应模型时,数据集遵循特定的标准也非常重要。 我们需要用不同的方法搜索数据,找到不一致的数据。 这往往取决于注意和经验。 不存在执行和修复不匹配数据的默认代码。

以下四种不一致数据类型进行说明。

不一致数据类型1 :大写

在类别值中混合使用大小写是常见的错误。 python的分解对大小写很敏感,所以可能有点问题。

怎样才能找到大小写不一致的数据?

让我们来看看特征sub_area。

df [ ' sub _ area ' ].value _ counts ( drop na = false )

保存了不同地区的名字,看起来非常标准化。

但是,有时会采用在同一特征内不一致的大小写。 “poselenie sosenskoe”和“poselenie sosenskeo”指的是同一地区。

如何解决大小写不一致的数据?

为了避免此问题,可以将所有字符设置为小写(或大写)。

# makeeverythinglowercase.df [ ' sub _ area _ lower ' ] = df [ ' sub _ area _ lower ' ].STR.lower ( ) DF

不一致数据类型2 :样式

我们实行的另一个标准化是数据风格。 例如,将要素从字符串样式转换为datetime样式。

怎样才能找到模式不一致的数据?

特征timestamp在表示日期时是字符串样式。

df

如何解决风格不一致的数据?

使用以下代码转换样式并提取日期或时间值。 然后我们可以用年和月的方法很容易地分析成交量数据。

df [ ' timestamp _ dt ' ] = PD.to _ datetime ( DF [ ' timestamp ' ],Format = ' % y

PRINT ( DF [ ' year ' ].value _ counts ( DROP NA = False ) ) PRINT ( ) PRINT ( DRP = )。

相关副本: towardsdatascience/how-to-manipulate-date-and-time-in-python-like-a-boss-ddea 677 c6a 4d

不一致数据类型3 :类别值

分类特征的值数量有限。 可能会因拼写错误等出现其他值。

如何找到类别值不匹配的数据?

为了找出类别值不一致的情况,需要注意特征。 例如:

本文采用的房地产数据集没有这样的问题,所以制作了新的数据集。 例如,city的值错误地输入“torontoo”和“tronto”,但两者都显示“toronto”(正确的值)。

识别它们的一种简单方法是模糊逻辑(或距离)。 此方法测量为了使一个值与另一个值匹配而必须更改的字母数量(距离)。

我知道这些类只有四个值:“toronto”、“vancouver”、“montreal”和“calgary”。 如果计算所有值和单词“toronto”(和“vancouver”)之间的距离,您会发现只有几个字符不同,所以伪拼写错误的值和正确的值之间的距离很小。

fromn ltk.metricsimportedit _ distance

df _ city _ ex = PD.Data Frame ( Data = { ' City ':' torontoo ',' Toronto ',' vancouver ' ,32

df _ city _ ex [ ' city _ distance _ Toronto ' ] = df _ city _ ex

如何解决类别值不一致的数据?

您可以设定将这些拼写错误转换为正确值的标准。 例如,以下代码规定所有值和“toronto”之间的距离不超过两个字符。

MSK = df _ city _ ex [ ' city _ distance _ Toronto ' ] & lt; = 2df_city_ex.loc[msk,' city'] = 'toronto '

MSK = df _ city _ ex [ ' city _ distance _ Vancouver ' ] & lt; = 2df_city_ex.loc[msk,' city'] = 'vancouver '

df_city_ex

不一致数据类型4 :地址

住所的特征对很多人来说是老板很难的问题。 因为人们在向数据库输入数据时通常不遵守标准样式。

如何找到地址不一致的数据?

你可以用阅读的方法找到混乱的地址数据。 即使看不到任何问题,也可以运行代码执行标准化。

出于隐私的理由,本文使用的房地产数据集没有地址列。 这是因为创建了具有地址特征的新数据集df_add_ex。

# noaddresscolumninthehousingdataset.socreateonetoshowthecode.df _ add _ ex = PD.data frame ( [ ' 123 mainstapartment 15 ' 123 main stree

你会发现地址的特征非常混乱。

如何解决地址不一致的数据?

执行以下代码,将所有字符转换为小写字母,删除空格,删除句号,并将语言标准化。

DF _ ADD _ STD ' ] = DF _ ADD _ EX [ ' ADRES ' ].STR.Lower ( ) DF _ ADD _ removeleadingandtrailingwhitespace.df _ add _ ex [ ' address _ STD ' ] = df _ add _ ex = df _ add _ ex [ ' address _ STD ' ] ... str.replace ( ' ) ' ST ' ) # replacestreetwithst.df _ add _ ex replaceapartmentwithapt.df _ add _ ex [ ' address _ STD ' ] = df _ add _ ex [ ' address _ STD ' ].str

时讯:数据缺失、混乱、重复如何办?最全数据清洗指南让你所向披靡

df_add_ex

现在看起来很好:

结束了! 我们进行了漫长的数据清洗之旅。

现在可以用这里介绍的方法清洗阻碍模型“污垢”的所有数据。

参考链接: towardsdatascience/data-cleaning-in-Python-the-ultimate-guide-c 63b 88 BF 0a 0d

本文为机器心编译,转载请联系本公众号获得授权。

原标题:“数据丢失、混乱、重复怎么办? 数据清洗指南最能让你折服”

阅读原文。

来源:彭博新闻网

标题:时讯:数据缺失、混乱、重复如何办?最全数据清洗指南让你所向披靡

地址:http://www.pks4.com/ptyxw/17027.html