数据预处理
为了能用深度学习来解决现实世界的问题,我们经常从预处理原始数据开始,而不是从那些准备好的张量格式数据开始。
在Python中常用的数据分析工具中,我们通常使用pandas软件包。像庞大的Python生态系统中的许多其他扩展包一样,pandas可以与张量兼容。
本节我们将简要介绍使用pandas预处理原始数据,并将原始数据转换为张量格式的步骤。我们将在后面的章节中介绍更多的数据预处理技术。
读取数据集
举一个例子,我们首先创建一个人工数据集,并存储在CSV(逗号分隔值)文件 …/data/house_tiny.csv中。
以其他格式存储的数据也可以通过类似的方式进行处理,下面我们将数据集按行写入CSV文件中。
import os #导入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 fp:
fp.write('NumRooms,Alley,Price\n')
fp.write('NA,Pave,127500\n')
fp.write('2,NA,106000\n')
fp.write('4,NA,178100\n')
fp.write('NA,NA,140000\n') #将这些信息写入csv文件之中
要从创建的CSV文件中加载原始数据集,我们导入pandas包并调用read_csv函数。
该数据集有四行三列。其中每行描述了房间数量(“NumRooms”)、巷子类型(“Alley”)和房屋价格(“Price”)。
import pandas as pd #导入pandas数据处理包
data = pd.read_csv('../data/house_tiny.csv') #直接使用csv包的read_csv读取csv文件
NumRooms | Alley | Price | |
---|---|---|---|
0 | NaN | Pave | 127500 |
1 | 2.0 | NaN | 106000 |
2 | 4.0 | NaN | 178100 |
3 | NaN | NaN | 140000 |
处理缺失值
注意,“NaN”项代表缺失值。为了处理缺失的数据,典型的方法包括插值法和删除法,其中插值法用一个替代值弥补缺失值,而删除法则直接忽略缺失值。
通过位置索引iloc,我们将data分成inputs和outputs,其中前者为data的前两列,而后者为data的最后一列。
在这里,我们将考虑插值法。对于inputs中缺少的数值,我们用同一列的均值替换“NaN”项。
inputs = data.iloc[:,:2] #pandas的切片操作,取得输入集合
outputs = data.iloc[:,-1] #pandas的切片操作,取得输出集合
inputs #输入集数据
NumRooms | Alley | |
---|---|---|
0 | NaN | Pave |
1 | 2.0 | NaN |
2 | 4.0 | NaN |
3 | NaN | NaN |
outputs #输出集数据
0 127500
1 106000
2 178100
3 140000
Name: Price, dtype: int64
使用均值替换掉NumRooms中的NaN值
inputs = inputs.fillna(inputs.mean()) #以平均值填充NaN空值
inputs #输出填充过的结果
NumRooms | Alley | |
---|---|---|
0 | 3.0 | Pave |
1 | 2.0 | NaN |
2 | 4.0 | NaN |
3 | 3.0 | NaN |
对于inputs中的类别值或离散值,我们将“NaN”视为一个类别。
由于“巷子类型”(“Alley”)列只接受两种类型的类别值“Pave”和“NaN”,pandas可以自动将此列转换为两列“Alley_Pave”和“Alley_nan”。
- 巷子类型为“Pave”的行会将“Alley_Pave”的值设置为1,“Alley_nan”的值设置为0。
- 缺少巷子类型的行会将“Alley_Pave”和“Alley_nan”分别设置为0和1。
inputs = pd.get_dummies(inputs, dummy_na=True) #'dummies'假人,即对两分类的数据进行标注0或1
print(inputs)
NumRooms Alley_Pave
0 3.0 1
1 2.0 0
2 4.0 0
3 3.0 0
转换为张量数据
现在inputs和outputs中的所有条目都是数值类型,它们可以转换为张量格式。
当数据采用张量格式后,可以通过在上节中(Pytorch的数据操作)引入的那些张量函数来进一步操作。
import numpy as np #引入numpy数组
X, y = np.array(inputs.values), np.array(outputs.values) #将pandas数据转化为张量
X, y
(array([[3., 1.],
[2., 0.],
[4., 0.],
[3., 0.]]),
array([127500, 106000, 178100, 140000], dtype=int64))
小结
pandas软件包是Python中常用的数据分析工具中,pandas可以与张量兼容。
用pandas处理缺失的数据时,我们可根据情况选择用插值法和删除法。