文章目录
数据清理是机器学习的重要组成部分之一。它在构建模型中起着重要作用。在本文中,我们将了解数据清理、其重要性以及 Python 实现。
公众号:快乐数模
小红书:学数模使我快乐
一、什么是数据清理
数据清理是机器学习 (ML)流程中的关键步骤,因为它涉及识别和删除任何缺失、重复或不相关的数据。数据清理的目标是确保数据准确、一致且无错误,因为不正确或不一致的数据会对 ML 模型的性能产生负面影响。专业数据科学家通常会将大量时间投入到这一步骤中,因为他们相信“更好的数据胜过更复杂的算法”。
数据清理,也称为数据清洗或数据预处理,是数据科学流程中的关键步骤,涉及识别和纠正或消除数据中的错误、不一致和不准确性,以提高其质量和可用性。数据清理至关重要,因为原始数据通常嘈杂、不完整且不一致,这会对从中得出的见解的准确性和可靠性产生负面影响。
二、为什么数据清理很重要
数据清理是数据准备过程中的关键步骤,对于确保数据集的准确性、可靠性和整体质量起着重要作用。
对于决策而言,所得出结论的完整性在很大程度上取决于基础数据的清洁度。如果没有适当的数据清理,不准确、异常值、缺失值和不一致可能会损害分析结果的有效性。此外,干净的数据有助于更有效地进行建模和模式识别,因为当输入高质量、无错误的输入时,算法的性能最佳。
此外,干净的数据集增强了研究结果的可解释性,有助于形成可操作的见解。
- 据科学中的数据清理
数据清理是数据科学不可或缺的一部分,在确保数据集的准确性和可靠性方面发挥着根本性作用。在数据科学领域,洞察力和预测来自庞大而复杂的数据集,输入数据的质量显著影响分析结果的有效性。数据清理涉及系统地识别和纠正数据集中的错误、不一致和不准确性,包括处理缺失值、删除重复项和处理异常值等任务。这一细致的过程对于增强分析的完整性、促进更准确的建模以及最终促进基于可信和高质量数据的明智决策至关重要。
三、执行数据清洁的步骤
执行数据清理涉及一个系统的过程,以识别和纠正数据集中的错误、不一致和不准确性。下面是执行数据清理的基本步骤。
- 移除不需要的观察值
- 处理缺失数据
- 管理不需要的异常值
- 修正结构性错误
删除不需要的观测值: 从数据集中识别并消除不相关或多余的观测值。此步骤涉及仔细检查数据条目,查找重复记录、不相关信息或对分析没有意义的数据点。删除不需要的观测值可简化数据集,减少噪音并提高整体质量。
修复结构错误: 解决数据集中的结构问题,例如 数据格式 、 命名约定 或 变量类型 的不一致。标准化格式、纠正命名差异并确保数据表示的一致性。修复结构错误可增强数据一致性并促进准确的分析和解释。
管理不需要的异常值: 识别和管理异常值,即明显偏离常态的数据点。根据具体情况,决定是否删除异常值或对其进行转换以尽量减少其对分析的影响。管理异常值对于从数据中获得更准确、更可靠的见解至关重要。
处理缺失数据: 制定有效处理缺失数据的策略。这可能涉及基于统计方法估算缺失值、删除有缺失值的记录或采用高级估算技术。处理缺失数据可确保数据集更完整,防止出现偏差并保持分析的完整性。
四、如何执行数据清理
执行数据清理涉及一种系统方法来提高数据集的质量和可靠性。该过程首先要彻底了解数据,检查其结构并识别缺失值、重复值和异常值等问题。解决缺失数据涉及对归纳或删除的战略决策,同时系统地消除重复值以减少冗余。管理异常值可确保极端值不会过度影响分析。纠正结构错误以标准化格式和变量类型,从而提高一致性。
在整个过程中,记录变更对于透明度和可重复性至关重要。迭代验证和测试可确认数据清理步骤的有效性,最终生成可供进行有意义的分析和洞察的精炼数据集。
五、数据清理的Python库实现
了解使用 Titanic 数据集进行数据库清理的每个步骤。以下是必要的步骤:
- 导入必要的库
- 加载数据集
- 使用 df.info() 检查数据信息
import pandas as pd
import numpy as np
# Load the dataset
df = pd.read_csv('titanic.csv')
df.head()
5.1 数据检查与探索
首先通过检查数据结构并识别缺失值、异常值和不一致性来了解数据,并使用以下 Python 代码检查重复的行:
df.duplicated()
5.2 使用df.info()检查数据信息
df.info()
从上面的数据信息中,我们可以看到 Age 和 Cabin 的计数数量不一致。并且一些列是分类的,具有数据类型对象,一些是整数和浮点值。
5.3 检查分类和数字列
# Categorical columns
cat_col = [col for col in df.columns if df[col].dtype == 'object']
print('Categorical columns :',cat_col)
# Numerical columns
num_col = [col for col in df.columns if df[col].dtype != 'object']
print('Numerical columns :',num_col)
5.4 检查分类列中唯一值的总数
df[cat_col].nunique()
5.5 执行数据清理的步骤
5.5.1 删除所有上述不需要的观察结果
这包括从数据集中删除重复/冗余或不相关的值。重复观察最常出现在数据收集过程中,而不相关的观察是那些实际上不适合您尝试解决的特定问题的观察。
- 冗余观测会在很大程度上改变效率,因为数据重复可能会向正确的一侧增加,也可能向错误的一侧增加,从而产生不准确的结果。
- 不相关的观察结果是任何类型的对我们没有用并且可以直接删除的数据。
5.5.2 根据分析的主题决定哪个因素对讨论重要
机器不理解文本数据。因此,我们必须删除分类列值或将其转换为数字类型。这里我们删除了名称列,因为名称始终是唯一的,并且对目标变量没有太大影响。对于票证,首先打印 50 张唯一的票证。
df['Ticket'].unique()[:50]
从上面的票证中,我们可以观察到它由两个值组成,例如第一个值“A/5 21171”是“A/5”和“21171”的联合值,这可能会影响我们的目标变量。这将是特征工程的情况。我们从一列或一组列中得出新特征。在当前情况下,我们删除了“名称”和“票证”列。
5.5.3 删除姓名和工单列
df1 = df.drop(columns=['Name','Ticket'])
df1.shape
5.5.4 处理缺失数据
数据缺失是现实数据集中常见的问题,可能由于人为错误、系统故障或数据收集问题等各种原因而发生。可以使用各种技术来处理缺失数据,例如归纳、删除或替换。
可使用 df.isnull() 检查每行逐列的缺失值百分比,检查值是否为空并返回布尔值。.sum() 将对空值行的总数求和,然后将其除以数据集中存在的总行数,然后我们将其相乘以获得百分比值,即每 100 个值中有多少值为空。
round((df1.isnull().sum()/df1.shape[0])*100,2)
我们不能忽略或删除缺失的观察结果。必须小心处理它们,因为它们可能预示着一些重要的事情。
处理缺失数据的两种最常见方法是:
- 删除有缺失值的观察值。
价值缺失这一事实本身可能就很有意义。
另外,在现实世界中,即使缺少某些特征,您也经常需要对新数据进行预测!
从上面的结果我们可以看出,Cabin 有 77% 的空值,Age 有 19.87%,Embarked 有 0.22% 的空值。
因此,填充 77% 的空值并不是一个好主意。我们将删除 Cabin 列。Embarked 列只有 0.22% 的空值,因此,我们删除 Embarked 列的空值行。
df2 = df1.drop(columns='Cabin')
df2.dropna(subset=['Embarked'], axis=0, inplace=True)
df2.shape
- 根据过去的观察结果填补缺失值。
再次强调,“缺失”本身几乎总是具有信息性的,如果某个值缺失,你应该告诉你的算法。
即使你建立了一个模型来推断你的值,你也没有添加任何真实信息。你只是在强化其他特征已经提供的模式。
对于这种情况,我们可以使用均值插补或中位数插补。
** 笔记** :
- 当数据呈正态分布且没有极端异常值时,均值插补是合适的。
- 当数据包含极端异常值或有偏差时,中位数插补是更好的选择。
# 均值填充
df3 = df2.fillna(df2.Age.mean())
# 再次检查空值
df3.isnull().sum()
5.5.5 处理异常值
离群值是与大多数数据有显著偏差的极端值。它们会对分析和模型性能产生负面影响。可以使用聚类、插值或变换等技术来处理离群值。
为了检查异常值,我们通常使用箱线图。箱线图,也称为箱须图,是数据集分布的图形表示。它显示变量的中位数、四分位数和潜在异常值。箱内的线表示中位数,而箱本身表示四分位距 (IQR)。须延伸到 IQR 1.5 倍以内的最极端非异常值。须以外的单个点被视为潜在异常值。箱线图提供了数据范围的易于理解的概览,并可以识别分布中的异常值或偏度。
import matplotlib.pyplot as plt
plt.boxplot(df3['Age'], vert=False)
plt.ylabel('Variable')
plt.xlabel('Age')
plt.title('Box Plot')
plt.show()
从上面的箱线图中我们可以看出,我们的年龄数据集有异常值。小于 5 和大于 55 的值都是异常值。
# calculate summary statistics
mean = df3['Age'].mean()
std = df3['Age'].std()
# Calculate the lower and upper bounds
lower_bound = mean - std*2
upper_bound = mean + std*2
print('Lower Bound :',lower_bound)
print('Upper Bound :',upper_bound)
# Drop the outliers
df4 = df3[(df3['Age'] >= lower_bound)
& (df3['Age'] <= upper_bound)]
类似地,我们可以删除剩余列的异常值。
5.5.6 数据转换
数据转换涉及将数据从一种形式转换为另一种形式,以使其更适合分析。可以使用规范化、缩放或编码等技术来转换数据。
数据验证和确认
数据验证和确认包括通过将数据与外部来源或专家知识进行比较来确保数据的准确性和一致性。
对于机器学习预测,首先,我们分离独立特征和目标特征。在这里,我们仅将“性别”、“年龄”、“兄弟姐妹”、“出发”、“票价”、“登船”视为独立特征,并将“幸存”视为目标变量。因为 PassengerId 不会影响存活率。
X = df3[['Pclass','Sex','Age', 'SibSp','Parch','Fare','Embarked']]
Y = df3['Survived']
数据格式化
数据格式化涉及将数据转换为标准格式或结构,以便用于分析的算法或模型可以轻松处理。在这里我们将讨论常用的数据格式化技术,即缩放和规范化。
-
扩展
-
缩放涉及将特征值转换为特定范围。它在改变比例的同时保持原始分布的形状。
-
当特征具有不同的尺度,并且某些算法对特征的幅度敏感时特别有用。
-
常见的缩放方法包括最小-最大缩放和标准化(Z 分数缩放)。
最小-最大缩放
最小-最大缩放将值重新缩放到指定范围,通常在 0 到 1 之间。它保留原始分布并确保最小值映射到 0,最大值映射到 1。
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler(feature_range=(0, 1))
num_col_ = [col for col in X.columns if X[col].dtype != 'object']
x1 = X
x1[num_col_] = scaler.fit_transform(x1[num_col_])
x1.head()
标准化(Z 分数缩放):标准化将值转换为平均值为 0 且标准差为 1。它以平均值为中心,并根据标准差对其进行缩放。标准化使数据更适合假设高斯分布或要求特征具有零平均值和单位方差的算法。
Z = (X - μ) / σ
- X = 数据
- μ = X 的平均值
- σ = X 的标准差
六、机器学习数据清理优缺点
6.1 优点
- 提高模型性能 :删除错误、不一致和不相关的数据,有助于模型更好地从数据中学习。
- 提高准确性 :有助于确保数据准确、一致且无错误。
- 更好地表示数据 :数据清理允许将数据转换为更好地表示数据中底层关系和模式的格式。
- 提高数据质量 :提高数据质量,使其更加可靠和准确。
- 提高数据安全性 :帮助识别和删除可能危及数据安全的敏感或机密信息。
6.2 缺点
- 耗时 :耗时的任务,尤其是对于大型和复杂的数据集。
- 容易出错 :数据清理容易出错,因为它涉及转换和清理数据,这可能导致重要信息的丢失或引入新的错误。
- 成本和资源密集 :资源密集型流程需要大量时间、精力和专业知识。它还可能需要使用专门的软件工具,这会增加数据清理的成本和复杂性。
- 过度拟合 :数据清理可能会无意中删除过多数据,从而导致过度拟合。
七、结论
本文讨论了数据清理的四个不同步骤,使数据更可靠并产生良好结果。正确完成数据清理步骤后,我们将拥有一个强大的数据集,可以避免许多常见的陷阱。总体上,数据清理是数据科学流程中的关键步骤,涉及识别和纠正数据中的错误、不一致和不准确性,以提高其质量和可用性。