沐神《动手学深度学习》数据预处理
一、预处理的作用
为了能用深度学习来解决现实世界的问题,我们经常从预处理原始数据开始,而不是从那些准备好的张量格式数据开始。
输入:
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)
更多推荐



所有评论(0)