使用pandas软件包预处理原始数据,它可以与张量兼容。
读取数据集
创建一个人工数据集,将数据集按行写入CSV(逗号分隔值)文件中。以其他格式存储的数据也可以通过类似的方式进行处理。
import os
# os.makedirs(os.path.join('..','data'),exist_ok=True)#创建../data目录
# data_file=os.path.join('..','data','house_tiny.csv')#创建../data/house_tiny.csv文件
os.makedirs(os.path.join('data'),exist_ok=True)#在当前文件夹创建data目录
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的读写操作:【Python杂项】with open() as f的用法_with open as f用法-CSDN博客
导入pandas包并调用read_csv函数,来从创建的CSV文件中加载原始数据集。
# 如果没有安装pandas,只需取消对以下行的注释来安装pandas
# !pip install pandas
import pandas as pd
data = pd.read_csv(data_file)
print(data)
处理缺失值
“NaN”代表缺失值
处理缺失数据的典型方法包括插值法和删除法:
-
插值法(fillna):用一个替代值弥补缺失值
用同一列的均值替换上文中的“NaN”项。
#通过索引iloc将data分为inputs(data的前两列)和outputs(最后一列)
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
#编译器识别inputs.mean()为str,无法进行数值平均计算
inputs = inputs.fillna(inputs.mean())
print(inputs)
以上会报错 TypeError: can only concatenate str (not "int") to str,解决方法如下:
#解决方法1:先选择数据类型再进行求平均值
inputs = inputs.fillna(inputs.select_dtypes(include='number').mean())
#解决方法2:限制仅在数值类型为数值的列进行平均值插值
inputs = inputs.fillna(inputs.mean(numeric_only=True))
-
删除法(dropna):直接忽略缺失值
inputs1 = inputs.dropna()#丢失缺失值,删除缺失值所在行(axis=0)或列(axis=1),默认为axis=0
inputs2 = inputs.dropna(axis=1)#删除所在列
print(inputs1)
print(inputs2)
在inputs中“Alley”列有“Pave”和“NaN”两个类别值,pandas可以调用get_dummies()自动将此列转换为两列“Alley_Pave”和“Alley_nan”。对应的类别值存在则设置为True,否则为False。
设置参数dummy_na=true(默认为False),使NaN被视为一个类别值。
#inputs=pd.get_dummies(inputs,dummy_na=True)#新拆分的两列默认输出bool值
inputs=pd.get_dummies(inputs,dummy_na=True,dtype=int)#指定输出类型为int,即输出0或1
print(inputs)
输出bool值:
输出0/1:
get_dummies()具体参数可查看pandas.get_dummies — pandas 2.2.1 文档 (pydata.org)
转换为张量格式
inputs和outputs中所有条目都是数值类型,可将它们转换为张量格式,便可以使用2.1节中的张量函数进行操作。
import torch
X=torch.tensor(inputs.to_numpy(dtype=float))
y=torch.tensor(outputs.to_numpy(dtype=float))
print(X)
print(y)
#结果
#tensor([[3., 1., 0.],
# [2., 0., 1.],
# [4., 0., 1.],
# [3., 0., 1.]], dtype=torch.float64)
#tensor([127500., 106000., 178100., 140000.], dtype=torch.float64)