【深度学习】数据预处理

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

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

在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)

转换为张量格式

**现在`inputs`和`outputs`中的所有条目都是数值类型,它们可以转换为张量格式。**

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

python 复制代码
import torch

X = torch.tensor(inputs.to_numpy(dtype=float))
y = torch.tensor(outputs.to_numpy(dtype=float))
X, y
相关推荐
遇码12 分钟前
大语言模型开发框架——LangChain
人工智能·语言模型·langchain·llm·大模型开发·智能体
在狂风暴雨中奔跑12 分钟前
使用AI开发Android界面
android·人工智能
飞哥数智坊14 分钟前
AI编程实战:30分钟实现Web 3D船舶航行效果
人工智能·three.js
誉鏐17 分钟前
从零开始设计Transformer模型(1/2)——剥离RNN,保留Attention
人工智能·深度学习·transformer
Ai野生菌18 分钟前
工具介绍 | SafeLLMDeploy教程来了 保护本地LLM安全部署
网络·人工智能·安全·大模型·llm
契合qht53_shine24 分钟前
OpenCV 从入门到精通(day_05)
人工智能·opencv·计算机视觉
3DVisionary31 分钟前
3D-DIC与机器学习协同模拟材料应力-应变本构行为研究
人工智能·机器学习·3d·3d-dic技术 机器学习·应力-应变本构行为·卷积神经网络(ecnn)·数字图像相关法(dic)
神经星星34 分钟前
无需预对齐即可消除批次效应,东京大学团队开发深度学习框架STAIG,揭示肿瘤微环境中的详细基因信息
人工智能·深度学习·机器学习
神经星星34 分钟前
【vLLM 学习】调试技巧
人工智能·机器学习·编程语言
程序员Linc1 小时前
写给新人的深度学习扫盲贴:向量与矩阵
人工智能·深度学习·矩阵·向量