数据清理的简要介绍

2018年11月07日 由 yuxiangyu 发表 708431 0
数据清理的简要介绍

清理数据应该是数据科学(DS)或者机器学习(ML)工作流程的第一步。如果数据没有清理干净,你将很难在探索中的看到实际重要的部分。一旦你去训练你的ML模型,他们也将更难以训练。也就是说,如果你想充分利用你的数据,它应该是干净的。

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

在本文中,我们将讲解一些常见的数据清理,以及可以用来执行它的pandas代码!

缺失数据


大型数据集几乎不可能毫无瑕疵。也就是说,不是所有的数据点都具有其所有特征变量的值。通常会有一些缺失值,当我们在pandas中使用pd.read_csv()等方式加载数据时,缺失数据往往被标记为NaN或None。有许原因可能导致数据的缺失。比如,收集数据的人忘记了或者他们在数据收集过程进行到一半才开始收集特征变量。

在使用数据集之前,必须处理缺失的数据。例如,假设你正处于数据探索过程的中间,并且你发现关于数据的一些关键信息来自某个特征变量,比如变量“F”。但稍后你会发现数据集中95%的变量F值都是NaN。你不可能从一个仅代表数据集5%的变量中得出关于数据集的任何具体结论!当你开始训练你的ML模型时,NaN也可能被你的程序视为0或者无穷大,这种训练完全没有意义!

在pandas中,有几种方法可以处理中缺失的数据:

  • 检查NAN: pd.isnull(object)检测数据中的缺失值,命令会检测“NaN”和“None”

  • 删除缺失的数据: df.dropna(axis=0, how='any')返回已删除包含NaN的任何数据点的数据帧。

  • 替换缺失的数据:df.replace(to_replace=None, value=None)将“to_replace”中给出的值替换为“value”给出的值。如果你知道你想要使用的特征变量的值,这种操作就很有用。

  • 删除一个特征: 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’]
数据清理的简要介绍

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



错误和重复的数据


错误的数据的意思是不应存在或者完全错误的数据点或值。例如,假设你的一个特征变量称为“性别”,其中大多数值是“男性”或“女性”。但是当你浏览数据集时,你会注意到有几个数据点的“性别”的值为67.3。显然67.3在这个变量的环境中没有任何意义。此外,如果你尝试将“性别”特征变量转换为分类浮点数: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)

数据清理的简要介绍

不相关的特征


并非所有特征的价值都相同。有些特征可能根本不需要!例如,你查看过去一年从亚马逊购买的书籍数据集,其中一个特征变量称为“font-type”,表示书中使用的字体类型。这与预测图书的销售情况是无关的!你可以放心的删除它,如下所示:


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

这样做会减少你查看的内容,从而使你更容易探索数据集。它还有助于更快、更简单的训练你的ML模型,因为你不需要处理那么多数据。如果你不确定变量是否重要,你可以研究完数据集之后再决定。计算特征变量和目标输出之间的相关性矩阵可以帮助确定变量的重要性。

数据清理的简要介绍

当你的特征变量无用时



标准化


每个特征变量中的所有数据都应采用相同的标准化格式。这会让你的数据探索和建模的变得更加容易。例如,让我们仍然以“男性”或“女性”的值来举例说明“性别”变量。如果数据是由人类收集的,那么你可能会得到不同的值:




  • male, female (正常的)

  • MALE, FEMALE (大写的)

  • Male, Female (首字母大写的)

  • Make, Femall (写错的)


如果我们要继续将特征变量转换为分类浮点数,我们比如有很多个值!也就是说,实际上我们会像下面这样做:



{
'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)

欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
写评论取消
回复取消