当我们团队的项目在今年的CALL共享任务挑战的文本子任务中首先得分时,我们成功的关键组成部分之一是仔细准备和清理数据。数据清理和准备是任何AI项目中最关键的第一步。正如证据所示,大多数数据科学家将大部分时间(高达70%)用于清理数据

在这篇博文中,我们将引导您完成Python中数据清理和预处理的这些初始步骤,从将最流行的库导入到功能的实际编码开始。

数据清理数据清理是从记录集,表或数据库中检测和纠正(或删除)损坏或不准确的记录的过程,指的是识别数据的不完整,不正确,不准确或不相关的部分,然后替换,修改,或删除脏数据或粗数据。// 维基百科

步骤1.加载数据集

导入库

您需要做的首要事情是导入数据库预处理库。有许多库可用,但用于处理数据的最流行和最重要的Python库是Numpy,Matplotlib和Pandas。Numpy是用于所有数学事物的库。Pandas是可用于导入和管理数据集的最佳工具。Matplotlib(Matplotlib.pyplot)是制作图表的库。

为了便于将来使用,您可以使用快捷方式别名导入这些库:

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

将数据加载到pandas中

下载数据集并将其命名为.csv文件后,需要将其加载到pandas DataFrame中进行探索并执行一些基本的清理任务,删除不需要的信息,这样可以减慢数据处理速度。

通常,此类任务包括:

  • 删除第一行:它包含无关文本而不是列标题。此文本可防止pandas库正确解析数据集:
my_dataset = pd.read_csv('data / my_dataset.csv',skiprows = 1,low_memory = False)
  • 删除包含我们不需要的文本说明的列,url列和其他不必要的列:
my_dataset = my_dataset.drop(['url'],axis = 1)
  • 删除仅包含一个值的所有列,或者具有超过50%的缺失值以更快地工作(如果您的数据集足够大以至于仍然有意义):
my_dataset = my_dataset.dropna(thresh = half_count,axis = 1)

以不同方式命名过滤数据集以使其与原始数据分离也是一种很好的做法。这样可以确保您仍然拥有原始数据,以备需要返回时使用。

步骤2.探索数据集

了解数据

现在您已经设置了数据,但是您仍然应该花一些时间来探索它并了解每个列所代表的功能。对数据集的这种人工审查很重要,以避免数据分析和建模过程中的错误。

为了简化过程,您可以使用数据字典中的列,数据类型,第一行值和描述的名称创建DataFrame。

在探索这些功能时,您可以关注以下任何列:

  • 格式不佳,
  • 需要更多数据或大量预处理才能变成有用的功能,或者
  • 包含冗余信息,

因为如果处理不当,这些事情会损害您的分析。

您还应该注意数据泄漏,这可能导致模型过度拟合。这是因为该模型还将学习在我们使用它进行预测时无法使用的功能。我们需要确保我们的模型仅使用贷款申请时的数据进行培训。

确定目标列

通过探索过滤数据集,您需要创建因变量矩阵和自变量向量。首先,您应根据要回答的问题确定要用作建模目标列的相应列。例如,如果您想预测癌症的发展,或者信用证被批准的机会,您需要找到一个列有疾病状态的列或贷款授予广告使用它作为目标列。

例如,如果目标列是最后一列,则可以通过键入以下内容来创建因变量矩阵:

X = dataset.iloc [:,: -  1] .values

这第一个冒号()意味着我们想在我们的数据集中的所有线路。:-1表示我们想要获取除最后一列之外的所有数据列。在上月底表示,我们希望所有的值。.values

要获得仅包含最后一列数据的自变量向量,可以键入

y = dataset.iloc [:, -  1] .values

步骤3.准备机器学习功能

最后,是时候做准备工作来提供ML算法的功能。要清理数据集,您需要处理缺失值和分类特征,因为大多数机器学习模型的数学假设数据是数字的并且不包含缺失值。此外,如果您尝试使用包含缺失值或非数字值的数据训练线性回归和逻辑回归等模型,则scikit-learn库会返回错误。

处理缺失值

丢失的数据可能是不洁净数据的最常见特征。这些值通常采用NaN或None的形式。

这里有几个缺失值的原因:有时缺少值,因为它们不存在,或者由于数据收集不当或数据输入不当。例如,如果某人未成年,并且该问题适用于18岁以上的人,则该问题将包含缺失值。在这种情况下,填写该问题的值是错误的。

有几种方法可以填充缺失的值:

  • 如果您的数据集足够大并且缺失值的百分比很高(例如,超过50%),则可以删除包含数据的行;
  • 你可以用0填充所有空变量来处理数值;
  • 你可以使用scikit-learn库中的Imputer类用数据填充缺失值(mean,median,most_frequent)
  • 您还可以决定使用同一列中的任何值直接填充缺失值。

这些决策取决于数据类型,您要对数据执行的操作以及缺少值的原因。实际上,仅仅因为某些东西很受欢迎并不一定使它成为正确的选择。最常见的策略是使用平均值,但根据您的数据,您可能会采用完全不同的方法。

处理分类数据

机器学习仅使用数值(float或int数据类型)。但是,数据集通常包含要转换为数字的对象数据类型。在大多数情况下,分类值是离散的,可以编码为虚拟变量,为每个类别分配一个数字。最简单的方法是使用One Hot Encoder,指定要处理的列的索引:

来自sklearn.preprocessing import OneHotEncoder 
onehotencoder = OneHotEncoder(categorical_features = [0])X = onehotencoder.fit_transform(X).toarray()

处理不一致的数据输入

例如,当列中存在不同的唯一值时,就会出现不一致的情况。您可以考虑使用不同的大写方法,简单的错误印记和不一致的格式来形成一个想法。删除数据不一致的方法之一是删除条目名称之前或之后的空格,并将所有情况转换为小写。

但是,如果存在大量不一致的唯一条目,则无法手动检查最接近的匹配项。您可以使用Fuzzy Wuzzy包来识别哪些字符串最可能是相同的。它接受两个字符串并返回一个比率。比率越接近100,你就越有可能统一字符串。

处理日期和时间

特定类型的数据不一致是日期格式不一致,例如相同列中的dd / mm / yy和mm / dd / yy。您的日期值可能不是正确的数据类型,这将不允许您有效地执行操作并从中获取洞察力。这次您可以使用datetime包来修复日期的类型。

缩放和规范化

如果您需要指定一个数量的变化不等于另一个数量的另一个变化,则缩放很重要。借助缩放,您可以确保仅仅因为某些功能很大,它们不会被用作主要预测器。例如,如果你在预测中使用一个人的年龄和工资,一些算法会更加关注薪水,因为它更大,这没有任何意义。

规范化涉及将数据集转换或转换为正态分布。像SVM这样的算法在标准化数据上的收敛速度要快得多,因此将数据标准化以获得更好的结果是有意义的。

有许多方法可以执行特征缩放。简而言之,我们将所有功能放在相同的比例中,以便没有一个功能被另一个功能所支配。例如,您可以使用sklearn.preprocessing包中的StandardScaler类来拟合和转换数据集:

来自sklearn.preprocessing import StandardScaler sc_X = StandardScaler()X_train = sc_X.fit_transform(X_train)
X_test = sc_X.transform(X_test)
由于您不需要将其放入测试集,您只需应用转换即可。sc_y = StandardScaler()
y_train = sc_y.fit_transform(y_train)

保存为CSV

为了确保您仍然拥有原始数据,最好将工作流的每个部分或阶段的最终输出存储在单独的csv文件中。这样,您就可以在数据处理流程中进行更改,而无需重新计算所有内容。

正如我们之前所做的那样,您可以使用pandas to_csv()函数将DataFrame存储为.csv 。

my_dataset.to_csv(“processed_data/cleaned_dataset.csv”,index=False)

结论

这些是处理大型数据集,清理和准备任何Data Science项目数据所需的基本步骤。您可能会发现其他形式的数据清理有用。但是现在我们希望您了解在制定任何模型之前需要妥善安排和整理数据。更好,更清洁的数据优于最佳算法。如果您对最干净的数据使用非常简单的算法,您将获得非常令人印象深刻的结果。而且,执行基本的预处理并不困难!

本文转载自medium,原文地址