机器学习实战(2):数据预处理——机器学习的第一步

ops/2025/2/22 13:46:56/

第2集:数据预处理——机器学习的第一步

机器学习的旅程中,数据预处理是至关重要的第一步。它决定了模型训练的质量和最终性能。没有经过良好预处理的数据就像未经打磨的钻石,虽然可能蕴含价值,但难以展现其光彩。今天我们将深入探讨数据预处理的关键步骤,并通过实践部分展示如何对经典数据集 Titanic 进行清洗与转换。

在这里插入图片描述


在这里插入图片描述

图片源。1

为什么数据清洗如此重要?

数据通常是“脏”的——包含噪声、缺失值、重复记录或格式不一致等问题。这些问题会直接影响模型的学习能力,甚至导致错误的结论。例如:

  • 缺失值可能导致算法无法正常运行。
  • 异常值可能误导模型,使其偏向错误的方向。
  • 不一致的格式(如日期、单位)会让数据变得不可用。

图1:数据清洗前后对比
(图片描述:待数据清洗示意,包含缺失值、异常值和乱码;)
在这里插入图片描述


数据清洗的核心步骤

1. 缺失值处理

缺失值是数据集中最常见的问题之一。处理方法包括:

  • 删除:如果缺失值比例较高,可以直接删除相关样本或特征。
  • 填充:使用均值、中位数、众数或其他统计量进行填充。
  • 插值法:对于时间序列数据,可以采用线性插值等方法。
示例代码(Python实现):
python">import pandas as pd# 加载数据
data = pd.read_csv('titanic.csv')# 填充年龄列的缺失值(使用中位数)
data['Age'].fillna(data['Age'].median(), inplace=True)# 删除含有大量缺失值的列
data.dropna(axis=1, thresh=int(0.8 * len(data)), inplace=True)

2. 异常值检测与标准化

异常值是指那些偏离正常范围的极端值。它们可能是录入错误,也可能是真实但罕见的情况。常用方法包括:

  • 箱线图:可视化识别异常值。
  • Z-Score:计算每个数据点的标准分数,剔除超出一定阈值的值。
标准化

为了确保不同特征具有相同的尺度,通常需要对数据进行标准化。常见方法有:

  • Min-Max Scaling:将数据缩放到 [0, 1] 区间。
  • Z-Score Standardization:将数据转换为均值为 0,标准差为 1 的分布。
示例代码(Python实现):
python">from sklearn.preprocessing import StandardScaler# 标准化 Fare 列
scaler = StandardScaler()
data['Fare'] = scaler.fit_transform(data[['Fare']])

图2:箱线图显示异常值
(图片描述:箱线图常用于发现和标记异常值。)
在这里插入图片描述


3. 特征编码

许多机器学习算法只能处理数值型数据,因此需要将类别型特征转化为数值形式。两种常用方法如下:

One-Hot Encoding

适用于无序分类变量,例如性别(男/女)。每种类别都会生成一个新的二进制特征。

Label Encoding

适用于有序分类变量,例如教育水平(小学 < 初中 < 高中)。直接将类别映射为整数。

示例代码(Python实现):
python">from sklearn.preprocessing import OneHotEncoder, LabelEncoder# 对 Sex 列进行 One-Hot Encoding
encoder = OneHotEncoder(sparse=False)
sex_encoded = encoder.fit_transform(data[['Sex']])
data = pd.concat([data, pd.DataFrame(sex_encoded, columns=['Male', 'Female'])], axis=1)# 对 Embarked 列进行 Label Encoding
label_encoder = LabelEncoder()
data['Embarked'] = label_encoder.fit_transform(data['Embarked'])

4. 数据分割

为了评估模型的泛化能力,我们需要将数据分为训练集和测试集。一般推荐的比例是 80% 训练集 + 20% 测试集。

示例代码(Python实现):
python">from sklearn.model_selection import train_test_split# 分割数据集
X = data.drop('Survived', axis=1)  # 特征
y = data['Survived']               # 标签
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

实践部分:Titanic 数据集的预处理

我们以著名的 Titanic 数据集为例,演示完整的预处理流程。

数据集简介

Titanic 数据集包含了泰坦尼克号乘客的信息,目标是预测某位乘客是否幸存。主要特征包括:

  • Pclass:船票等级
  • Sex:性别
  • Age:年龄
  • SibSp:兄弟姐妹/配偶数量
  • Parch:父母/子女数量
  • Fare:票价
  • Embarked:登船港口

完整代码

python">import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler, OneHotEncoder, LabelEncoder# 加载数据
url = "https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv"
data = pd.read_csv(url)# 处理缺失值
data['Age'].fillna(data['Age'].median(), inplace=True)
data['Embarked'].fillna(data['Embarked'].mode()[0], inplace=True)# 删除无关列
data.drop(['Name', 'Ticket', 'Cabin'], axis=1, inplace=True)# 特征编码
encoder = OneHotEncoder(sparse=False)
sex_encoded = encoder.fit_transform(data[['Sex']])
embarked_encoded = encoder.fit_transform(data[['Embarked']])
data = pd.concat([data,pd.DataFrame(sex_encoded, columns=['Male', 'Female']),pd.DataFrame(embarked_encoded, columns=['Embarked_C', 'Embarked_Q', 'Embarked_S'])
], axis=1)
data.drop(['Sex', 'Embarked'], axis=1, inplace=True)# 标准化 Fare 列
scaler = StandardScaler()
data['Fare'] = scaler.fit_transform(data[['Fare']])# 分割数据集
X = data.drop('Survived', axis=1)
y = data['Survived']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)print("数据预处理完成!")

数据可视化清洗结果

在数据清洗和预处理完成后,可视化是展示清洗结果的重要手段。通过可视化,我们可以直观地了解数据分布、缺失值处理效果以及特征编码后的变化。以下是一些常见的可视化方法及其代码示例:

在数据清洗和预处理完成后,可视化是展示清洗结果的重要手段。通过可视化,我们可以直观地了解数据分布、缺失值处理效果以及特征编码后的变化。以下是一些常见的可视化方法及其代码示例:


1. 缺失值处理前后的对比

可视化目标:

  • 展示原始数据中缺失值的分布。
  • 对比清洗后缺失值是否被成功填补。
示例代码:
python">import matplotlib.pyplot as plt
import seaborn as sns# 加载原始数据
url = "https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv"
original_data = pd.read_csv(url)# 统计原始数据中的缺失值
missing_before = original_data.isnull().sum()# 统计清洗后的缺失值
missing_after = data.isnull().sum()# 创建对比图
fig, ax = plt.subplots(figsize=(10, 6))
missing_before.plot(kind='bar', color='red', alpha=0.6, label='Before Cleaning')
missing_after.plot(kind='bar', color='green', alpha=0.6, label='After Cleaning')
plt.title('Missing Values Before and After Cleaning', fontsize=16)
plt.xlabel('Features', fontsize=12)
plt.ylabel('Number of Missing Values', fontsize=12)
plt.legend()
plt.show()

图1:缺失值处理前后对比
(图片描述:柱状图展示了每个特征在清洗前后的缺失值数量,红色表示清洗前,绿色表示清洗后。)
在这里插入图片描述


2. 年龄(Age)列填充效果的分布对比

可视化目标:

  • 比较填充缺失值前后 Age 列的分布,确保填充策略没有显著改变数据分布。
示例代码:
python"># 原始数据中 Age 的分布(包含缺失值)
sns.histplot(original_data['Age'], color='blue', kde=True, bins=30, label='Original')# 清洗后 Age 的分布
sns.histplot(data['Age'], color='orange', kde=True, bins=30, label='After Filling')plt.title('Age Distribution Before and After Filling Missing Values', fontsize=16)
plt.xlabel('Age', fontsize=12)
plt.ylabel('Frequency', fontsize=12)
plt.legend()
plt.show()

图2:年龄分布对比
(图片描述:直方图展示了 Age 列在清洗前后的分布情况,蓝色为原始数据,橙色为填充后的数据。)
在这里插入图片描述


3. 标准化前后票价(Fare)的分布对比

可视化目标:

  • 展示 Fare 列在标准化前后的分布变化。
示例代码:
python"># 原始数据中 Fare 的分布
sns.histplot(original_data['Fare'], color='purple', kde=True, bins=30, label='Original')# 标准化后的 Fare 分布
sns.histplot(data['Fare'], color='green', kde=True, bins=30, label='Standardized')plt.title('Fare Distribution Before and After Standardization', fontsize=16)
plt.xlabel('Fare', fontsize=12)
plt.ylabel('Frequency', fontsize=12)
plt.legend()
plt.show()

图3:票价分布对比
(图片描述:直方图展示了 Fare 列在标准化前后的分布情况,紫色为原始数据,绿色为标准化后的数据。)
在这里插入图片描述


4. 类别型特征编码后的分布

可视化目标:

  • 展示类别型特征(如 SexEmbarked)在 One-Hot 编码后的分布。
示例代码:
python"># 性别分布
gender_counts = original_data['Sex'].value_counts()
plt.figure(figsize=(8, 5))
sns.barplot(x=gender_counts.index, y=gender_counts.values, palette='Set2')
plt.title('Gender Distribution (Before Encoding)', fontsize=16)
plt.xlabel('Gender', fontsize=12)
plt.ylabel('Count', fontsize=12)
plt.show()# One-Hot 编码后的性别分布
encoded_gender = data[['Male', 'Female']].sum()
plt.figure(figsize=(8, 5))
sns.barplot(x=['Male', 'Female'], y=encoded_gender.values, palette='Set2')
plt.title('Gender Distribution (After One-Hot Encoding)', fontsize=16)
plt.xlabel('Gender', fontsize=12)
plt.ylabel('Count', fontsize=12)
plt.show()

图4:性别分布对比
(图片描述:条形图展示了性别在编码前后的分布情况,上图为原始分类数据,下图为 One-Hot 编码后的数据。)
在这里插入图片描述
在这里插入图片描述


5. 相关性热力图

可视化目标:

  • 展示清洗后特征之间的相关性,帮助理解哪些特征对目标变量(Survived)的影响较大。
示例代码:
python"># 计算相关性矩阵
correlation_matrix = data.corr()# 绘制热力图
plt.figure(figsize=(12, 8))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', fmt='.2f')
plt.title('Feature Correlation Matrix', fontsize=16)
plt.show()

图5:特征相关性热力图
(图片描述:热力图展示了清洗后各特征之间的相关性,颜色越深表示相关性越高。)
在这里插入图片描述


通过上述可视化方法,我们能够清晰地展示数据清洗的效果,包括缺失值处理、特征编码和标准化的结果。这些图表不仅有助于验证清洗过程的正确性,还能为后续建模提供洞察。

希望这些代码能帮助你更好地展示数据清洗的结果!如果你有其他需求或想法,请随时告诉我!


总结

数据预处理是机器学习项目中最耗时但也最重要的环节。通过本文,我们了解了以下关键步骤:

  1. 缺失值处理:填补或删除缺失值。
  2. 异常值检测与标准化:提升数据质量并统一尺度。
  3. 特征编码:将类别型特征转化为数值型。
  4. 数据分割:构建训练集和测试集。

希望这篇文章能帮助你更好地理解数据预处理的精髓!如果你有任何疑问,欢迎在评论区留言讨论。

下集预告:第3集:线性回归——预测连续变量


参考资料

  • Titanic 数据集
  • Scikit-learn 文档: https://scikit-learn.org/stable/documentation.html

  1. 注脚的解释 [图片引用来自:https://zhuanlan.zhihu.com/p/469319284] ↩︎


http://www.ppmy.cn/ops/160070.html

相关文章

数组和指针常见笔试题(深度剖析)

strlen和sizeof的区别 strlen是统计\0之前的字符个数&#xff0c;传递的是地址 sizeof是计算类型的字节数&#xff0c;其实在编译期间会通过类型来确定大小 下边我来讲一下常见的面试题&#xff0c;过程很详细放心观看 #include<stdio.h>#include <string.h>int …

视频帧的划分与冗余信息去除的关系

视频帧在被划分为宏块(Macroblock)时,有没有去除冗余信息??。划分宏块是 H.264 编码的第一步,是为了方便后续的处理(如预测、变换、量化等),这些步骤才是去除冗余信息的关键。 接下来,我们详细分析 视频帧的划分与冗余信息去除的关系,并解释为什么划分宏块是编码的…

电子制造企业数字化转型实战:基于Odoo构建MES平台的深度解决方案

作者背景 拥有8年乙方项目经理经验、8年甲方信息化管理经验&#xff0c;主导过12个Odoo制造业项目落地&#xff0c;服务客户涵盖消费电子、汽车电子、工业设备等领域。本文基于华东某电子企业&#xff08;以下简称"A公司"&#xff09;的实战案例&#xff0c;解析行业…

【Excel笔记_6】条件格式和自定义格式设置表中数值超过100保留1位,超过1000保留0位,低于100为默认

方法一&#xff1a;自定义格式 选中需要设置格式的单元格区域。右键选择设置单元格格式&#xff0c;或者在工具栏中选择开始 -> 数字 -> 自定义格式。在类型框中输入以下自定义格式&#xff1a; [>1000]0;[>100]0.0;G/通用格式解释&#xff1a; [>1000]0&…

【漫话机器学习系列】097.核主成分分析(Kernel PCA)

核主成分分析&#xff08;Kernel PCA&#xff09;详解 1. 引言 主成分分析&#xff08;PCA&#xff0c;Principal Component Analysis&#xff09;是一种常用的降维方法&#xff0c;广泛应用于数据压缩、特征提取和数据可视化。然而&#xff0c;传统的 PCA 只适用于线性数据&…

深入探索 DeepSeek 在数据分析与可视化中的应用

在数据驱动的时代&#xff0c;快速且准确地分析和呈现数据对于企业和个人都至关重要。DeepSeek 作为一款先进的人工智能工具&#xff0c;凭借其强大的数据处理和可视化能力&#xff0c;正在革新数据分析的方式。 1. 数据预处理与清洗 在进行数据分析前&#xff0c;数据预处理…

【ISO 14229-1:2023 UDS诊断(会话控制0x10服务)测试用例CAPL代码全解析⑤】

ISO 14229-1:2023 UDS诊断【会话控制0x10服务】_TestCase05 作者&#xff1a;车端域控测试工程师 更新日期&#xff1a;2025年02月15日 关键词&#xff1a;UDS诊断、0x10服务、诊断会话控制、ECU测试、ISO 14229-1:2023 TC10-005测试用例 用例ID测试场景验证要点参考条款预期…

ubuntu下安装TFTP服务器

在 Ubuntu 系统下安装和配置 TFTP&#xff08;Trivial File Transfer Protocol&#xff09;服务器可以按照以下步骤进行&#xff1a; 1. 安装 TFTP 服务器软件包 TFTP 服务器通常使用 tftpd-hpa 软件包&#xff0c;你可以使用以下命令进行安装&#xff1a; sudo apt update …