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

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

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

在这里插入图片描述


在这里插入图片描述

图片源。1

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

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

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

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


数据清洗的核心步骤

1. 缺失值处理

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

  • 删除:如果缺失值比例较高,可以直接删除相关样本或特征。
  • 填充:使用均值、中位数、众数或其他统计量进行填充。
  • 插值法:对于时间序列数据,可以采用线性插值等方法。
示例代码(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实现):
from sklearn.preprocessing import StandardScaler# 标准化 Fare 列
scaler = StandardScaler()
data['Fare'] = scaler.fit_transform(data[['Fare']])

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


3. 特征编码

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

One-Hot Encoding

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

Label Encoding

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

示例代码(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实现):
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:登船港口

完整代码

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. 缺失值处理前后的对比

可视化目标:

  • 展示原始数据中缺失值的分布。
  • 对比清洗后缺失值是否被成功填补。
示例代码:
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 列的分布,确保填充策略没有显著改变数据分布。
示例代码:
# 原始数据中 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 列在标准化前后的分布变化。
示例代码:
# 原始数据中 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 编码后的分布。
示例代码:
# 性别分布
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)的影响较大。
示例代码:
# 计算相关性矩阵
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.rhkb.cn/news/18596.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

B站视频同步思维导图(全)

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z 文章目录 前言分段视频一张思维导图版本手写版本联系作者 分段视频 Java基础 并发编程 MySQL redis…

Spring中@Import原理和使用

Import注解是Spring框架中一个非常强大的工具&#xff0c;它允许你将普通类、组件类、ImportSelector实现类和ImportBeanDefinitionRegistrar实现类引入到容器中。通过Import&#xff0c;你可以实现配置的模块化&#xff0c;使得代码更加清晰和易于维护。 Spring集成很多框架时…

《pytorch》——优化器的解析和使用

优化器简介 在 PyTorch 中&#xff0c;优化器&#xff08;Optimizer&#xff09;是用于更新模型参数以最小化损失函数的关键组件。在机器学习和深度学习领域&#xff0c;优化器是一个至关重要的工具&#xff0c;主要用于在模型训练过程中更新模型的参数&#xff0c;其目标是最…

第J2周:ResNet50V2算法实战与解析

文章目录 一、准备工作1.设置GPU2.导入数据3.查看数据 二、数据预处理1.加载数据2.可视化数据 总结 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、准备工作 1.设置GPU import tensorflow as tf gpus …

CAS单点登录(第7版)18.日志和审计

如有疑问&#xff0c;请看视频&#xff1a;CAS单点登录&#xff08;第7版&#xff09; 日志和审计 Logging 概述 Logging CAS 提供了一个日志记录工具&#xff0c;用于记录重要信息事件&#xff0c;如身份验证成功和失败;可以对其进行自定义以生成用于故障排除的其他信息。…

Mybatisplus-IService

文章目录 简介IService如何继承基础业务完成复杂业务逻辑更简便的Lambda方法批处理 简介 IService类似于我们的BaseMapper吧 现在就是Service层的那些简单的CRUD也不用写了 下面是方法图 IService如何继承 不同于Mapper可以直接基础BaseMapper接口不用实现 我们的serviceIm…

一键安装教程

Maven 安装 右键 以管理员身份运行点击 下一步安装完成后会同步配置环境变量打开 cmd, 输入 mvn 查看mvn版本修改 maven 本地仓库地址 见图三, 本地新建文件夹&#xff0c;修改为你本地文件夹地址 Redis 安装 右键 以管理员身份运行点击 下一步会安装到选择的文件夹下 JAVA\R…

5分钟掌握LM Studio本地部署DeepSeek R1

文章目录 LM Studio安装与配置修改模型下载源下载DeepSeek R1模型模型选择配置模型部署API服务常见问题解决总结LM Studio安装与配置 下载地址:https://lmstudio.ai/ LM Studio 是一款专为开发者设计的轻量级集成开发环境(IDE),支持多种编程语言及框架,提供智能代码补全…

(前端基础)HTML(一)

前提 W3C:World Wide Web Consortium&#xff08;万维网联盟&#xff09; Web技术领域最权威和具有影响力的国际中立性技术标准机构 其中标准包括&#xff1a;机构化标准语言&#xff08;HTML、XML&#xff09; 表现标准语言&#xff08;CSS&#xff09; 行为标准&#xf…

Beszel监控Docker安装

一、Beszel Hub安装 #Beszel Hub安装 mkdir -p ./beszel_data && \ docker run -d \--name beszel \--restartunless-stopped \-v ./beszel_data:/beszel_data \-p 8090:8090 \henrygd/beszel#创建账号 账号/密码&#xff1a;adminadmin.com/adminadmin.com 二、Besz…

flutter image_cropper插件安装后 打包apk 报错命名空间问题

本篇文章主要讲解&#xff0c;Flutter安装完新依赖打包apk报错 A problem occurred configuring project ‘:image_cropper’. 命名空间问题的解决办法及原因说明。 日期&#xff1a;2025年2月15日 作者&#xff1a;任聪聪 一、报错现象&#xff1a; 报文信息&#xff1a; FAI…

unity学习41:动画里的曲线curve参数 和 事件 events

目录 1 曲线 curve 1.1 生成和修改曲线 1.2 曲线命名 animator参数命名&#xff0c;关联起来 1.3 可以修改animator的参数&#xff0c;也可以获取animator的参数 1.4 用脚本获得曲线的参数数值&#xff0c;并打印出来 1.4.1 获得曲线的test1参数 1.4.2 代码 1.4.3 测…

JVM学习

JVM 1、JVM是一个跨语言的平台&#xff0c;与语言无关 2、java虚拟机规范&#xff1a;一流企业做标准&#xff0c;二流企业做品牌&#xff0c;三流企业做产品 JVM种类 Hotspot&#xff1a;Oracle 公司&#xff0c;有商业版和免费版 open jdk 内部包含免费版本hotspot虚拟机 Jr…

DeepSeek 助力 Vue 开发:打造丝滑的开关切换(Switch)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

141,【1】buuctf web [SUCTF 2019]EasyWeb

进入靶场 代码审计 <?php // 定义函数get_the_flag&#xff0c;功能是处理文件上传相关操作 function get_the_flag() {// 注释说明&#xff1a;webadmin会每隔20分钟删除用户上传的文件$userdir "upload/tmp_" . md5($_SERVER[REMOTE_ADDR]);// 检查用户目录…

基于STM32的智能鱼塘养殖监控系统

1. 引言 水产养殖业正朝着智能化、精细化方向发展&#xff0c;传统养殖模式存在水质监控滞后、投喂不精准等问题。本文设计了一款基于STM32的智能鱼塘养殖监控系统&#xff0c;通过实时监测水质参数、自动投喂与远程管理&#xff0c;实现科学养殖&#xff0c;提高产量与经济效…

mapbox V3 新特性,添加下雪效果

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;mapbox 从入门到精通 文章目录 一、&#x1f340;前言1.1 ☘️mapboxgl.Map 地图对象…

Large Language Model Distilling Medication Recommendation Model

摘要&#xff1a;药物推荐是智能医疗系统的一个重要方面&#xff0c;因为它涉及根据患者的特定健康需求开具最合适的药物。不幸的是&#xff0c;目前使用的许多复杂模型往往忽视医疗数据的细微语义&#xff0c;而仅仅严重依赖于标识信息。此外&#xff0c;这些模型在处理首次就…

高血压危险因素分析(项目分享)

高血压危险因素分析&#xff08;项目分享&#xff09; 高血压作为一种极为常见的慢性疾病&#xff0c;正严重威胁着大众健康。它的发病机制较为复杂&#xff0c;涉及多个方面的因素。 在一份临床采集的数据的基础上&#xff0c;我们通过数据分析手段深入观察一下 BMI&#xf…

基于STM32的智能垃圾分类回收系统

1. 引言 随着城市化进程加快&#xff0c;传统垃圾处理方式已无法满足环保需求。本文设计了一款基于STM32的智能垃圾分类回收系统&#xff0c;通过图像识别、重量检测与自动分拣技术&#xff0c;实现垃圾精准分类&#xff0c;提高回收效率&#xff0c;助力城市可持续发展。 2. …