机器学习中数据清洗的艺术

数据清洗是大数据处理的第一步,很多同学对这一步感到没有头绪,不知道哪些该清洗掉,哪些不该,看看这篇文章,是不是能有点启发?

作者:George Seif
编译:ronghuaiyang

导读

数据清洗大数据处理的第一步,很多同学对这一步感到没有头绪,不知道哪些该清洗掉,哪些不该,看看这篇文章,是不是能有点启发?

像奥巴马丢掉麦克风一样丢掉坏数据

清理数据应该是数据科学(DS)或机器学习(ML)工作流的第一步。如果没有清晰的数据,你将很难看到探索中真正重要的部分。一旦你最终开始训练ML模型,那么训练它们就会变得不必要地更具挑战性。主要的一点是,如果你希望最大限度地利用数据,那么它应该是干净的。

在数据科学和机器学习的上下文中,数据清理意味着过滤和修改数据,使其更易于探索、理解和建模。过滤掉你不想要或不需要的部分,这样你就不需要查看或处理它们。修改你确实需要的部分,但它们的格式不是您需要的,以便您可以正确地使用它们。

在这里,我们将了解一些我们通常希望在数据中清理的东西,以及你可以使用的panda代码!

数据缺失

大型数据集很少是完全完整的。这里的完整指的是所有数据点的所有特征变量都有值。通常会丢失一些值,当在panda中加载类似“pd.read_csv()”的值时,这些值被标记为NaN或None。有许多非常实际的原因可以解释为什么这些数据会丢失。收集数据的人可能只是忘记了,或者他们直到数据收集过程的一半才开始收集该特性变量。

在使用数据集之前,需要处理丢失的数据。例如,假设你正在做数据探索,发现关于数据的一些关键信息来自某个特性变量,例如“变量F”。但之后你会发现数据集中95%的变量F值都是NaNs,你不可能从一个仅恰当地表示数据的5%的变量中对数据集作出任何具体的结论!当你开始训练你的ML模型时,你的程序也可能将NaNs视为0或无穷大,从而导致了你的训练出现问题!

在pandas中有一些方法可以处理丢失的数据:

检查NANs: pd.isnull(object) 检测数据中缺失的值,它同时检测“NaN”和“None”

删除丢失的数据: df.dropna(axis=0,how=’any’)返回数据帧,其中删除了包含NaNs的任何数据点。

替换缺少的数据: df.replace(to_replace=None,value=None)如果你知道希望这个特性变量是什么值,那么这是非常有用的。

删除一个特征: df.drop(‘feature_variable_name’,axis=1)如果你发现某个特性变量在数据集中有>90%的NaN,那么从你的数据中删除整个特征是有意义的。

机器学习中数据清洗的艺术

 

丢掉那些不好的特征,比如奥巴马的麦克风

离群值

数据集中的异常值是混合的。一方面,它们可能包含关键信息,因为它们与主要的群体非常不同。另一方面,他们抛弃了我们对主要群体的看法,因为我们必须看得如此之远,只是为了看到离群值!在ML方面,包含异常值的训练可以使你的模型很好地一般化,但也可以将其从你的大多数数据所在的主要群体中剔除。

一般来说,通常建议从两个方面来考虑。研究有或没有异常值的数据。如果你决定你的ML模型需要它们,那么选择一个足够健壮的方法来处理它们。如果你发现这些离群值确实存在,并且对于获取全局信息和数据建模没有帮助,那么最好像上一节所示的那样删除它们。

此外,如果你希望过滤出这些异常值,可以使用以下方法:

# Get the 98th and 2nd percentile as the limits of our outliers
upper_limit = np.percentile(train_df.logerror.values, 98) 
lower_limit = np.percentile(train_df.logerror.values, 2) 
# Filter the outliers from the dataframe
data[‘target’].loc[train_df[‘target’]>upper_limit] = upper_limit data[‘target’].loc[train_df[‘target’]<lower_limit] = lower_limit
机器学习中数据清洗的艺术
机器学习中数据清洗的艺术

 

包含异常值的图(左)和剔除异常值的直方图(右)

坏数据和重复数据

坏数据是指任何不应该存在的数据点或值,或者是完全错误的数据点或值。例如,假设你的一个特征变量名为“gender”,其中大多数值是“male”或“female”。但是,当你浏览数据集时,您会注意到有几个数据点的性别值为67.3 !显然,67.3在这个变量中没有任何意义。此外,如果你尝试将“gender”特征变量转换为分类浮点数:male = 0.0, female = 1.0,那么您将得到一个额外的浮点数:67.3 = 2.0!

重复仅仅是数据集中重复的数据点。如果有太多这样的特征,就会影响ML模型的训练。正如我们前面看到的,重复数据可以简单地从数据中删除。

坏数据可以通过删除或使用一些智能替换来处理。例如,我们可以查看性别为67.3的数据点,发现所有这些数据点的正确值都应该是“女性”。因此,我们只需将所有67.3值转换为“女性”。这样做的好处是,我们有效地为ML训练重新获得了这些数据点,而不是将它们丢弃。你可以使用pandas做这样的转换:

value_map = {'male': 'male', 'female': 'female', '67.3': 'female'}
pd_dataframe['gender'].map(value_map)
机器学习中数据清洗的艺术

小心重复的Loki数据

不相关的特征

并非所有的特征都是相同的。有些东西你可能根本不需要!例如,你可能正在查看过去一年从Amazon购买的图书的数据集,其中一个特性变量称为“font-type”,表示书中使用的字体类型。这和预测一本书的销量是毫无关系的!你可以安全地把这个功能丢弃,就像这样:

df.drop('feature_variable_name', axis=1)

这样做使你的数据探索更容易,因为你不需要查看那么多东西。由于你没有处理那么多的数据,它还有助于使ML模型的训练变得更容易和更快。如果你不确定变量是否重要,那么你可以一直等到开始研究数据集时再决定。计算特征变量与目标输出之间的相关矩阵有助于确定该变量的重要性。

机器学习中数据清洗的艺术

 

当你的特征变量没什么用时…

标准化

每个特征变量中的所有数据都应该采用相同的标准化格式。它将使数据探索和建模的技术方面更加容易。例如,让我们再次以“gender”变量为例,它的值是“male”或“female”。如果数据是由人类收集的,你可能会得到许多你没有预料到的不同的值:

如果我们直接将特征变量转换为分类浮点数,我们会得到比我们想要的0和1更多的值!我们会得到这样的结果:

{
 'male': 0,
 'female': 1,
 'MALE': 2,
 'FEMALE': 3,
 'Male': 4,
 'Female': 5,
 'Make': 6,
 'Femall': 7
}

处理这种情况有两种方法。如果是一些简单的事情,比如把第一个字母大写或者小写,就像这样做:

# Make the whole string lower case
s.lower()
# Make the first letter capitalised
s.capitalize()

如果有拼写错误,你会想要使用我们之前看到的映射函数:

value_map = {'Make': 'male', 'Femall': 'female'}
pd_dataframe['gender'].map(value_map)

英文原文:https://towardsdatascience.com/the-art-of-cleaning-your-data-b713dbd49726

本文为专栏文章,来自:AI公园,内容观点不代表本站立场,如若转载请联系专栏作者,本文链接:https://www.afenxi.com/73725.html 。

(0)
上一篇 2019-08-30 00:19
下一篇 2019-08-30 18:33

相关文章

关注我们
关注我们
分享本页
返回顶部