Pytorch预备知识——数据预处理

Pytorch预备知识------数据预处理

原文链接:数据预处理 --- 动手学深度学习

pandas官方文档:pandas.pydata.org/

为了能够利用深度学习来解决问题,第一步往往是对原始数据进行处理,将原始数据转为张量格式。

本文主要介绍深度学习中对于数据的一些简单预处理操作,主要包括从原始数据集(csv文件)中提取出数据,并对数据进行清洗、转化为张量格式,以便于深度学习中的模型进行读取

本文中主要是用pandas来进行数据预处理,pandas提供了许多简单、有效的方法来帮助我们处理数据,如下文所示

读取数据集

方法 :pd.read_csv(文件名称)

作用 :加载原始数据集

实例:

py 复制代码
# 读取csv数据集之前,先利用python创建一个简单的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,col1,col2,col3,Price\n')  # 列名
    f.write('NA,Pave,NA,NA,245274,127500\n')  # 每行表示一个数据样本
    f.write('2,NA,1541,NA,45,106000\n')
    f.write('4,NA,NA,415,554,178100\n')
    f.write('NA,NA,NA,15,54154,140000\n')
py 复制代码
import pandas as pd

data = pd.read_csv(data_file)
print(data)
py 复制代码
# 输出结果
   NumRooms Alley    col1   col2    col3   Price
0       NaN  Pave     NaN    NaN  245274  127500
1       2.0   NaN  1541.0    NaN      45  106000
2       4.0   NaN     NaN  415.0     554  178100
3       NaN   NaN     NaN   15.0   54154  140000

处理缺失值

原始数据中的NaN项代表缺失值。 为了处理缺失的数据,典型的方法包括插值法删除法, 其中插值法用一个替代值弥补缺失值,而删除法则直接忽略缺失值

方法1 :data.fillna(value)

参数 :value表示用于填充缺失值的值

作用 :能够使用指定的方法填充NA/NaN值
方法2 :pd.get_dummies(inputs, dummy_na=True)

参数 :inputs表示要处理的数据,dummy_na是否要为原始数据中的缺失值(NaN)创建一个虚拟变量列

作用 :用于将分类变量转换为虚拟变量(dummy variables),也叫做独热编码(one-hot encoding)

实例:

py 复制代码
# 处理数据之前,先将input和output分离出来
# 在该数据集中,input代表着除了最后一列price的其他列的数据
# output代表最后一列的price
# 利用iloc方法和切片和索引操作来构造input和output
# 基本用法:dataframe.iloc[row_indices, column_indices]
inputs, outputs = data.iloc[:,0:-1], data.iloc[:,5]
print(inputs)
py 复制代码
   NumRooms Alley    col1   col2    col3
0       NaN  Pave     NaN    NaN  245274
1       2.0   NaN  1541.0    NaN      45
2       4.0   NaN     NaN  415.0     554
3       NaN   NaN     NaN   15.0   54154
py 复制代码
inputs = inputs.fillna(inputs.mean())
inputs = pd.get_dummies(inputs, dummy_na = True)
print(inputs)
py 复制代码
# 由结果可知,col1、col2和col3中的NaN被换成了改列的平均值
# 原来的Alley列由于具有两个变量值,故被分为了两个新列
   NumRooms    col1   col2    col3  Alley_Pave  Alley_nan
0       3.0  1541.0  215.0  245274           1          0
1       2.0  1541.0  215.0      45           0          1
2       4.0  1541.0  415.0     554           0          1
3       3.0  1541.0   15.0   54154           0          1

转换为张量格式

现在inputsoutputs中的所有条目都是数值类型,它们可以转换为张量格式

py 复制代码
import torch
x = torch.tensor(inputs.to_numpy(dtype=float))
y = torch.tensor(outputs.to_numpy(dtype=float))
# inputs是DataFrame类型的数据结构,类似于表格,是包含了行和列的数据
# DataFrame结构需要先转化为NumPy数组,进而才能继续转化为张量类型
x,y
py 复制代码
(tensor([[3.0000e+00, 1.5410e+03, 2.1500e+02, 2.4527e+05, 1.0000e+00, 0.0000e+00],
         [2.0000e+00, 1.5410e+03, 2.1500e+02, 4.5000e+01, 0.0000e+00, 1.0000e+00],
         [4.0000e+00, 1.5410e+03, 4.1500e+02, 5.5400e+02, 0.0000e+00, 1.0000e+00],
         [3.0000e+00, 1.5410e+03, 1.5000e+01, 5.4154e+04, 0.0000e+00, 1.0000e+00]],
        dtype=torch.float64),
 tensor([127500., 106000., 178100., 140000.], dtype=torch.float64))

一些其他方法

方法1 :data.isna()

作用 :它返回一个与原始 DataFrame 具有相同形状的布尔值 DataFrame,其中每个元素都表示对应位置是否为缺失值(NaN)。如果某个位置的数据是缺失值,则对应位置的布尔值为 True,否则为 False
方法2 :series.idxmax()

作用 :用于查找具有最大值的元素所在的索引(位置)。这个方法通常用于查找 Series(类似于数组or列表的数据结构) 中最大值的索引,以便进一步分析或处理数据
方法3 :data.drop(labels, axis=1, inplace=False)

参数 :data 是要操作的 Pandas DataFrame,labels 是要删除的行或列的标签,axis是一个可选参数,用于指定删除的方向

作用 :用于删除指定的行或列,返回一个新的 DataFrame

用上述方法实现删除inputs中含有NaN最多的列

py 复制代码
# 去除NA(缺失值)最多的列
missing_value_counts = inputs.isna().sum()
print(missing_value_counts)
# 找到具有最多缺失值的列名
column_with_most_missing_values = missing_value_counts.idxmax()
print(column_with_most_missing_values)
# 删除具有最多缺失值的列
inputs = inputs.drop(column_with_most_missing_values, axis=1)

print(inputs)
py 复制代码
# 操作前
   NumRooms Alley    col1   col2    col3
0       NaN  Pave     NaN    NaN  245274
1       2.0   NaN  1541.0    NaN      45
2       4.0   NaN     NaN  415.0     554
3       NaN   NaN     NaN   15.0   54154
py 复制代码
NumRooms    2
Alley       3
col1        3
col2        2
col3        0
dtype: int64

Alley

   NumRooms    col1   col2    col3
0       NaN     NaN    NaN  245274
1       2.0  1541.0    NaN      45
2       4.0     NaN  415.0     554
3       NaN     NaN   15.0   54154
相关推荐
xiaoshiguang33 小时前
LeetCode:222.完全二叉树节点的数量
算法·leetcode
爱吃西瓜的小菜鸡3 小时前
【C语言】判断回文
c语言·学习·算法
别NULL3 小时前
机试题——疯长的草
数据结构·c++·算法
TT哇3 小时前
*【每日一题 提高题】[蓝桥杯 2022 国 A] 选素数
java·算法·蓝桥杯
yuanbenshidiaos5 小时前
C++----------函数的调用机制
java·c++·算法
唐叔在学习5 小时前
【唐叔学算法】第21天:超越比较-计数排序、桶排序与基数排序的Java实践及性能剖析
数据结构·算法·排序算法
ALISHENGYA5 小时前
全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之分支结构(switch语句)
数据结构·算法
chengooooooo5 小时前
代码随想录训练营第二十七天| 贪心理论基础 455.分发饼干 376. 摆动序列 53. 最大子序和
算法·leetcode·职场和发展
jackiendsc5 小时前
Java的垃圾回收机制介绍、工作原理、算法及分析调优
java·开发语言·算法
游是水里的游6 小时前
【算法day20】回溯:子集与全排列问题
算法