目录

数据预处理        

处理缺失值NaN

转换为张量格式


数据预处理        

        当利用深度学习来解决现实世界的问题时,我们需要预处理原始数据,并将原始数据转换为张量格式。在 Python 中常用的数据分析工具中,通常使用 pandas 软件包,它与张量的数据格式兼容。以下为使用 pandas 案例:

        首先创建一个人工数据集,并存储在CSV(逗号分隔值)文件 house_tiny.csv 中。 以其他格式存储的数据也可以通过类似的方式进行处理。 

import os

# 递归创建 ../data 目录。
os.makedirs(os.path.join('..', 'data'), exist_ok=True)
# os.path.join('..', 'data'):
# '..':表示上一级目录(父目录), 'data' 表示当前目录下的 data 文件夹。
# os.path.join是 Python 的 os.path 模块中的一个函数,用于将多个路径组件连接成一个完整的路径。
# 故该语句作用是生成路径 ../data

# os.makedirs(path, mode=0o777, exist_ok=False):
# os.makedirs 是 Python 的 os 模块中的一个函数,用于递归创建目录。
# path 填入目标路径。mode表示权限,默认为0o777,即最大权限。

# exist_ok:True:若目录已存在,不报错。
#          False(默认):若目录已存在,会抛出 FileExistsError 异常。

# 定义文件路径,文件完整路径为 ../data/house_tiny.csv 
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')          # ...
# with open(data_file, 'w') as f::以写入模式打开文件,并确保文件在使用后正确关闭。
# f.write:向文件中写入内容。
# 第一行写入列名,后续每行写入一个数据样本,其中 NA 表示缺失值。

import pandas as pd # 导入pandas库

# 使用pandas的read_csv函数来读取CSV文件。
# data_file是CSV文件的路径。读取后的数据会被存储在data变量中。
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

        “NaN”项代表缺失值,处理缺失数据的典型方法包括 插值法 和 删除法 。前者使用一个替代值来代替 NaN ;后者直接将 NaN 忽略。这里用插值法举例:

import pandas as pd

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

# 分割数据
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
# iloc可以选择行、列索引,[] 内部的 ':' 代表全部选中,[x : y]表示选中 x 到 y-1。
# inputs 包含数据的前两列(NumRooms 和 Alley),而 outputs 含最后一列(Price)。

# 插值法处理缺失值
inputs = inputs.fillna(inputs.mean())
# inputs.mean() 会计算出 数值列 的平均值。mean() 对于非数值数据没有意义。
# 对于 数值列 fillna() 会用 mean() 计算的平均值替换掉列中的 NaN 值。
# 对于 非数值列 将保持原样,不会被填充。

print(inputs)
#    NumRooms Alley
# 0       3.0  Pave
# 1       2.0   NaN
# 2       4.0   NaN
# 3       3.0   NaN

# 处理 离散/类别 值
inputs = pd.get_dummies(inputs, dummy_na=True)
# 原始数据中 Alley 列只有 Pave 和 NaN。
# pd.get_dummies() 方法用于将分类变量转换为哑变量(dummy variables)。
# 参数 inputs 表示数据,必填项。
# 参数 dummy_na=True 表示将缺失值(NaN)也视为一个单独的类别,选填项。

print(inputs)
# 最后 Alley 被转换为两列:Alley_Pave 和 Alley_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

转换为张量格式

        经过以上步骤,house_tiny.csv 中除了第一行元素为名称,其他所有行的元素都是数值类型,可以转换为张量格式。

import torch

# .to_numpy() 可以将 inputs 转换为 NumPy 数组,且会忽略掉 行、列索引 信息。
# torch.tensor(...) 将 NumPy 数组转换为 PyTorch 张量,并指定数据类型为 float。
X = torch.tensor(inputs.to_numpy(dtype=float))
y = torch.tensor(outputs.to_numpy(dtype=float))

# X = tensor([[3., 1., 0.],
#             [2., 0., 1.],
#             [4., 0., 1.],
#             [3., 0., 1.]], dtype=torch.float64)
# y = tensor([127500., 106000., 178100., 140000.], dtype=torch.float64)

        现在,我们可以用上篇文章中的知识对张量进行操作了!

        【动手学深度学习】1.1 预备知识 基于pytorch的数据操作-CSDN博客

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐