【深度学习】数据预处理

为了能用深度学习来解决现实世界的问题,我们经常从预处理原始数据开始,

而不是从那些准备好的张量格式数据开始。

在Python中常用的数据分析工具中,我们通常使用pandas软件包。

像庞大的Python生态系统中的许多其他扩展包一样,pandas可以与张量兼容。

本节我们将简要介绍使用pandas预处理原始数据,并将原始数据转换为张量格式的步骤。

后续将介绍更多的数据预处理技术。

读取数据集

举一个例子,我们首先(创建一个人工数据集,并存储在CSV(逗号分隔值)文件 )../data/house_tiny.csv中。

以其他格式存储的数据也可以通过类似的方式进行处理。下面我们将数据集按行写入CSV文件中。

下面先简单介绍一下CSV文件

CSV(Comma-Separated Values)文件,即逗号分隔值文件,是一种常见的简单文件格式,用于存储表格数据。

 特点和用途

- **简单易读**:CSV 文件以纯文本形式存储表格数据,每行数据表示一条记录,**字段之间用逗号分隔**(也可以使用其他字符如分号等作为分隔符,但逗号是最常见的)。
- **广泛支持**:几乎所有的电子表格软件(如Microsoft Excel、Google Sheets等)和数据分析工具(如Python的pandas库、R语言等)都支持CSV文件的读取和写入,使其成为数据交换的通用格式。
- **数据存储和传输**:常用于在不同系统和软件之间传输和存储数据,例如从数据库中导出数据、在网站上提供数据下载等。


CSV文件因其简单性和通用性,在数据处理和分析领域中被广泛应用,是数据存储和交换的重要格式之一。
python 复制代码
import os

os.makedirs(os.path.join('..', 'data'), exist_ok=True)
data_file = os.path.join('..', 'data', 'house_tiny.csv')
with open(data_file, 'w') as f:
    f.write('NumRooms,Alley,Price\n')  # 列名
    f.write('NA,Pave,127500\n')  # 每行表示一个数据样本
    f.write('2,NA,106000\n')
    f.write('4,NA,178100\n')
    f.write('NA,NA,140000\n')
以下是对这段代码的解读:

### 1. 导入`os`模块

import os

`os`模块提供了与操作系统交互的功能,例如文件和目录操作等。

### 2. 创建目录

os.makedirs(os.path.join('..', 'data'), exist_ok=True)

- `os.path.join('..', 'data')`:使用`os.path.join`函数将`'..'`(上一级目录)和`'data'`拼接成一个完整的路径,表示要在上一级目录下创建一个名为`data`的目录。
- `os.makedirs`:用于创建多层目录。`exist_ok=True`表示如果目录已经存在,不会引发异常,而是直接跳过创建操作。

### 3. 定义数据文件路径

data_file = os.path.join('..', 'data', 'house_tiny.csv')

再次使用`os.path.join`将上一级目录、`data`目录和文件名`house_tiny.csv`拼接成完整的文件路径,并将其赋值给变量`data_file`,以便后续操作该文件。

### 4. 写入CSV文件内容

with open(data_file, 'w') as f:
    f.write('NumRooms,Alley,Price\n')  # 列名
    f.write('NA,Pave,127500\n')  # 每行表示一个数据样本
    f.write('2,NA,106000\n')
    f.write('4,NA,178100\n')
    f.write('NA,NA,140000\n')

- `with open(data_file, 'w') as f`:使用`with`语句打开文件`data_file`,以写入模式(`'w'`)打开。`with`语句可以确保在操作完成后自动关闭文件,即使在操作过程中出现异常也能正确关闭文件,避免资源泄漏。
- 接下来的几行`f.write`语句分别写入了CSV文件的列名(`NumRooms,Alley,Price`)和几行数据样本,每行数据样本由逗号分隔的字段组成,分别对应房屋的房间数量(`NumRooms`)、小巷类型(`Alley`)和价格(`Price`)。其中`NA`表示缺失值。

这段代码的主要作用是创建一个目录和一个简单的CSV文件,并向该文件中写入一些房屋数据,为后续的数据处理和分析提供基础数据。例如,可以使用`pandas`等库读取这个CSV文件进行进一步的操作。

要[从创建的CSV文件中加载原始数据集 ],我们导入pandas包并调用read_csv函数。该数据集有四行三列。其中每行描述了房间数量("NumRooms")、巷子类型("Alley")和房屋价格("Price")。

python 复制代码
import pandas as pd

data = pd.read_csv(data_file)
print(data)

处理缺失值

注意,"NaN"项代表缺失值。[为了处理缺失的数据,典型的方法包括 插值法删除法 ]

其中插值法用一个替代值弥补缺失值,而删除法则直接忽略缺失值。在(这里,我们将考虑插值法)。

通过位置索引iloc,我们将data分成inputsoutputs

其中前者为data的前两列,而后者为data的最后一列。

对于inputs中缺少的数值,我们用同一列的均值替换"NaN"项。

python 复制代码
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
inputs = inputs.fillna(inputs.mean())
print(inputs)

[对于inputs中的类别值或离散值,我们将"NaN"视为一个类别。 ]

由于"巷子类型"("Alley")列只接受两种类型的类别值"Pave"和"NaN",pandas可以自动将此列转换为两列"Alley_Pave"和"Alley_nan"。

巷子类型为"Pave"的行会将"Alley_Pave"的值设置为1,"Alley_nan"的值设置为0。缺少巷子类型的行会将"Alley_Pave"和"Alley_nan"分别设置为0和1。

python 复制代码
inputs = pd.get_dummies(inputs, dummy_na=True)
print(inputs)

转换为张量格式

[现在inputsoutputs中的所有条目都是数值类型,它们可以转换为张量格式。 ]

当数据采用张量格式后,可以通过在 :numref:sec_ndarray中引入的那些张量函数来进一步操作。

python 复制代码
import torch

X = torch.tensor(inputs.to_numpy(dtype=float))
y = torch.tensor(outputs.to_numpy(dtype=float))
X, y
相关推荐
冻感糕人~25 分钟前
使用LangChain、CrewAI、AutoGen搭建数据分析Agent
人工智能·windows·ai·数据分析·langchain·大模型·agent
今天吃饺子1 小时前
小创新模型!6种2024算法优化BiTCN-SVM单变量输入单步预测,MATLAB机器学习预测全家桶再更新...
人工智能·算法·机器学习·支持向量机·matlab
知来者逆3 小时前
基于ADAS 与关键点特征金字塔网络融合的3D LiDAR目标检测原理与算法实现
人工智能·目标检测·计算机视觉·3d·自动驾驶·lidar·3d 点云
Odaily_3 小时前
SVM赛道概览:MoveVM落地,SVM能走多远
人工智能·算法·机器学习·支持向量机·数据挖掘
liruiqiang053 小时前
如何理解机器学习中的非线性模型 ?
人工智能·机器学习
—Qeyser4 小时前
[石榴翻译] 维吾尔语音识别 + TTS语音合成
人工智能·php·语音识别·laravel
美格智能4 小时前
CES 2025|全面拥抱端侧AI,美格智能在CES发布系列创新成果
人工智能
golitter.4 小时前
机器学习:逻辑回归
人工智能·机器学习·逻辑回归
KeyPan4 小时前
【机器学习:八、逻辑回归】
人工智能·算法·机器学习·数据挖掘·逻辑回归
视觉&物联智能4 小时前
【杂谈】-50+个生成式人工智能面试问题(四)
人工智能·深度学习·机器学习·面试·llm·aigc