资讯动态

d2l-en 数据预处理实战:用 pandas 完成 CSV 读取、缺失值处理与多框架张量转换

发布时间:2026/10/3 7:20:58 来源:尧图企业网站定制
文档教程人工智能深度学习NLP计算机视觉强化学习【免费下载链接】d2l-enInteractive deep learning book with multi-framework code, math, and discussions. Adopted at 500 universities from 70 countries including Stanford, MIT, Harvard, and Cambridge.项目地址https://gitcode.com/gh_mirrors/d2/d2l-en点击查看免费下载真实世界的深度学习应用几乎不会直接遇到现成的张量数据原始数据通常散落在任意格式的文件中携带缺失值、分类字段与噪声必须先经过预处理才能进入模型。本指南以 d2l-en《动手学深度学习》英文版第 2 章预备知识中的 pandas 实战章节为核心完整演示从创建 CSV 文件、用pandas读取、划分输入/目标列、处理缺失值分类字段 one-hot 编码、数值字段均值填充到最终转换为 MXNet / PyTorch / TensorFlow / JAX 四种框架张量的全流程并结合仓库内 Kaggle 房价、目标检测数据集等真实源码用例帮助你建立一套可直接复用、可扩展的数据预处理管线。为什么需要 pandas从现成张量到杂乱数据在前面章节如 ndarray 章节中我们一直在使用已经构造好的合成数据——数据直接以张量形式提供省去了中间环节。然而在真实场景中数据可能来自数据库导出、传感器采集或业务系统格式五花八门、质量参差不齐。幸运的是pandas库承担了大部分脏活累活它以DataFrame为核心数据结构提供了读取、清洗、变换、索引与聚合等一整套表格数据处理能力。需要说明的是本章是速成课而非完整的 pandas 教程——它聚焦于深度学习预处理中最常用的一组例程读 CSV、分列、缺失值处理、类别编码、转张量。如果你需要系统学习 pandas可阅读其官方用户指南本文只讨论与本仓库深度学习流程直接相关的核心操作。本仓库的所有实战章节都建立在pandas之上四个框架的 d2l 工具包d2l/mxnet.py、d2l/torch.py、d2l/tensorflow.py、d2l/jax.py均在文件头部import pandas as pd后续的图像分类、目标检测、Kaggle 竞赛等章节都会复用这里介绍的技术。读取数据集从 CSV 到 DataFrame逗号分隔值CSV文件是存储表格型类电子表格数据最通用的格式之一。CSV 中每一行对应一条记录由若干个用逗号分隔的字段组成例如Albert Einstein,March 14 1879,Ulm,Federal polytechnic school,field of gravitational physics为了演示如何用pandas加载 CSV我们首先在本地创建一个小型住宅数据集house_tiny.csv。这个文件代表一个住宅样本集每一行对应一所房屋列分别表示房间数NumRooms、屋顶类型RoofType和价格Price。在 d2l-en 的 Jupyter 笔记本中该文件被写入章节目录的上层data/文件夹即相对笔记本目录的../data/house_tiny.csv以仓库根目录计为data/house_tiny.csvimport os os.makedirs(os.path.join(.., data), exist_okTrue) data_file os.path.join(.., data, house_tiny.csv) with open(data_file, w) as f: f.write(NumRooms,RoofType,Price NA,NA,127500 2,NA,106000 4,Slate,178100 NA,NA,140000)接着导入pandas并用read_csv读取该文件import pandas as pd data pd.read_csv(data_file) print(data)运行后得到的DataFrame如下NumRooms RoofType Price 0 NaN NaN 127500 1 2.0 NaN 106000 2 4.0 Slate 178100 3 NaN NaN 140000可以看到pandas自动把 CSV 中的NA条目替换成了特殊的NaNnot a number值。同理如果某条记录存在空字段如3,,,270000也会产生NaN。这些被称为缺失值是数据科学中绕不开的持久性难题。缺失值的处理方式取决于具体上下文通常有两种思路插补imputation用对缺失值的估计来替换它们删除deletion直接丢弃包含缺失值的行或列。下文将分别介绍针对分类字段和数值字段的常用插补策略。数据准备划分输入与目标在监督学习中我们训练模型用一组输入值来预测指定的目标值。处理数据集的第一步就是把对应输入与目标的列分开。选择列有两种常用方式按列名选择或基于整数位置的索引iloc。下面代码将前两列NumRooms、RoofType作为输入特征inputs把第三列Price作为目标targetsinputs, targets data.iloc[:, 0:2], data.iloc[:, 2]iloc[:, 0:2]表示选取所有行、第 0 到第 1 列左闭右开iloc[:, 2]表示选取第 2 列。除iloc外pandas还支持按名称索引如data[[NumRooms, RoofType]]这在列顺序不稳定但列名稳定时更健壮该内容可查阅 pandas 官方索引文档深入学习。分类字段的缺失值处理把NaN当作一个类别对于分类输入字段一个常见的插补启发式是把NaN本身当作一个类别来处理。由于RoofType列只取值Slate和NaNpandas可以借助get_dummies把这一列转换成一列指示变量one-hot 编码inputs pd.get_dummies(inputs, dummy_naTrue) print(inputs)输出为NumRooms RoofType_Slate RoofType_nan 0 NaN 0 1 1 2.0 0 1 2 4.0 1 0 3 NaN 0 1get_dummies将RoofType拆成了两列RoofType_Slate与RoofType_nan屋顶类型为Slate的行其RoofType_Slate置 1、RoofType_nan置 0而RoofType缺失的行则相反。关键参数dummy_naTrue的作用正是让缺失值也获得一个专属的指示列避免把缺失信息静默丢弃——这种缺失本身也是一种信号的思想在真实项目中非常实用。数值字段的缺失值处理均值填充对于缺失的数值数据最常用的启发式是用对应列的均值替换NaN条目。DataFrame.fillna配合mean()即可一次完成inputs inputs.fillna(inputs.mean()) print(inputs)输出为NumRooms RoofType_Slate RoofType_nan 0 3.0 0 1 1 2.0 0 1 2 4.0 1 0 3 3.0 0 1此时NumRooms中两个缺失值都被替换成了该列均值(2.0 4.0) / 2 3.0而原本就是数值的RoofType_Slate、RoofType_nan列不受影响。注意这里inputs.mean()默认按列axis0计算均值因此可以逐列对齐填充若对某些场景需要按行方向处理可显式指定axis参数。转换为张量格式从 DataFrame 到多框架 Tensor当inputs与targets中所有条目都变成数值后就可以加载为张量了。转换分两步先用to_numpy(dtypefloat)把DataFrame变成浮点型 NumPy 数组再用各框架的张量构造器封装。这也是 d2l-en 的独特之处——同一套预处理逻辑可无缝对接四种深度学习框架MXNetfrom mxnet import np X, y np.array(inputs.to_numpy(dtypefloat)), np.array(targets.to_numpy(dtypefloat)) X, yPyTorchimport torch X torch.tensor(inputs.to_numpy(dtypefloat)) y torch.tensor(targets.to_numpy(dtypefloat)) X, yTensorFlowimport tensorflow as tf X tf.constant(inputs.to_numpy(dtypefloat)) y tf.constant(targets.to_numpy(dtypefloat)) X, yJAXfrom jax import numpy as jnp X jnp.array(inputs.to_numpy(dtypefloat)) y jnp.array(targets.to_numpy(dtypefloat)) X, y为什么要显式指定dtypefloat因为RoofType经 one-hot 编码后是整型 0/1 列若不统一转成浮点后续与NumRooms的浮点均值混在一起可能出现类型不一致进而影响张量构造与模型输入。统一转 float 后X是一个形状为(4, 3)的特征张量y是形状为(4,)的目标张量可以直接进入下一章的线性回归或 MLP 训练流程。提示d2l-en 全书的多框架代码通过 d2lbook 的标签机制组织%load_ext d2lbook.tab与tab.interact_select([...])读者可在网页端切换 MXNet / PyTorch / TensorFlow / JAX 四个标签查看对应实现。仓库源码中的 pandas 实战从 toy 数据到真实数据集上述三步读 CSV → 处理缺失值 → 转张量就是 d2l-en 数据预处理的最小闭环。仓库中多处真实用例可以印证这套模式的可扩展性。案例一Kaggle 房价竞赛的完整预处理管线在 kaggle-house-price 章节 中pandas 承担了竞赛数据的全部清洗工作。其数据加载使用pd.read_csv配合d2l.download下载并缓存训练/验证集带 SHA-1 校验预处理则把本章的技法放大到了 80 个特征的真实数据集上features pd.concat( (self.raw_train.drop(columns[Id, label]), self.raw_val.drop(columns[Id]))) # 筛选数值列并标准化 numeric_features features.dtypes[features.dtypes!object].index features[numeric_features] features[numeric_features].apply( lambda x: (x - x.mean()) / (x.std())) # 数值列缺失值填 0 features[numeric_features] features[numeric_features].fillna(0) # 离散列 one-hot 编码缺失也保留一列 features pd.get_dummies(features, dummy_naTrue)可以看到它复用了本文的get_dummies(features, dummy_naTrue)同时新增了两个进阶操作用features.dtypes ! object按数据类型自动筛选数值列以及先用标准化(x - x.mean()) / x.std()再fillna(0)。该章节明确记录one-hot 编码后特征数从 79 增加到 331不含 Id 与标签列这正是dummy_naTrue为每个分类列的缺失值单独建列的结果。案例二目标检测数据集的逐行读取在 object-detection-dataset 章节 对应的工具函数 read_data_bananas 中pandas 被用来读取目标检测标注 CSV展示了set_index与iterrows的用法csv_data pd.read_csv(csv_fname) csv_data csv_data.set_index(img_name) for img_name, target in csv_data.iterrows(): images.append(torchvision.io.read_image(...)) targets.append(list(target))把图像文件名设成索引后逐行迭代每行取出的就是该图像的类别与边界框标注——这正印证了CSV 是表格数据的通用载体这一判断即使是图像任务其标注也常以表格形式存在。案例三轻量级 CSV 解析的取舍另一方面仓库也提供了不依赖 pandas 的轻量替代。例如 read_csv_labels 用手工readlinessplit(,)解析 CIFAR-10 的标签文件返回文件名→标签字典。这说明在实际项目中应根据数据规模与解析复杂度在pandas 的便利性与手工解析的性能之间做权衡——这正是本文末尾练习题所引导的思考方向。真实世界数据的挑战与数据质量掌握了上述速成技能后你已经能够划分数据列、插补缺失变量并把 pandas 数据载入张量。但真实的数据处理远比这个 toy 示例复杂需要提前意识到以下几类问题多文件与关系型来源数据集可能不是单个 CSV而是从关系数据库导出的多个表。例如电商场景中客户地址与购买记录往往分别存放在不同表中需要按外键做连接merge与聚合才能拼成训练样本数据类型多样化除分类与数值外还有文本字符串、图像、音频、点云等类型。针对它们往往需要专用工具与高效算法分词、图像解码、特征提取等否则数据预处理会成为机器学习流水线中最大的瓶颈。这些问题在本书后续的计算机视觉与自然语言处理章节中会反复出现数据质量问题真实数据集常受离群点、传感器错误测量与记录误差困扰必须在喂给模型之前处理。数据可视化工具如 seaborn、Bokeh、matplotlib 等可以帮助人工检视数据分布、建立对问题类型的直觉从而决定该用插补、删除还是修正。延伸练习与进一步探索为巩固本章内容d2l-en 提供了以下进阶练习读者可结合 pandas 官方文档与 ndarray 章节 中的张量知识逐一实践尝试加载真实数据集如 UCI Machine Learning Repository 中的 Abalone 数据集并检查其属性有多少比例含缺失值数值、分类、文本变量各占多少练习按列名而非列号索引和选择数据列体会两种方式在不同场景下的优劣。思考用本章方式能加载多大的数据集瓶颈是什么提示考虑读取时间、表示方式、处理开销与内存占用。在自己的笔记本和服务器上分别实测。数据拥有极多类别时如何处理若类别标签全部唯一如 ID是否应该保留这类列pandas 之外的替代方案有哪些例如 NumPy 的numpy.load直接加载张量文件或 PillowPython 图像处理库处理图像格式。下一站kaggle-house-price 章节 将在此基础上补全更多数据处理技能标准化、训练/验证划分、提交预测把本章的速成技能完整应用到一场真实的机器学习竞赛中。赞分享文档教程人工智能深度学习NLP计算机视觉强化学习【免费下载链接】d2l-enInteractive deep learning book with multi-framework code, math, and discussions. Adopted at 500 universities from 70 countries including Stanford, MIT, Harvard, and Cambridge.项目地址https://gitcode.com/gh_mirrors/d2/d2l-en点击查看免费下载相关推荐《动手学深度学习》数据预处理实战用 pandas 完成缺失值处理并转换为张量格式《动手学深度学习》数据预处理实战用 pandas 完成缺失值处理并转换为张量格式 深度学习模型无法直接消费散落在磁盘上的原始数据如 CSV、JSON 等文本人工智能深度学习机器学习教程python-machine-learning-book实战用Pandas处理缺失值python machine learning book实战用Pandas处理缺失值 在机器学习项目中缺失值是数据预处理阶段最常见的挑战之一。不合理的缺失值机器学习教程《动手学深度学习》数据预处理实战用 pandas 清洗原始数据并转换为张量格式《动手学深度学习》数据预处理实战用 pandas 清洗原始数据并转换为张量格式 真实世界中的数据往往不是现成的张量而是散落在 CSV、数据库或 API 中的人工智能深度学习机器学习教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑