数据预处理
一、读取数据集
1、将数据集按行写入到csv文件中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | 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
函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | # 如果没有安装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” 项
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | # 将第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。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # 将字符串变为一个新的类别,产生新的列 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
中的所有条目都是数值类型,它们可以转换为张量格式
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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])) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!