前言
在深度学习中,我们经常是从处理原始数据而不是直接从准备好的张量格式数据开始解决实际问题的,因此学习数据的预处理是十分必要且重要的。在Python常用的数据分析工具中,我们通常使用pandas软件包(pandas可以与张量兼容)。本文将简要介绍怎么用pandas预处理数据,并将原始数据转化为张量格式数据。
如果在阅读过程中各位大佬发现了问题,请直接在评论区指正。也希望一同学习深度学习的同学们能在评论区积极留言交流,互相学习进步。
一、读取数据集
首先我们人工创建一个数据集存放在csv文件里面,以其他格式存储的数据也可以通过类似的方式进行处理。创建数据集的代码如下。
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')
这里创建好的数据集会存储在一个python项目文件相同的data文件夹中,文件名称为house_tiny。
如果想要自行命名文件,可以通过对下图所示部位的修改来改变。
修改①处可以改变存储文件夹的名称,修改②处可以改变存储文件的名称。
要从创建的csv文件中加载原始数据集,我们导入pandas包并调用read_csv函数。该数据集有四行三列。其中每行描述了房间数量、巷子类型和房屋价格。没有安装过pandas的同学可以参照这篇文章来安装。学习深度学习前期准备
import pandas as pd
data = pd.read_csv(data_file)
print(data)
二、处理缺失值
在数据处理中“NaN”代表缺失值,为了处理缺失的数据,典型的方法包括插值法和删除法, 其中插值法用一个替代值弥补缺失值,而删除法则直接忽略缺失值。这里以插值法为例。
同各国iloc索引函数,我们将data分为input和output,前者是data的前两列,后者是data的第三列。我们用均值来代替同一列中的缺失值。(下图是书中源代码)
如果我们直接使用书中源代码,那么会出现如下报错
TypeError: can only concatenate str (not "int") to str
这是因为第二行识别为str,所以我们在mean()中加入限制条件——仅在数据类型为数值的列进行平均值插值。如下列代码。(这一部分借鉴了这位大佬的代码)动手学深度学习pytorch:inputs.fillna(inputs.mean())报错can only concatenate str (not “int“) to str_inputs = inputs.fillna(inputs.mean())-CSDN博客
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
inputs = inputs.fillna(inputs.mean(numeric_only = True))
print(inputs)
对于inputs中的离散值或类别值,我们将NaN视作一个类别。由于Alley只接收两种值——NaN或者Pave,pandas会将他们自动转化为两个类别:"Alley_Pave"和"Alley_NaN"。巷子行为类型为“Pave”的会将“Alley_Pav”的行为值设为1,将“Alley_NaN”行为值设为0。反之亦然。
inputs = pd.get_dummies(inputs, dummy_na=True)
print(inputs)
三、转化为张量格式
到了这一步,inputs和outputs中所有的条目都是数值类型。将他们转化为张量类型中后我们就可以使用之前所说的张量函数来进行进一步的操作。
import torch
X = torch.tensor(inputs.to_numpy(dtype=float))
Y = torch.tensor(outputs.to_numpy(dtype=float))
print(X)
print(Y)
结语
以上就是数据预处理部分的内容。
如果各位大佬在阅读过程中发现有错误的地方请在评论区留言指正。也希望各位同学能在评论区留言互相交流学习。