【深度学习】数据预处理

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

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

在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
相关推荐
可乐+冰07 分钟前
Android 编写高斯模糊功能
android·人工智能·opencv
嘀咕博客1 小时前
SynClub-百度在海外推出的AI社交产品
人工智能·百度·ai工具
AI算法工程师Moxi1 小时前
什么是迁移学习(transfer learning)
人工智能·机器学习·迁移学习
空白到白2 小时前
机器学习-KNN算法
人工智能·算法·机器学习
aliedudu2 小时前
机器学习概述
人工智能·机器学习
love you joyfully2 小时前
循环神经网络——pytorch实现循环神经网络(RNN、GRU、LSTM)
人工智能·pytorch·rnn·深度学习·gru·循环神经网络
袁庭新2 小时前
AI如何辅助创业?年轻人一定要创业
人工智能·创业
GIS开发特训营3 小时前
【智慧城市】2025年中国地质大学(武汉)暑期实训优秀作品(2):智慧城市西安与一带一路
人工智能·信息可视化·智慧城市
飞哥数智坊3 小时前
扣子实战第19讲:Coze零代码打造“新生入学百事通”,辅导员都说好
人工智能·coze
上海控安3 小时前
上海控安:GB 44495-2024《汽车整车信息安全技术要求》标准解读和测试方案
大数据·人工智能·汽车