数据预处理
一、读取数据集
1、将数据集按行写入到csv文件中
import os # os.path.join():路径拼接函数,本例中会生成如下路径 ../data # os.makedirs():用来创建多层目录(多层就是深度),exist_ok=True是在目录已存在的情况下不报错,默认为False,目录要是存在会报错 os.makedirs(os.path.join('..', 'data'), exist_ok=True) # 新创建目录 ../data/house_tiny.csv data_file = os.path.join('..', 'data', 'house_tiny.csv') #house_tiny.csv 文件名 ''' 常见的文件读写操作 with open(r'filename.txt') as f: data_user=pd.read_csv(f) #文件的读操作 with open('data.txt', 'w') as f: f.write('hello world') #文件的写操作 ''' with open(data_file, 'w') as f: f.write('NumRooms,Alley,Price\n') # 列名 房间数目 巷子类型 房屋价格 f.write('NA,Pave,127500\n') # 每行表示一个数据样本 NA-未知 f.write('2,NA,106000\n') f.write('4,NA,178100\n') f.write('NA,NA,140000\n')
2、从创建的csv文件中加载原始数据集,导入 pandas
包并调用 read_csv
函数
# 如果没有安装pandas,只需取消对以下行的注释: # !pip install pandas 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
二、处理缺失值
NaN代表缺失值,处理缺失的数据,典型的方法包括插值和删除。插值用替代值代替缺失值,删除则忽略缺失值
1、通过位置索引iloc,我们可以将data分成inputs和outputs。其中前者为 data
的前两列,后者为 data
的最后一列。
2、对于 inputs
中缺少的数值,我们用同一列的均值替换 “NaN” 项
# 将第0列和第1列拿出来放在 inputs 中,将第2列拿出来放在 outputs 里面 inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2] print(inputs) #print(outputs) # 将NaN中的值用该列的均值填充-但是ALLey列因为不是数值,所以不能不均值填充 inputs = inputs.fillna(inputs.mean()) print(inputs) #输出结果 NumRooms Alley 0 NaN Pave 1 2.0 NaN 2 4.0 NaN 3 NaN NaN NumRooms Alley 0 3.0 Pave 1 2.0 NaN 2 4.0 NaN 3 3.0 NaN
3、将离散型特征的每一种取值都看成一种状态,若你的这一特征中有N个不相同的取值,那么我们就可以将该特征抽象成N种不同的状态
由于 “巷子”(“Alley”)列只接受两种类型的类别值 “Pave” 和 “NaN”,pandas
可以自动将此列转换为两列 “Alley_Pave” 和 “Alley_nan”。巷子类型为 “Pave” 的行会将“Alley_Pave”的值设置为1,“Alley_nan”的值设置为0。缺少巷子类型的行会将“Alley_Pave”和“Alley_nan”分别设置为0和1。
# 将字符串变为一个新的类别,产生新的列 inputs = pd.get_dummies(inputs, dummy_na=True) print(inputs) # 可以发现 inputs 不是tensor类型 print(type(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 <class 'pandas.core.frame.DataFrame'>
三、转换为张量格式
现在 inputs
和 outputs
中的所有条目都是数值类型,它们可以转换为张量格式
import torch # 直接将inputs和outputs转化为张量格式 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), tensor([127500, 106000, 178100, 140000]))