一、预处理的作用

        为了能用深度学习来解决现实世界的问题,我们经常从预处理原始数据开始,而不是从那些准备好的张量格式数据开始。
输入:
    NumRooms Alley   Price
0       NaN  Pave  127500
1       2.0   NaN  106000
2       4.0   NaN  178100
3       NaN   NaN  140000

        上面表的内容是房子的数量,以及是否铺路,以及铺路的价格。通过接下来的转化 ,可以把它变成tensor多维数组类型,这样计算机就可以看懂了。

输出:Num All pri
tensor([[3., 1., 0.],
            [2., 0., 1.],
            [4., 0., 1.],
            [3., 0., 1.]], dtype=torch.float64)
tensor([127500., 106000., 178100., 140000.], dtype=torch.float64)

二、创建文件夹

文件夹名字和路径可以和作者的不一样

os.makedirs(os.path.join('data2.2'), exist_ok=True)
#在我的上一级文件夹里创建一个叫做'data2.2'的新文件夹
# 把这两部分路径连接起来,变成 '../data2.2'
#如果这个文件夹已经存在了,不要报错

data_file = os.path.join('data2.2', 'house_tiny.csv')
#这行代码定义了我们即将创建的文件的完整路径和名称。
#它会把路径连接起来,形成 '../data/house_tiny.csv'
#所以这个文件将会被保存在上一级目录的data文件夹中,文件名叫"house_tiny.csv"

三、处理数据

3.1 写入文件

with open(data_file, 'w') as f:
#打开(或创建)我们刚才指定的文件,准备写入内容('w'表示写入模式) 

#后面每一行 f.write(...) 都是在向文件中写入一行内容
    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) 读取文件
print(data)

读取效果

   NumRooms   Alley     Price
0       NaN       Pave   127500
1       2.0         NaN    106000
2       4.0         NaN    178100
3       NaN       NaN    140000

3.2 把price数据分离

inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
# 这行代码把数据分成两部分,前两列作为输入特征inputs,第三列作为输出目标outputs,":"表示所有行

3.3 处理NumRooms数据

inputs = inputs.fillna(inputs.mean())
这部分是书上的代码,但是在.py文件中运行会报错“can only concatenate str (not "int") to str”,空值和数字不能相加。

我稍微修改了下代码:

numeric_cols = inputs.select_dtypes(include=['number']).columns#处理数值列 (NumRooms)
inputs[numeric_cols] = inputs[numeric_cols].fillna(inputs[numeric_cols].mean())
#把空值和数字分开,让数字求平均值,然后再把平均值付给空值
#inputs.mean()是求每一列平均值,fillna()找到所有空值,Na换成平均值

print(inputs)
输出结果:
   NumRooms  Alley
0       3.0        Pave
1       2.0        NaN
2       4.0        NaN
3       3.0        NaN

3.4 处理Alley数据

inputs = pd.get_dummies(inputs, dummy_na=True)
#get_dummies将文字类型的数据转换成数字格式,让计算机能够理解和处理。
#用一个简单的例子来解释:把Alley改成Alley_Na和Alley_pave如果有这个值,设置成1,没有设置成0
#dummy_na=True不要忽略空白值,也为空白值创建一个新的列

输出结果
#       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

3.5 最终处理结果

最后再把数据转化成为tensor类型。

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)

完整代码

import os
import pandas as pd
import torch

os.makedirs(os.path.join('data2.2'), exist_ok=True)
data_file = os.path.join('data2.2', 'house_tiny.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')


data = pd.read_csv(data_file)#pandas调用read_csv函数
print(data)

inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]


numeric_cols = inputs.select_dtypes(include=['number']).columns#处理数值列 (NumRooms)
inputs[numeric_cols] = inputs[numeric_cols].fillna(inputs[numeric_cols].mean())
print(inputs)

inputs = pd.get_dummies(inputs, dummy_na=True)

print(inputs)

X = torch.tensor(inputs.to_numpy(dtype=float))
y = torch.tensor(outputs.to_numpy(dtype=float))
print(X)
print(y)

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐