机器学习流程—数据预处理 清洗
文章目录
在机器学习流程中进行数据预处理以确保数据质量,并为后续建模打下基础
机器学习流程—数据预处理 清洗
数据处理旨在将原始数据重新组织为更适合分析和利用的形式。
借助机器学习算法、数学建模以及统计知识的应用,这一完整流程能够实现自动化运行。
其输出形式取决于具体任务需求以及相关机器的配置设置。
进行数据清洗的过程旨在识别并去除缺失值、重复记录以及与研究无关的数据。其主要目标是保证数据的准确性、一致性以及完整性。这些处理步骤能够有效消除可能影响分析结果的质量问题。由于不同质量水平的数据可能导致分析结果出现偏差甚至失败,在这一阶段投入较高的工作强度是非常值得的。
让我们再详细回顾一下整个机器学习的流程,在当前分析中得出了总共六个关键步骤。
’

我们完整的一个机器学习的步骤包括下面的环节
- 明确问题:确定您想要解决的具体问题并判断是否可以通过机器学习的方法来实现这一目标。
- 获取数据:从各个来源获取并清洗好用于训练模型的数据集。这些高质量的数据是确保模型性能的关键因素。
- 深入分析数据:运用数据分析工具和技术对数据进行可视化处理以及统计分析工作,以揭示数据中潜在的规律性与关联性。
- 规范化与预处理数据:根据具体需求对手动化处理原始数据的过程包括标准化转换以及必要的清理工作为特征工程阶段
- 划分训练集与测试集:将收集到的数据按照一定比例划分成训练集与测试集两部分以便于后续的模型验证工作
- 选择适合的算法模型:根据实际问题特点以及手头掌握的数据信息挑选出最适合当前应用场景下的机器学习算法模型
- 训练模型并优化参数:通过迭代优化的方式对选定的机器学习模型进行训练工作并在验证过程中不断调整其内部参数以提高预测准确性
- 评估模型性能并计算准确率指标值:利用独立于训练集的新测试样本来评估最终生成的机器学习模型的表现效果并量化其预测能力
- 根据评估结果进一步调优模型参数值: 在每一次评估之后根据获得的数据反馈结果持续改进调优相关参数直至满足既定的应用要求标准
- 将优化后的机器学习应用到实际系统或应用中: 将最终得到经过反复验证优化后的机器学习算法集成到目标应用场景之中实现预期功能
- 监控系统运行状态并定期评估性能表现: 在上线后持续监控整个系统的运行状态定期进行性能评估确保系统能够持续提供稳定可靠的服务能力
这些工作流程主要是在工程实践中总结出的一些经验和体会。不是每个项目的实施过程都能形成完整的标准化工作流程。这里的内容仅作为参考建议,并不具备全面性。唯有通过不断的实践探索和积累丰富的项目经验才能逐步形成自己的专业能力与技术储备。
定义问题
为了解释起见,在讨论数据预处理时,请注意以下几点:第一,在这一部分中我们将详细阐述相关的操作步骤;第二,在深入探讨后续的处理流程之前,请先明确要解决的问题是什么?即为定义问题的目标。
该itamic数据集常被用作kaggle比赛中的基准数据集,在本次分析中我们采用的数据同样来自这一著名的数据源。该itamic dataset详细记录了泰坦尼克号邮轮上所有乘客的基本信息与行为特征,并基于这些信息建立预测模型以判断每位乘客在灾难发生时的生存可能性。
数据预处理
在了解了数据预处理的重要性之后,在完成数据收集的基础上开始这一过程会更加顺利。在这一阶段的操作顺序并不十分关键,在大多数情况下都可以按照任意顺序执行各项操作。为了确保后续分析的有效性与可靠性,在这一阶段我们需要特别关注以下几个方面:首先应当保证原始数据集是完整且完整的;其次所有的记录都应当包含完整的字段信息;第三所有字段都应该具有合理的值域范围;最后所有的字段都应该与当前业务运营的相关流程紧密契合。
我们数据处理的步骤差不多就这几个

数据加载与展示
import pandas as pd
import numpy as np
# Load the dataset
path ='D:\ 代码\ ml-base\jupyter\ ML\ dataset\ '
df = pd.read_csv(path+'titanic.csv')
df.head()
AI助手
数据大致如下

- 乘客标识符(PassengerId)
- 个人姓名(Name)
- 船票信息具有唯一性
- 获救情况变量作为因变量使用;其取值仅限于1和0两个类别。(Survived)
- 乘客等级指标(Pclass)
- 个人性别(Sex)
- 显而易见的是一个分类型数据特征。(Embarked)
- 年龄数值具有连续性。(Age)
- 表兄弟姐妹数量以及父母与子女数量都是离散的计数数据特征。(SibSp 和 Parch)
- 票价数值是一个带有明确价格范围的数值型特征。(Fare)
- 客舱信息是一个分类型数据特征。(Cabin)
重复数据处理
处理重复数据的方法其实非常简便。具体操作就是直接删除即可。然而需要注意的是由于重复的数据没有任何价值因此我们无需过分纠结于如何去除它们。同时我们还应该探究一下数据为什么会重复并尝试从根源上加以避免。
df.duplicated().value_counts()
AI助手
通过计算我们获得了所有统计值均为False的状态这表明数据集中不存在任何重复元素如果在任何位置出现True结果则表示存在对应元素的重复情况。

value_counts() 实际上是用于计算各类别数量。这相当于执行GROUP BY操作。当存在重复记录时,可以通过以下操作去除冗余数据。
df.drop_duplicates()
AI助手
数据类型
由于我们难以直接从上一步骤的结果中提取数据类型信息,并且有时数值型数据可能会因特定原因而在pandas环境中被视为字符串类型
df.dtypes
AI助手
我们可以通过dtypes 查看每一列的数据类型

如果数据没有问题,在后续的数据分析阶段中明确区分数字字段和文本字段能够帮助我们更好地进行后续分析工作。因为当我们处理数字字段时会关注是否存在异常值时点时;而分析文本字段则会关注其分类分布情况时点时。
# 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)
AI助手

在我们的分析过程中,在观察数据特征时我们发现了一个值得注意的问题:即PassengerId属于数值类型。然而该字段在我们的分析中并没有提供实质性的价值。
空值处理
在处理之前, 我们需要了解各字段缺失值的分布情况. 为此, 可以通过调用df.isnull()方法来获取数据.

然后我们可以通过上述数据计算出结果的具体数值。具体操作中我们需要调用Python中的.sum()函数来计算结果总和。将False视为0来计算总和将True视为1来计算总和这样我们就可以得出空值的数量
df.isnull().sum()
AI助手
其实这里我们可以看到Age,Cabin 都存在大量的空值

实际上,在使用pandas库时,我们还可以通过函数名与操作相结合的方式来实现数据统计功能。具体来说,在已经调用了pandas库的情况下,默认情况下我们可以直接对数据框对象进行计数操作以获取非空值数量信息;需要注意的是,这个方法返回的是非空单元格的数量

注意到Age和Cabin这两个字段的非空数据量较少。观察到这些字段存在缺失值后发现单凭数量难以直观反映问题这时我们可以转而计算它们在总数据中的占比
round((df1.isnull().sum()/df1.shape[0])*100,2)
AI助手
Cabin 的空值占比达到了77%

基于已知的空值分布情况, 下面我们将着手解决缺失数据的问题。随后我们需要处理这些缺失值, 其中船舱Cabin这一列由于缺失量过大, 因此我们可以选择删除这一列。而Embarked字段仅有两项数据缺失, 占总样本的比例微乎其微, 只占0.22%, 因此我们决定去除这些数据。
在我们的数据集中,“Age” 存在一定比例的缺失值;同时,“预测结果与我们的目标变量之间具有较强的关联性”,这是因为 adults 的生存能力比 children 和 elderly 更高,“因此存活的机会更大一些”。
删除Cabin 列
df2 = df1.drop(columns='Cabin')
AI助手
删除空值所在的行
df2.dropna(subset=['Embarked'], axis=0, inplace=True)
AI助手
如果我们要是对只要有空值的列就进行删除,不加相关的参数即可
df2.dropna()
AI助手
接下来我们补全Age 列,这里我们使用均值进行填充
# Mean imputation
df3 = df2.fillna(df2.Age.mean())
# 再次检查
df3.isnull().sum()
AI助手
我们可以看到空值已经没了

无关特征删除
事实上,在之前的步骤中已剔除了一个特征。即为该列为:Cabin列。而从字段的定义来看,在我们的分析中发现\texttt{Name}和\texttt{Ticket}这两个字段对结果的影响并不显著。
df4 = df3.drop(columns=['Name','Ticket','PassengerId'])
AI助手
数据分布
为了预测乘客能否存活, 我们需要关注现有样本的分布情况. 因为若我们的预测模型存在严重的数据不平衡, 比如某一类别样本数量过少, 就会影响模型的效果. 此时我们需要重新审视问题定义或考虑重新收集样本.
这里重点分析一下Survived的数据分布情况。由于value_counts()在上文中已经详细说明过,请直接获取结果。
df['Survived'].value_counts()
AI助手
我们看到1 也就是获救的人数是342 ,未获救的是549

建议我们可以绘制饼图进行直观查看;特别是当类别数量较多时,则是因为这里仅分为两类。
#导入数据可视化所需要的库
import matplotlib.pyplot as plt # Matplotlib – Python画图工具库
plt.pie(x=df['Survived'].value_counts(),labels=Survived.index,autopct='%.2f%%')
AI助手

从观察来看, 我们的数据显示出的数据分布较为均衡, 这表明我们的样本在各方面都保持了良好的平衡状态。
除了之前提到的方法外,我们还可以使用describe()功能。该功能能够计算出数据的数量、平均值、最大和最小数值以及分位数值。
df.describe()
AI助手

删除异常值
异常值对我们模型的影响较为显著, 会对我们的模型预测精度造成较大影响, 现在就让我们来探讨一下如何应对这些异常值吧. 具体来说, 我们的处理方式较为简单, 主要有两种方法: 一种是直接删除这些异常数据; 另一种是用其他统计指标来替代. 比如我们可以用平均值或者其他统计量来填补.
核心问题在于如何识别异常值。具体而言, 我们将采用两种方法来处理这一问题: 一种是通过统计数据分析, 另一种则是借助图表展示并进行直观观察. 对于统计数据部分我们之前已经进行了介绍, 而describe() 方法则是一种高效的数据摘要工具.
第二种方式我们可以使用箱线图进行观察
#导入数据可视化所需要的库
import matplotlib.pyplot as plt # Matplotlib – Python画图工具库
plt.boxplot(df3[num_col],labels=num_col)
AI助手

箱线图由五个关键数据点构成,包括最小值 (min)、下四分位数 (Q1)、中位数 (median)、上四分位数 (Q3) 和最大值 (max)。这些统计量在数据分析中被统称为五项关键指标。这些关键指标则能有效呈现数据的整体分布情况及其波动范围。
观察图表可知,我们的Fare和Age可能存在异常值。问题在于数值类型中有的列呈现较大范围变化(即存在较大的数值波动),而有的列则呈现出较小的数值变化(即较稳定的数值特征)。这不便于在同一图表中展示数据特征。建议采取分图展示。
plt.boxplot(df3['Fare'])
AI助手

是否适用于不同类别数据的分析?比如,在分析乘客存活情况时(即Survived变量取值为0和1),我想要具体了解各年龄段乘客的分布情况。
import seaborn as sns # Seaborn – 统计学数据可视化工具库
sns.boxplot(x='Survived', y="Age", data=df3) # 用seaborn的箱线图画图
AI助手

在观察过程中未发现任何显著差异;建议采用以下代码来剔除潜在存在的异常值
# 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)]
AI助手
生成标签和特征
在监督学习框架中,在数据预处理阶段我们从数据集中提取了特征与标签作为建模的基础输入。其中Y代表目标变量即模型需要预测的值目标变量通常位于数据集中特定的位置而X则代表用于建模的输入变量这些输入变量经过预处理后会被传递给学习算法以完成任务。
X = df4[['Pclass','Sex','Age', 'SibSp','Parch','Fare','Embarked']]
Y = df4['Survived']
AI助手
数据分割
我们如何在机器学习中分割数据?
- **训练数据:**我们使用用于构建机器学习模型的关键组成部分来生成大量样本集合作为输入与标签对(input and label pairs),这些样本集合帮助机器学习算法识别模式并建立映射关系。
- **验证集:**为了保证机器学习算法能够有效泛化到 unseen 的情况,在算法开发初期我们会定期检查进度并根据验证集结果不断优化超参数配置(hyperparameter configuration)。
- **测试集:**当我们的机器学习算法经过全面而系统的优化后,在独立测试集中生成预测结果以确保公平、准确地验证其性能表现;通过对比预测值与真实标签(true labels),我们可以量化算法在新样本上的识别能力。

