数据预处理
来自李沐老师b站课程,边学边敲代码,我主要是写书后面的习题
传概念一个人工数据集,并存储在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')
#从创建的csv文件中加载原始数据集
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]
inputs=inputs.fillna(inputs.mean())
print(inputs)
NumRooms Alley
0 3.0 Pave#数字的na取均值,字符串的不动
1 2.0 NaN
2 4.0 NaN
3 3.0 NaN
#对于inputs中的类别或离散值,我们将‘NAN’视为一个类别
inputs= pd.get_dummies(inputs,dummy_na=True)
print (inputs)
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
#inputs和outputs中所有条目都是**数值类型**,它们可以转换为*张量*格式
import torch
x,y=torch.tensor(inputs.values),torch.tensor(outputs.values)
x,y
(tensor([[3., 1., 0.],
[2., 0., 1.],
[4., 0., 1.],
[3., 0., 1.]], dtype=torch.float64),#传统python默认64位,但计算慢,深度学习32位
tensor([127500, 106000, 178100, 140000]))
reshape 和 view
a=torch.arange(12)
b=a.reshape((3,4))#b创建了a的view,指向同一个内存
b[:]=2
a
tensor([2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
tensor 和array的区别?
tensor:数学上的概念,张量
array:数组,计算机里的概念,没有数学上的定义
一个东西其实
前两节课的练习:
03
-
运行本节中的代码。将本节中的条件语句
X == Y
更改为X < Y
或X > Y
,然后看看你可以得到什么样的张量。答:改成<
x <y tensor([[ True, False, True, False], [False, False, False, False], [False, False, False, False]])
改成>
tensor([[False, False, False, False], [ True, True, True, True], [ True, True, True, True]])
-
用其他形状(例如三维张量)替换广播机制中按元素操作的两个张量。结果是否与预期相同?
a = torch.arange(6).reshape((3, 1, 2)) b = torch.arange(2).reshape((1, 2, 1)) a,b (tensor([[[0, 1]], [[2, 3]], [[4, 5]]]), tensor([[[0], [1]]])) a+b tensor([[[0, 1], [1, 2]], [[2, 3], [3, 4]], [[4, 5], [5, 6]]])
04
创建包含更多行和列的原始数据集。
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,beds\n')#列名
f.write('NA,Pave,127500,2\n')
f.write('2,NA,106000,4\n')
f.write('4,NA,178100,5\n')
f.write('NA,NA,140000,1\n')
f.write('2,NA,106000,1\n')
f.write('4,NA,178100,2\n')
f.write('NA,NA,140000,2\n')
f.write('2,NA,106000,3\n')
f.write('4,NA,178100,4\n')
f.write('NA,NA,140000,2\n')
-
删除缺失值最多的列。
import pandas as pd data= pd.read_csv(data_file) print(data) NumRooms Alley Price beds 0 NaN Pave 127500 2 1 2.0 NaN 106000 4 2 4.0 NaN 178100 5 3 NaN NaN 140000 1 4 2.0 NaN 106000 1 5 4.0 NaN 178100 2 6 NaN NaN 140000 2 7 2.0 NaN 106000 3 8 4.0 NaN 178100 4 9 NaN NaN 140000 2 data.isna().sum(axis=0)#isna查看缺失值 NumRooms 4 Alley 9 Price 0 beds 0 dtype: int64 可见alley列缺失值最多
使用pandas 里drop函数来删除行或列(默认删除行)
data.drop(['Alley'],axis=1,inplace=True)#注意列名外面要加‘’和[],inplace=true要写,不写不会改变dataframe data = data.fillna(data.mean())# 用均值处理 data NumRooms Price beds 0 3.0 127500 2 1 2.0 106000 4 2 4.0 178100 5 3 3.0 140000 1 4 2.0 106000 1 5 4.0 178100 2 6 3.0 140000 2 7 2.0 106000 3 8 4.0 178100 4 9 3.0 140000 2
-
将预处理后的数据集转换为张量格式。
fillna:
inplace参数的取值:True、False
True:直接修改原对象
False:创建一个副本,修改副本,原对象不变(缺省默认)
method参数的取值 : {‘pad’, ‘ffill’,‘backfill’, ‘bfill’, None}, default None
pad/ffill:用前一个非缺失值去填充该缺失值(第一个值为空就填不了第一个 )
backfill/bfill:用下一个非缺失值填充该缺失值(如果最后一个为空,那么填不了 )
None:指定一个值去替换缺失值(缺省默认这种方式)
print (torch.tensor(data.values))#转化为张量格式 tensor([[3.0000e+00, 1.2750e+05, 2.0000e+00], [2.0000e+00, 1.0600e+05, 4.0000e+00], [4.0000e+00, 1.7810e+05, 5.0000e+00], [3.0000e+00, 1.4000e+05, 1.0000e+00], [2.0000e+00, 1.0600e+05, 1.0000e+00], [4.0000e+00, 1.7810e+05, 2.0000e+00], [3.0000e+00, 1.4000e+05, 2.0000e+00], [2.0000e+00, 1.0600e+05, 3.0000e+00], [4.0000e+00, 1.7810e+05, 4.0000e+00], [3.0000e+00, 1.4000e+05, 2.0000e+00]], dtype=torch.float64)
.0000e+00, 1.4000e+05, 2.0000e+00],
[2.0000e+00, 1.0600e+05, 3.0000e+00],
[4.0000e+00, 1.7810e+05, 4.0000e+00],
[3.0000e+00, 1.4000e+05, 2.0000e+00]], dtype=torch.float64)
```