在机器学习和深度学习任务中,数据预处理是至关重要的第一步。本文通过一个完整的示例,演示如何创建包含缺失值的数据集、处理不同类型的缺失值,并将数据转换为 PyTorch 张量,为后续模型训练奠定基础。
一、创建数据集并存储为 CSV 文件
我们首先人工创建一个包含缺失值的房屋数据集,并将其存储为 CSV 格式。CSV 文件因其通用性和易读性,是数据存储与交换的常用格式。
python
运行
import os
# 创建数据目录(若不存在)
os.makedirs(os.path.join('..', 'data'), exist_ok=True)
data_file = os.path.join('..', 'data', 'house_tiny.csv')
# 写入数据(每行包含特征和标签,NA表示缺失值)with open(data_file, 'w') as f:
f.write('NumRooms,Alley,Price\n') # 列名
f.write('NA,Pave,127500\n') # 样本1:房间数缺失,巷子类型为Pave
f.write('2,NA,106000\n') # 样本2:巷子类型缺失,房间数为2
f.write('4,NA,178100\n') # 样本3:巷子类型缺失,房间数为4
f.write('NA,NA,140000\n') # 样本4:房间数和巷子类型均缺失
关键点:
os.makedirs 的 exist_ok=True 避免重复创建目录导致的错误。
CSV 文件中用 NA 表示缺失值,后续会被 Pandas 自动识别为 NaN。
二、读取数据集并查看原始数据
使用 Pandas 的 read_csv 函数加载 CSV 文件,并打印原始数据以确认格式正确性。
python
运行
import pandas as pd
# 读取CSV文件为DataFrame
data = pd.read_csv(data_file)print("原始数据:")print(data)
输出结果:
plaintext
NumRooms Alley Price
0 NaN Pave 127500
1 2.0 NaN 106000
2 4.0 NaN 178100
3 NaN NaN 140000
关键点:
Pandas 自动将 NA 转换为 NaN(Not a Number),标识缺失值。
数据包含两类特征:
数值型特征:NumRooms(房间数)。
类别型特征:Alley(巷子类型,取值为Pave或缺失)。
标签:Price(房价)。
三、处理缺失值
缺失值处理是数据预处理的核心步骤之一,常见方法包括删除法和插值法。本例中采用插值法,针对不同类型的特征分别处理。
1. 数值型特征:均值填充法
python
运行
# 划分输入特征(前两列)和输出标签(最后一列)
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
# 用每列的均值填充数值型缺失值(NaN)
inputs = inputs.fillna(inputs.mean())print("数值型缺失值处理后:")print(inputs)
输出结果:
plaintext
NumRooms Alley
0 3.0 Pave
1 2.0 NaN
2 4.0 NaN
3 3.0 NaN
原理:
inputs.mean() 计算每列的均值(自动忽略 NaN)。
fillna 用均值填充对应列的缺失值。本例中,NumRooms 列的均值为 (2+4)/2=3,因此两个缺失值均被填充为 3.0。
2. 类别型特征:独热编码(含缺失值处理)
python
运行
# 将类别型特征转换为独热编码,缺失值(NaN)视为独立类别
inputs = pd.get_dummies(inputs, dummy_na=True)print("独热编码处理后:")print(inputs)
输出结果:
plaintext
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
原理:
pd.get_dummies 将类别列 Alley 转换为二进制列:
Alley_Pave=1 表示巷子类型为 Pave,Alley_nan=1 表示缺失值。
dummy_na=True 强制将缺失值编码为独立类别(否则会被忽略)。
四、转换为 PyTorch 张量
预处理后的特征和标签需转换为 PyTorch 张量,以便输入深度学习模型。
python
运行
import torch
# 将Pandas数据转换为NumPy数组,再转为PyTorch张量
X = torch.tensor(inputs.to_numpy(dtype=float))
y = torch.tensor(outputs.to_numpy(dtype=float))print("PyTorch张量:")print(X, y)
输出结果:
plaintext
tensor([[3., 1., 0.],
[2., 0., 1.],
[4., 0., 1.],
[3., 0., 1.]])
tensor([127500., 106000., 178100., 140000.])
关键点:
to_numpy(dtype=float) 确保数据类型为浮点数,避免 PyTorch 张量类型不匹配。
转换后的 X 为特征张量(形状为 (4, 3)),y 为标签张量(形状为 (4,)),可直接用于模型训练。
五、总结:数据预处理核心流程
数据创建与读取:通过 CSV 文件存储数据,利用 Pandas 解析为 DataFrame。
缺失值处理:
数值型特征:均值(或中位数、众数)填充。
类别型特征:独热编码,缺失值视为独立类别。
特征工程:将非数值型数据(如类别标签)转换为模型可识别的数值格式。
数据格式转换:将预处理后的 DataFrame 转换为 PyTorch 张量,适配深度学习框架。
通过这一流程,原始数据被清洗、转换为结构化的输入,为后续机器学习任务(如线性回归、神经网络)提供了可靠的基础。实际应用中,需根据数据特点选择合适的预处理策略(如高维类别特征可采用嵌入法,连续型特征可标准化 / 归一化),以优化模型性能。