乐趣区

关于机器学习:使用-Python-进行数据清洗的完整指南

你肯定据说过这句驰名的数据迷信名言:

在数据迷信我的项目中,80% 的工夫是在做数据处理。

如果你没有听过,那么请记住:数据荡涤是数据迷信工作流程的根底。机器学习模型会依据你提供的数据执行,凌乱的数据会导致性能降落甚至谬误的后果,而洁净的数据是良好模型性能的先决条件。当然洁净的数据并不意味着始终都有好的性能,模型的正确抉择(残余 20%)也很重要,然而没有洁净的数据,即便是再弱小的模型也无奈达到预期的程度。

在本文中将列出数据荡涤中须要解决的问题并展现可能的解决方案,通过本文能够理解如何逐渐进行数据荡涤。

缺失值

当数据集中蕴含缺失数据时,在填充之前能够先进行一些数据的剖析。因为空单元格自身的地位能够通知咱们一些有用的信息。例如:

  • NA 值仅在数据集的尾部或两头呈现。这意味着在数据收集过程中可能存在技术问题。可能须要剖析该特定样本序列的数据收集过程,并尝试找出问题的本源。
  • 如果列 NA 数量超过 70–80%,能够删除该列。
  • 如果 NA 值在表单中作为可选问题的列中,则该列能够被额定的编码为用户答复(1)或未答复(0)。
missingno

这个 python 库就能够用于查看上述情况,并且应用起来十分的简略,例如下图中的白线是 NA:

import missingno as msno
msno.matrix(df)

对于缺失值的填补计算有很多办法,例如:

  • 均匀,中位数,众数
  • kNN
  • 零或常数等

不同的办法相互之间有劣势和有余,并且没有实用于所有状况的“最佳”技术。具体能够参考咱们以前公布的文章

异样值

异样值是绝对于数据集的其余点而言十分大或十分小的值。它们的存在极大地影响了数学模型的性能。让咱们看一下这个简略的示例:

在左图中没有异样值,咱们的线性模型非常适合数据点。在右图中有一个异样值,当模型试图笼罩数据集的所有点时,这个异样值的存在会扭转模型的拟合形式,并且使咱们的模型不适宜至多一半的点。

对于异样值来说咱们有必要介绍一下如何确定异样,这就要从数学角度明确什么是极大或极小。

大于 Q3+1.5 x IQR 或小于 Q1-1.5 x IQR 都能够作为异样值。IQR(四分位距)是 Q3 和 Q1 之间的差 (IQR = Q3-Q1)。

能够应用上面函数来检查数据集中异样值的数量:

def number_of_outliers(df):
    
    df = df.select_dtypes(exclude = 'object')
    
    Q1 = df.quantile(0.25)
    Q3 = df.quantile(0.75)
    IQR = Q3 - Q1
    
    return ((df < (Q1 - 1.5 * IQR)) | (df > (Q3 + 1.5 * IQR))).sum()

解决异样值的一种办法是能够让它们等于 Q3 或 Q1。上面的 lower_upper_range 函数应用 pandas 和 numpy 库查找其内部为异样值的范畴,而后应用

clip

函数将值裁剪到指定的范畴。

def lower_upper_range(datacolumn):
    sorted(datacolumn)
    Q1,Q3 = np.percentile(datacolumn , [25,75])
    IQR = Q3 - Q1
    lower_range = Q1 - (1.5 * IQR)
    upper_range = Q3 + (1.5 * IQR)
    return lower_range,upper_range
  
for col in columns:  
    lowerbound,upperbound = lower_upper_range(df[col])
    df[col]=np.clip(df[col],a_min=lowerbound,a_max=upperbound)

数据不统一

异样值问题是对于数字特色的,当初让咱们看看字符类型(分类)特色。数据不统一意味着列的惟一类具备不同的示意模式。例如在性别栏中,既有 m /f,又有 male/female。在这种状况下,就会有 4 个类,但实际上有两类。

这种问题目前没有主动解决的方法,所以须要手动进行剖析。pandas 的

unique

函数就是为了这个剖析筹备的,上面看一个汽车品牌的例子:

df['CarName'] = df['CarName'].str.split().str[0]
print(df['CarName'].unique())

maxda-mazda, Nissan-nissan, porcshce-porsche, toyouta-toyota 等都能够进行合并。

df.loc[df['CarName'] == 'maxda', 'CarName'] = 'mazda'
df.loc[df['CarName'] == 'Nissan', 'CarName'] = 'nissan'
df.loc[df['CarName'] == 'porcshce', 'CarName'] = 'porsche'
df.loc[df['CarName'] == 'toyouta', 'CarName'] = 'toyota'
df.loc[df['CarName'] == 'vokswagen', 'CarName'] = 'volkswagen'
df.loc[df['CarName'] == 'vw', 'CarName'] = 'volkswagen'

有效数据

有效的数据表示在逻辑上基本不正确的值。例如,

  • 某人的年龄是 560;
  • 某个操作破费了 -8 小时;
  • 一个人的身高是 1200 cm 等;

对于数值列,pandas 的

describe

函数可用于辨认此类谬误:

df.describe()

有效数据的产生起因可能有两种:

1、数据收集谬误:例如在输出时没有进行范畴的判断,在输出身高时谬误的输出了 1799cm 而不是 179cm,然而程序没有对数据的范畴进行判断。

2、数据操作谬误

数据集的某些列可能通过了一些函数的解决。例如,一个函数依据生日计算年龄,然而这个函数呈现了 BUG 导致输入不正确。

以上两种随机谬误都能够被视为空值并与其余 NA 一起估算。

反复数据

当数据集中有雷同的行时就会产生反复数据问题。这可能是因为数据组合谬误(来自多个起源的同一行),或者反复的操作(用户可能会提交他或她的答案两次)等引起的。解决该问题的现实办法是删除复制行。

能够应用 pandas

duplicated

函数查看反复的数据:

df.loc[df.duplicated()]

在辨认出反复的数据后能够应用 pandas 的

drop_duplicate

函数将其删除:

df.drop_duplicates()

数据透露问题

在构建模型之前,数据集被分成训练集和测试集。测试集是看不见的数据用于评估模型性能。如果在数据荡涤或数据预处理步骤中模型以某种形式“看到”了测试集,这个就被称做数据透露(data leakage)。所以应该在荡涤和预处理步骤之前拆分数据:

以抉择缺失值插补为例。数值列中有 NA,采纳均值法估算。在 split 前实现时,应用整个数据集的均值,但如果在 split 后实现,则应用别离训练和测试的均值。

第一种状况的问题是,测试集中的推算值将与训练集相干,因为平均值是整个数据集的。所以当模型用训练集构建时,它也会“看到”测试集。然而咱们拆分的指标是放弃测试集齐全独立,并像应用新数据一样应用它来进行性能评估。所以在操作之前必须拆分数据集。

尽管训练集和测试集别离解决效率不高(因为雷同的操作须要进行 2 次),但它可能是正确的。因为数据泄露问题十分重要,为了解决代码反复编写的问题,能够应用 sklearn 库的 pipeline。简略地说,pipeline 就是将数据作为输出发送到的所有操作步骤的组合,这样咱们只有设定好操作,无论是训练集还是测试集,都能够应用雷同的步骤进行解决,缩小的代码开发的同时还能够缩小出错的概率。

https://www.overfit.cn/post/7728efa2841148bdbb184a6cdd7aaca3

作者:Anar Abiyev

退出移动版