数据预处理的简单案例,包括读取数据、通过插值方法处理数据缺失值。
代码实现
创建数据集
创建一个人工数据集,并存储在csv(逗号分隔值)文件。
1 2 3 4 5 6 7 8 9 10
| 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')
|
加载数据集
从创建的csv文件中加载原始数据集。
1 2 3 4
| import pandas as pd
data = pd.read_csv(data_file) print(data)
|
1 2 3 4 5
| NumRooms Alley Price 0 NaN Pave 127500 1 2.0 NaN 106000 2 4.0 NaN 178100 3 NaN NaN 140000
|
缺失数据处理
为了处理缺失的数据,典型的方法包括插值和删除。
删除的操作虽然简单,但会减少宝贵的数据,因此最好选择插值。这里,我们就使用插值。
我们取出表格的前两列作为输入值,第三列为输出值。
首先,对于输入值中属于数值的数据,为所有NaN的数据赋均值。
1 2 3
| inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2] inputs = inputs.fillna(inputs.mean()) print(inputs)
|
1 2 3 4 5
| NumRooms Alley 0 3.0 Pave 1 2.0 NaN 2 4.0 NaN 3 3.0 NaN
|
对于输入值中的类别值,我们将“NaN”视为一个类别赋值。
如上述表格的Alley
表项,如果值为Pave
,就赋为1,否则为0。
1 2
| inputs = pd.get_dummies(inputs, dummy_na=True) print(inputs)
|
1 2 3 4 5
| NumRooms Alley_Pave Alley_nan 0 3.0 1 0 1 2.0 0 1 2 4.0 0 1 3 3.0 0 1
|
现在输入值和输出值中所有条目都为数值类型,就可以转换为张量形式了。
1 2 3 4
| import torch
X, y = torch.tensor(inputs.values), torch.tensor(outputs.values) X, y
|
1 2 3 4 5
| (tensor([[3., 1., 0.], [2., 0., 1.], [4., 0., 1.], [3., 0., 1.]], dtype=torch.float64), tensor([127500, 106000, 178100, 140000]))
|