简单的数据预处理(pytorch)
读取数据集
创建一个简单的CSV文件,并使用Python中的Pandas库加载并读取这个文件的数据
-
创建CSV文件并写入数据:
import os os.makedirs(os.path.join('..', 'data'), exist_ok=True) # 创建文件夹路径 data_file = os.path.join('..', 'data', 'house_tiny.csv') # 指定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')
- 这段代码首先创建了一个新的目录(如果不存在的话),然后在该目录下创建了一个名为
house_tiny.csv
的文件。 - 文件内容包括三列:
NumRooms
(房间数),Alley
(巷子类型),和Price
(房价)。共写入了4行数据。
- 这段代码首先创建了一个新的目录(如果不存在的话),然后在该目录下创建了一个名为
-
读取CSV文件:
import pandas as pd data = pd.read_csv(data_file) # 使用Pandas读取CSV文件 print(data) # 打印读取的数据
pandas
是一个强大的数据分析库,read_csv
是其提供的用于读取CSV文件的函数。- 读取后的数据以DataFrame的形式存储并打印出来。
-
输出结果:
- 读取数据后,你会得到如下表格形式的输出:
NumRooms Alley Price 0 NaN Pave 127500 1 2.0 NaN 106000 2 4.0 NaN 178100 3 NaN NaN 140000
- 其中,
NaN
表示缺失值。
- 读取数据后,你会得到如下表格形式的输出:
这个例子展示了如何创建一个简单的数据集,保存为CSV文件并使用Pandas读取它。这样的技术在数据科学和机器学习领域非常常见,用于准备和探索数据。
处理缺失值
处理数据中的缺失值,并将类别数据转换为适合模型训练的形式。
# 分割数据为输入和输出部分
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2] # inputs包含前两列,outputs包含最后一列
# 处理数值列中的缺失值,用该列的均值填充
numeric_inputs = inputs.select_dtypes(include=['float64', 'int64']) # 选择数值列
numeric_inputs = numeric_inputs.fillna(numeric_inputs.mean()) # 使用均值填充数值列中的NaN值
# 处理类别数据的缺失值并进行独热编码
categorical_inputs = inputs.select_dtypes(exclude=['float64', 'int64']) # 选择非数值列
categorical_inputs = pd.get_dummies(categorical_inputs, dummy_na=True) # 使用独热编码处理类别列,并将NaN视为一个类别
# 将数值列和处理后的类别列合并
inputs = pd.concat([numeric_inputs, categorical_inputs], axis=1)
print("\nProcessed Inputs:\n", inputs) # 打印处理后的输入数据
转化为张量
经过处理的inputs
和outputs
数据转换为PyTorch张量,以便在后续的操作中使用PyTorch的张量操作。
-
转换数据为NumPy数组:
inputs.to_numpy(dtype=float)
和outputs.to_numpy(dtype=float)
将Pandas DataFrame中的数据转换为NumPy数组,同时确保数据类型为float
。
-
将NumPy数组转换为PyTorch张量:
torch.tensor(inputs.to_numpy(dtype=float))
和torch.tensor(outputs.to_numpy(dtype=float))
将NumPy数组转换为PyTorch的张量(tensor
),从而使这些数据可以被PyTorch进一步操作。
以下是完整的代码:
import torch
# 将inputs和outputs数据转换为NumPy数组,并转换为PyTorch张量
X = torch.tensor(inputs.to_numpy(dtype=float))
y = torch.tensor(outputs.to_numpy(dtype=float))
# 打印输出张量
print(X)
print(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)
解释:
X
是输入数据转换后的张量,包含房间数(NumRooms
)、巷子类型Alley_Pave
和Alley_nan
的one-hot编码结果。y
是输出数据转换后的张量,包含房价Price
。
完整代码
import os
import pandas as pd
# 创建文件夹并写入CSV文件
os.makedirs(os.path.join('..', 'data'), exist_ok=True) # 创建保存数据的目录
data_file = os.path.join('..', 'data', 'house_tiny.csv') # 指定CSV文件的路径
with open(data_file, 'w') as f: # 打开文件进行写操作
f.write('NumRooms,Alley,Price\n') # 写入列名
f.write('NA,Pave,127500\n') # 写入数据行1
f.write('2,NA,106000\n') # 写入数据行2
f.write('4,NA,178100\n') # 写入数据行3
f.write('NA,NA,140000\n') # 写入数据行4
# 读取CSV文件
data = pd.read_csv(data_file) # 使用Pandas读取CSV文件
print("Original Data:\n", data) # 打印原始数据
# 分割数据为输入和输出部分
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
# inputs包含前两列,outputs包含最后一列
# 处理数值列中的缺失值,用该列的均值填充
numeric_inputs = inputs.select_dtypes(include=['float64', 'int64'])
# 选择数值列
numeric_inputs = numeric_inputs.fillna(numeric_inputs.mean())
# 使用均值填充数值列中的NaN值
# 处理类别数据的缺失值并进行独热编码
categorical_inputs = inputs.select_dtypes(exclude=['float64', 'int64'])
# 选择非数值列
categorical_inputs = pd.get_dummies(categorical_inputs, dummy_na=True)
# 使用独热编码处理类别列,并将NaN视为一个类别
# 将数值列和处理后的类别列合并
inputs = pd.concat([numeric_inputs, categorical_inputs], axis=1)
print("\nProcessed Inputs:\n", inputs) # 打印处理后的输入数据
import torch
# 将inputs和outputs数据转换为NumPy数组,并转换为PyTorch张量
X = torch.tensor(inputs.to_numpy(dtype=float))
y = torch.tensor(outputs.to_numpy(dtype=float))
# 打印输出张量
print(X)
print(y)