Pytorch预备知识------数据预处理
原文链接:数据预处理 --- 动手学深度学习
pandas官方文档:pandas.pydata.org/
为了能够利用深度学习来解决问题,第一步往往是对原始数据进行处理,将原始数据转为张量格式。
本文主要介绍深度学习中对于数据的一些简单预处理操作,主要包括从原始数据集(csv文件)中提取出数据,并对数据进行清洗、转化为张量格式,以便于深度学习中的模型进行读取
本文中主要是用pandas来进行数据预处理,pandas提供了许多简单、有效的方法来帮助我们处理数据,如下文所示
读取数据集
方法 :
pd.read_csv(文件名称)
作用 :
加载原始数据集
实例:
py
# 读取csv数据集之前,先利用python创建一个简单的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,col1,col2,col3,Price\n') # 列名
f.write('NA,Pave,NA,NA,245274,127500\n') # 每行表示一个数据样本
f.write('2,NA,1541,NA,45,106000\n')
f.write('4,NA,NA,415,554,178100\n')
f.write('NA,NA,NA,15,54154,140000\n')
py
import pandas as pd
data = pd.read_csv(data_file)
print(data)
py
# 输出结果
NumRooms Alley col1 col2 col3 Price
0 NaN Pave NaN NaN 245274 127500
1 2.0 NaN 1541.0 NaN 45 106000
2 4.0 NaN NaN 415.0 554 178100
3 NaN NaN NaN 15.0 54154 140000
处理缺失值
原始数据中的NaN项代表缺失值。 为了处理缺失的数据,典型的方法包括插值法 和删除法, 其中插值法用一个替代值弥补缺失值,而删除法则直接忽略缺失值
方法1 :
data.fillna(value)
参数 :
value表示用于填充缺失值的值
作用 :
能够使用指定的方法填充NA/NaN值
方法2 :pd.get_dummies(inputs, dummy_na=True)
参数 :
inputs表示要处理的数据,dummy_na是否要为原始数据中的缺失值(NaN)创建一个虚拟变量列
作用 :
用于将分类变量转换为虚拟变量(dummy variables),也叫做独热编码(one-hot encoding)
实例:
py
# 处理数据之前,先将input和output分离出来
# 在该数据集中,input代表着除了最后一列price的其他列的数据
# output代表最后一列的price
# 利用iloc方法和切片和索引操作来构造input和output
# 基本用法:dataframe.iloc[row_indices, column_indices]
inputs, outputs = data.iloc[:,0:-1], data.iloc[:,5]
print(inputs)
py
NumRooms Alley col1 col2 col3
0 NaN Pave NaN NaN 245274
1 2.0 NaN 1541.0 NaN 45
2 4.0 NaN NaN 415.0 554
3 NaN NaN NaN 15.0 54154
py
inputs = inputs.fillna(inputs.mean())
inputs = pd.get_dummies(inputs, dummy_na = True)
print(inputs)
py
# 由结果可知,col1、col2和col3中的NaN被换成了改列的平均值
# 原来的Alley列由于具有两个变量值,故被分为了两个新列
NumRooms col1 col2 col3 Alley_Pave Alley_nan
0 3.0 1541.0 215.0 245274 1 0
1 2.0 1541.0 215.0 45 0 1
2 4.0 1541.0 415.0 554 0 1
3 3.0 1541.0 15.0 54154 0 1
转换为张量格式
现在inputs
和outputs
中的所有条目都是数值类型,它们可以转换为张量格式
py
import torch
x = torch.tensor(inputs.to_numpy(dtype=float))
y = torch.tensor(outputs.to_numpy(dtype=float))
# inputs是DataFrame类型的数据结构,类似于表格,是包含了行和列的数据
# DataFrame结构需要先转化为NumPy数组,进而才能继续转化为张量类型
x,y
py
(tensor([[3.0000e+00, 1.5410e+03, 2.1500e+02, 2.4527e+05, 1.0000e+00, 0.0000e+00],
[2.0000e+00, 1.5410e+03, 2.1500e+02, 4.5000e+01, 0.0000e+00, 1.0000e+00],
[4.0000e+00, 1.5410e+03, 4.1500e+02, 5.5400e+02, 0.0000e+00, 1.0000e+00],
[3.0000e+00, 1.5410e+03, 1.5000e+01, 5.4154e+04, 0.0000e+00, 1.0000e+00]],
dtype=torch.float64),
tensor([127500., 106000., 178100., 140000.], dtype=torch.float64))
一些其他方法
方法1 :
data.isna()
作用 :
它返回一个与原始 DataFrame 具有相同形状的布尔值 DataFrame,其中每个元素都表示对应位置是否为缺失值(NaN)。如果某个位置的数据是缺失值,则对应位置的布尔值为 True,否则为 False
方法2 :series.idxmax()
作用 :
用于查找具有最大值的元素所在的索引(位置)。这个方法通常用于查找 Series(类似于数组or列表的数据结构) 中最大值的索引,以便进一步分析或处理数据
方法3 :data.drop(labels, axis=1, inplace=False)
参数 :
data 是要操作的 Pandas DataFrame,labels 是要删除的行或列的标签,axis是一个可选参数,用于指定删除的方向
作用 :
用于删除指定的行或列,返回一个新的 DataFrame
用上述方法实现删除inputs中含有NaN最多的列
py
# 去除NA(缺失值)最多的列
missing_value_counts = inputs.isna().sum()
print(missing_value_counts)
# 找到具有最多缺失值的列名
column_with_most_missing_values = missing_value_counts.idxmax()
print(column_with_most_missing_values)
# 删除具有最多缺失值的列
inputs = inputs.drop(column_with_most_missing_values, axis=1)
print(inputs)
py
# 操作前
NumRooms Alley col1 col2 col3
0 NaN Pave NaN NaN 245274
1 2.0 NaN 1541.0 NaN 45
2 4.0 NaN NaN 415.0 554
3 NaN NaN NaN 15.0 54154
py
NumRooms 2
Alley 3
col1 3
col2 2
col3 0
dtype: int64
Alley
NumRooms col1 col2 col3
0 NaN NaN NaN 245274
1 2.0 1541.0 NaN 45
2 4.0 NaN 415.0 554
3 NaN NaN 15.0 54154