二、预备知识—数据预处理

2.2.1 读取数据集

1.将数据集按行写入CSV文件中

import os
# os.makedirs参数说明
#   name:你想创建的目录名
#   mode:要为目录设置的权限数字模式,默认的模式为0o777()八进制).
#   exist_ok:是否在目录存在时触发异常。如果exist_ok为False(默认值),则在目标目录已存在的情况下触发FileExistsError异常;
#   如果exist ok为True,则在目标目录已存在的情况下不会触发FileExistsError异常。
os.makedirs(os.path.join(.., data), exist_ok=True)  # os.makedirs用来创建多层目录(单层请用os.mkdir)
data_file = os.path.join(.., data, house_tiny.csv)  # os.path.join()函数用于路径拼接文件路径,可以传入多个路径
with open(data_file, w, encoding=utf-8) as f:
    f.write(NumRooms,Alley,Price
)  # 列名
    f.write(NA,Pave,127500
)  # 每行表示一个数据样本
    f.write(2,NA,106000
)
    f.write(4,NA,178100
)
    f.write(NA,NA,140000
)

输出:

2.从创建的CSV文件中加载原始数据集,我们导入pandas包并调用read_csv函数。该数据集有四行三列。其中每行描述了房间数量(“NumRooms”)、巷子类型(“Alley”)和房屋价格(“Price”)

import pandas as pd
import os
import torch

data_file = os.path.join(.., data, house_tiny.csv)  # os.path.join()函数用于路径拼接文件路径,可以传入多个路径
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

2.2.3 处理缺失值

注意,“NaN”项代表缺失值。于inputs中缺少的数值,我们用同一列的均值替换“NaN”项

对比两图即可发现,左图的第二列NaN已被平均值3.0填充为右图

# 处理缺失值,典型的方法包括插值法和删除法, 其中插值法用一个替代值弥补缺失值,而删除法则直接忽略缺失值
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]  # 冒号在逗号前,后面的数值对应列;冒号在后,前面的数值对应行
inputs = inputs.fillna(inputs.mean())  # .fillna()用来填写空缺值,mean()函数求取均值
print(inputs)
inputs = pd.get_dummies(inputs, dummy_na=True)  # 是利用pandas实现one_hot_encode的方式
print(inputs)

对于inputs中的类别值或离散值,我们将“NaN”视为一个类别。 由于“巷子类型”(“Alley”)列只接受两种类型的类别值“Pave”和“NaN”, pandas可以自动将此列转换为两列“Alley_Pave”和“Alley_nan”。 巷子类型为“Pave”的行会将“Alley_Pave”的值设置为1,“Alley_nan”的值设置为0。 缺少巷子类型的行会将“Alley_Pave”和“Alley_nan”分别设置为0和1 输出:

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

2.2.4 转换张量格式

现在inputs和outputs中的所有条目都是数值类型,它们可以转换为张量格式。 当数据采用张量格式后,可以通过在预备知识—pytorch数据基本操作中引入的那些张量函数来进一步操作。

X, y = torch.tensor(inputs.values), torch.tensor(outputs.values)  # 现在inputs和outputs中的所有条目都是数值类型,将它们转换为张量格式
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])

2.2.5 小结

    pandas软件包是Python中常用的数据分析工具中,pandas可以与张量兼容。 用pandas处理缺失的数据时,我们可根据情况选择用插值法和删除法。
经验分享 程序员 微信小程序 职场和发展