Skip to content

数据预处理

🕒 Published at:

1.首先创建一个人工数据集,并存储在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,RoofType,Price
NA,NA,127500
2,NA,106000
4,Slate,178100
NA,NA,140000''')

import pandas as pd

data = pd.read_csv(data_file)
print(data)
  • os.path.join('..', 'data'):构造一个路径../data(../表示上一级目录)
  • os.makedirs(..., exist_ok=True):如果目录../data不存在就创建它,如果已经存在,不会报错
  • data_file是最终的文件路径,等于../data/house_tiny.csv
  • with open(data_file,'w') as f: 以只写模式打开文件
  • f.write(...)是写入一段CSV格式的数据内容
  • pd.read_csv(data_file)读取刚写入的CSV文件,转换成Pandas的DataFrame结构(表格形式)
  • Pandas会自动把'NA'识别为缺失值(NaN)
NumRooms RoofType   Price
0       NaN      NaN  127500
1       2.0      NaN  106000
2       4.0    Slate  178100
3       NaN      NaN  140000

2.将输入数据中的类别特征转换为数值形式,同时也保留缺失值NaN作为一个类别

inputs, targets = data.iloc[:, 0:2], data.iloc[:, 2]
inputs = pd.get_dummies(inputs, dummy_na=True)
print(inputs)
  • data.iloc[:, 0:2] 取前2列作为输入
  • ata.iloc[:, 2] 取第三列Price作为目标(要预测的值)
  • pd.get_dummies()是Pandas提供的一个函数,将类别特征(字符串或者有限数值等)转换成one-hot编码(独热编码),dummy_na=True表示把缺失值(NaN)也当做一个类别处理
NumRooms  RoofType_Slate  RoofType_nan
0       NaN           False          True
1       2.0           False          True
2       4.0            True         False
3       NaN           False          True

3.对数据进行缺失值填补(插值)

inputs = inputs.fillna(inputs.mean())
print(inputs)
  • inputs.mean()会计算每一列的平均值,但是只对数值型数据有效
  • fillna(...)把缺失值用列的均值替代
   NumRooms  RoofType_Slate  RoofType_nan
0       3.0           False          True
1       2.0           False          True
2       4.0            True         False
3       3.0           False          True

4.转换成PyTorch的张量,方便送入模型训练

import torch

X = torch.tensor(inputs.to_numpy(dtype=float))
y = torch.tensor(targets.to_numpy(dtype=float))
X, y
  • 把Pandas的DataFrame转换成Numpy数组
  • 再从Numpy转换成PyTorch张量
  • 指定数据类型为浮点型,因为神经网络通常都用浮点数来处理
(tensor([[nan, 0., 1.],
         [2., 0., 1.],
         [4., 1., 0.],
         [nan, 0., 1.]], dtype=torch.float64),
 tensor([127500., 106000., 178100., 140000.], dtype=torch.float64))