跟着李沐学AI 【04 数据操作+数据预处理】
记录和处理在跟着学习时发生的一些问题
一、 数据操作实现
这块没什么难点,跟着打并理解就行了
import torch
x = torch.arange(12)
x.shape
x.numel() #标量的总数
X = x.reshape(3,4) #改变张量的形状而不是改变元素的数量和值的大小
torch.zeros((2,3,4)) #可构建元素为全一、全零或其他常量
torch.tensor([[2,1,4,3],[1,2,3,4],[4,3,2,1]]).shape #为张量中的每个元素赋值
x = torch.tensor([1.0,2,4,8])
y = torch.tensor([2,2,2,2])
x+y, x-y, x*y, x/y, x**y # **是求幂运算
#可将多个张量连接起来
X = torch.arange(12,dtype=torch.float32).reshape((3,4))
Y = torch.tensor([[2.0,1.4,3],[1,2,3,4],[4,3,2,1]])
torch.cat((X,Y),dim=0) #行合并
torch.cat((X,Y),dim=1) #列合并
#对张量中所有元素进行求和会产生只有一个元素的张量
X.sum()
#即使形状不同,仍可调用广播机制来执行元素操作
a = torch.arange(3).reshape((3,1))
b = torch.arange(2).reshape((1,2))
a+b
X[-1], X[1:3] #可以用[-1]来选择最后一行的元素,[1:3]选择第二第三行的元素
X[1,2] = 9 #制定索引将元素写入矩阵
X[0:2 , :] = 12 #为多个元素赋值(第一行、第二行)
#运行一些操作可能会导致为新结果分配内存
before = id(X)
X += Y
id(X) == before
#转换为numpy张量
A = X.numpy()
B = torch.tensor(A)
type(A),type(B)
#将大小为1的张量变为python标量
a = torch.tensor([3.5])
a , a.item , float(a) , int(a)
结果就不一一贴出了,应该没问题的哈
二、 数据预处理实现
这块地方会时不时出现一些小问题,好在都解决了,稍微记录一下。
1、 创建一个人工数据集,并存储在csv文件中
import os
os.makedirs(os.path.join('..','data'),exist_ok=True)
data_file = os.path.join('..','data','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')
这个地方会报错如下所示:
处理方法为,将前两行代码中的 '..' 改为 '.' ,如下所示
os.makedirs(os.path.join('.','data'),exist_ok=True)
data_file = os.path.join('.','data','house_tiny.csv')
2、 从创建的csv文件中加载原始数据集
import pandas as pd
data = pd.read_csv(data_file)
print(data)
需要引入pandas来读取csv文件并加载数据集,打印的情况如下所示:
倘若是直接输出data将会以excel表格的形式打印数据集,更美观
3、 处理缺失的数据,可以考虑插值(或删除)
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
inputs = inputs.fillna(inputs.mean())
print(inputs)
在这里会发生报错:
需要对inputs进行处理,代码改为
inputs = inputs.fillna(inputs.mean(numeric_only = True))
就没有问题啦,能成功处理inputs中缺失的数据,插入inputs原来未缺失数据的平均值
4、 对类别值或离散值,将"NaN"视为一个类别
inputs = pd.get_dummies(inputs, dummy_na=True)
print(inputs)
若就这样输出,得到的结果将如下所示:
Alley_Pave 与Alley_nan 的值是True与False,在后续将csv文件转为张量时会由于类型不匹配而报错,因此需要对inputs的第二、三列进行处理改变数据类型
inputs = pd.get_dummies(inputs, dummy_na=True)
inputs.iloc[:,1:] = inputs.iloc[:,1:].astype(int)
从而得到的inputs如下所示:
可以进行下一步啦!
5、 将csv文件转为张量
import torch
X,y = torch.tensor(inputs.values),torch.tensor(outputs.values)
X,y
转换以后的结果为