数据预处理:
读取数据集:
import os
import pandas as pd
# os.makedirs(...): 创建一个新目录。如果目录的各级父目录不存在,则同时创建这些父目录。
# exist_ok=True: 如果目录已经存在,则不会抛出异常,而是正常继续执行。
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:
# 这里的数据包含缺失值(用NA表示)。
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')
# data = pd.read_csv(data_file): 使用Pandas的read_csv函数读取之前创建的CSV文件,并将内容加载到一个DataFrame对象中。
# DataFrame是Pandas中的一种数据结构,用于以表格形式存储和操作结构化数据
data = pd.read_csv(data_file)
print(data)
输出结果:
NumRooms Alley Price
0 NaN Pave 127500
1 2.0 NaN 106000
2 4.0 NaN 178100
3 NaN NaN 140000
处理缺失数据:
NaN”项代表缺失值。为了处理缺失的数据,典型的方法包括插值法和删除法,其中插值法用一个替代值弥补缺失值,而删除法则直接忽略缺失值。
插值法:
# 这行代码尝试用每列的均值来填充inputs DataFrame中的缺失值(NA)。fillna函数用于填充缺失值,
# 而inputs.mean(numeric_only=True)计算inputs中所有数值型列的均值。
inputs,outputs = data.iloc[:,0:2],data.iloc[:,2] # 位置索引iloc
# 由于Alley列很可能包含非数值型数据,正确的做法可能是仅对数值型列(如NumRooms)应用均值填充,
# 或者对Alley列使用不同的缺失值处理策略(如填充为最常见的类别或保留为缺失)。
inputs = inputs.fillna(inputs.mean(numeric_only=True))
print(inputs)
# inputs = pd.get_dummies(inputs,dummy_na=True,dtype=int):这行代码使用pd.get_dummies函数将inputs DataFrame中的分类变量(在这个例子中,Alley列)转换为哑变量(独热编码)。
# dummy_na=True参数指示函数为缺失值(NA)也创建一个哑变量。dtype=int参数指定输出DataFrame的数据类型为整数。
# “巷子类型”(“Alley”)列只接受两种类型的类别值“Pave”和“NaN”, pandas可以自动将此列转换为两列“Alley_Pave”和“Alley_nan”。巷子类型为“Pave”的行会将“Alley_Pave”的值设置为1,“Alley_nan”的值设置为0。
inputs = pd.get_dummies(inputs,dummy_na=True,dtype=int)
print(inputs)
输出结果:
NumRooms Alley
0 3.0 Pave
1 2.0 NaN
2 4.0 NaN
3 3.0 NaN
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
删除值:
import pandas as pd
import torch
import os
os.makedirs(os.path.join('..', 'data'), exist_ok=True)
data_file = os.path.join('..', 'data', 'house_tiny_2.csv')
with open(data_file, 'w') as f:
f.write("Alley,NumRooms,Price\n")
f.write("NA,NA,100\n")
f.write("Pave,3,3000\n")
f.write("NA,NA,900\n")
f.write("Pave,6,400\n")
# 读取 CSV 文件,并将 'NA' 字符串转换为 NaN
data = pd.read_csv(data_file, na_values=['NA'])
print("原始数据:")
print(data)
# 删除包含缺失值的行
data_cleaned = data.dropna()
print("\n删除缺失值后的数据:")
print(data_cleaned)
# 现在可以从清理后的数据中分离 inputs 和 outputs
inputs_cleaned, outputs_cleaned = data_cleaned.iloc[:, 0:2], data_cleaned.iloc[:, 2]
# 对 inputs_cleaned 应用 one-hot 编码(注意此时不再需要 fillna,因为已经删除了缺失值)
inputs_encoded = pd.get_dummies(inputs_cleaned, dummy_na=True, dtype=int)
# 转换为 PyTorch Tensor
x = torch.tensor(inputs_encoded.to_numpy(dtype=float))
y = torch.tensor(outputs_cleaned.to_numpy(dtype=float))
print("\n转换为 PyTorch Tensor 后的数据:")
print(x)
print(y)
转化为张量格式:
import torch
X = torch.tensor(inputs.to_numpy(dtype=float))
y = torch.tensor(outputs.to_numpy(dtype=float))
X, 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))