2. 预备知识
2.2 数据预处理
用深度学习解决现实问题,要从预处理原始数据开始,而不是从张量格式数据开始。数据预处理经常使用pandas预处理原始数据,并将原始数据转换为张量格式。
2.2.1 读取数据集
总结:
我们常用pandas进行数据分析,pandas可以与张量兼容。
用pandas处理缺失数据,我们可以根据情况选择用插值法和删除法。
import os
import pandas as pd
import torch
# 创建一个人工数据集
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,nums,Alley,Price\n') # 列名
f.write('NA,1,Pave,127500\n') # 每行表示一个数据样本
f.write('2,1,NA,106000\n')
f.write('4,1,NA,178100\n')
f.write('NA,NA,NA,140000\n')
f.write('NA,NA,NA,140000\n')
f.write('NA,2,NA,140000\n')
f.write('NA,3,NA,140000\n')
data = pd.read_csv(data_file)
print(data) # 输出数据
# 处理缺失值,这里先用插值法,用同一列的均值替换NAN项
# 1.插值法
inputs = data.iloc[:, 0:4]
inputs = inputs.fillna(inputs.mean())
print(inputs)
# 对于inputs中的类被或离散值,我们讲NaN视为一个类别。由于Alley列只接受两种类型的类别值——Pave和NaN,pandas可以自动将此列转换为两列
# Alley_Pave和Alley_nan。类型为Pave的行会将Alley_Pave的值设置为1,Alley_nan的值设置为0,其余为0
inputs = pd.get_dummies(inputs, dummy_na=True)
print(inputs)
# 转换为张量格式
X = torch.tensor(inputs.values)
print(X)
# print(torch.cat((X,y),dim=1))
# print(Z)
NumRooms nums Alley Price
0 NaN 1.0 Pave 127500
1 2.0 1.0 NaN 106000
2 4.0 1.0 NaN 178100
3 NaN NaN NaN 140000
4 NaN NaN NaN 140000
5 NaN 2.0 NaN 140000
6 NaN 3.0 NaN 140000
NumRooms nums Alley Price
0 3.0 1.0 Pave 127500
1 2.0 1.0 NaN 106000
2 4.0 1.0 NaN 178100
3 3.0 1.6 NaN 140000
4 3.0 1.6 NaN 140000
5 3.0 2.0 NaN 140000
6 3.0 3.0 NaN 140000
NumRooms nums Price Alley_Pave Alley_nan
0 3.0 1.0 127500 1 0
1 2.0 1.0 106000 0 1
2 4.0 1.0 178100 0 1
3 3.0 1.6 140000 0 1
4 3.0 1.6 140000 0 1
5 3.0 2.0 140000 0 1
6 3.0 3.0 140000 0 1
tensor([[3.0000e+00, 1.0000e+00, 1.2750e+05, 1.0000e+00, 0.0000e+00],
[2.0000e+00, 1.0000e+00, 1.0600e+05, 0.0000e+00, 1.0000e+00],
[4.0000e+00, 1.0000e+00, 1.7810e+05, 0.0000e+00, 1.0000e+00],
[3.0000e+00, 1.6000e+00, 1.4000e+05, 0.0000e+00, 1.0000e+00],
[3.0000e+00, 1.6000e+00, 1.4000e+05, 0.0000e+00, 1.0000e+00],
[3.0000e+00, 2.0000e+00, 1.4000e+05, 0.0000e+00, 1.0000e+00],
[3.0000e+00, 3.0000e+00, 1.4000e+05, 0.0000e+00, 1.0000e+00]],
dtype=torch.float64)
#######################################################################
# 2.删除法
data = pd.read_csv(data_file)
# 统计每列的NANs数目
nan_number = data.isnull().sum(axis=0)
# 找到nan_number(series)中最大数的索引
nan_max_id = nan_number.idxmax()
# 删除NAN最大的列
data = data.drop([nan_max_id], axis=1)
print(data)
# 转换为张量格式
data = torch.tensor(data.values)
print(data)
NumRooms nums Price
0 NaN 1.0 127500
1 2.0 1.0 106000
2 4.0 1.0 178100
3 NaN NaN 140000
4 NaN NaN 140000
5 NaN 2.0 140000
6 NaN 3.0 140000
tensor([[ nan, 1.0000e+00, 1.2750e+05],
[2.0000e+00, 1.0000e+00, 1.0600e+05],
[4.0000e+00, 1.0000e+00, 1.7810e+05],
[ nan, nan, 1.4000e+05],
[ nan, nan, 1.4000e+05],
[ nan, 2.0000e+00, 1.4000e+05],
[ nan, 3.0000e+00, 1.4000e+05]], dtype=torch.float64)