动手学深度学习(pytorch)学习记录2-数据预处理[学习记录]

注:本代码在jupyter notebook上运行

读取数据集

创建人工数据集,存储在CSV(逗号分隔符)文件中 将数据按行写入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')

加载原始数据集,有四行三列,描述了房间数量、巷子类型、房屋价格

import pandas as pd
data = pd.read_csv(data_file)
print(data)

输出结果:
在这里插入图片描述

处理缺失值

通过位置索引iloc,将data分成inputs和outputs

inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
inputs = inputs.fillna(inputs.mean()) # 插值法,用同一列的均值替换NaN
print(inputs)

报错
TypeError: can only concatenate str (not “int”) to str

解决办法:
在 mean() 函数中添加 numeric_only=True
原理解释:
在Pandas库中,mean() 函数是一个常用的统计函数,用于计算数据的平均值。inputs.mean()操作中,则Pandas会尝试将所有数据转换为数值型以便计算平均值。对于无法转换为数值型的数据(如字符串或日期等),这将导致错误。因此,在包含多种数据类型的数据集上使用时,设置 numeric_only=True 可以避免这类错误,确保函数能够正确执行。
在 mean() 函数中添加 numeric_only=True 参数时,这个参数的作用是控制函数在计算平均值时是否仅考虑数值型(numeric)数据。

# 更改代码
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
inputs = inputs.fillna(inputs.mean(numeric_only=True)) # 插值法,用同一列的均值替换NaN
print(inputs)

输出结果:
在这里插入图片描述
pd.get_dummies(inputs, dummy_na=True) 将分类变量(categorical variables)转换为虚拟/指示变量(dummy/indicator variables) Alley列只接受两种类型的类别值“Pave”和“NaN”, pandas可以自动将此列转换为两列“Alley_Pave”和“Alley_nan”

inputs = pd.get_dummies(inputs, dummy_na=True)
print(inputs)

在这里插入图片描述

import pandas as pd  
  
# 创建一个包含分类变量的 DataFrame  
data = pd.DataFrame({  
    'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', pd.NA],  
    'B': ['one', 'one', 'two', pd.NA, 'two', 'two', 'one'],  
    'C': [1, 2, 3, 4, 5, 6, 7],  
})  
  
# 使用 pd.get_dummies 转换 DataFrame  
dummies = pd.get_dummies(data, dummy_na=True)  
  
print(dummies)

转化为张量格式

import torch

X = torch.tensor(inputs.to_numpy(dtype=float))
y = torch.tensor(outputs.to_numpy(dtype=float))
X, y

输出结果
在这里插入图片描述

练习:

创建包含更多行和列的原始数据

删除缺失值最多的列

将预处理后的数据集转化为张量格式

data_file = os.path.join('.', 'data', 'test.csv') # 目标文件地址
with open(data_file, 'w') as f:
    f.write('品名,产地,净含量,价格\n')  # 列名 
    f.write('矿泉水,湖里,550, 10\n')  # 每行表示一个数据样本
    f.write('矿,山里,湖里, NA\n')
    f.write('矿泉水,NA,550, 10\n')
    f.write('矿泉水,NA,550, 10\n')
    f.write('矿泉水,湖里,550, 10\n')
import pandas as pd  
# 注意:read_csv函数默认将'NA'视为NaN  
df = pd.read_csv('./data/test.csv', na_values=['NA'])  
  
# 计算每列的缺失值数量  
missing_values_count = df.isnull().sum()  
  
# 找到缺失值最多的列  
column_with_most_missing = missing_values_count.idxmax()  
  
# 删除该列  
df_cleaned = df.drop(column_with_most_missing, axis=1)  
  
# 显示清理后的DataFrame  
print(df_cleaned)  
  
# 将清理后的DataFrame保存回CSV文件  
df_cleaned.to_csv('./data/test1.csv', index=False)

报错:UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xc3 in position 2: invalid continuation byte

在这里插入代码片
# 查了一下,原来中文要用utf-8编码 在open函数中加入编码信息
with open(data_file, 'w', encoding='utf8') as f:
    f.write('品名,产地,净含量,价格\n')  # 列名 
    f.write('矿泉水,湖里,550, 10\n')  # 每行表示一个数据样本
    f.write('矿,山里,湖里, NA\n')
    f.write('矿泉水,NA,550, 10\n')
    f.write('矿泉水,NA,550, 10\n')
    f.write('矿泉水,湖里,550, 10\n')
import pandas as pd  
# 注意:read_csv函数默认将'NA'视为NaN  
df = pd.read_csv('./data/test.csv', na_values=['NA'])  
  
# 计算每列的缺失值数量  
missing_values_count = df.isnull().sum()  
  
# 找到缺失值最多的列  
column_with_most_missing = missing_values_count.idxmax()  
  
# 删除该列  
df_cleaned = df.drop(column_with_most_missing, axis=1)  
  
# 显示清理后的DataFrame  
print(df_cleaned)  
  
# 将清理后的DataFrame保存回CSV文件  
df_cleaned.to_csv('./data/test1.csv', index=False)

运行完成,删除了产地那一列
在这里插入图片描述

inputs = pd.get_dummies(df_cleaned, dummy_na=True)
print(inputs)

在这里插入图片描述

# 转换成张量格式
X = torch.tensor(inputs.to_numpy(dtype=float))
X

输出结果
在这里插入图片描述
本人学习地址https://zh-v2.d2l.ai/
欢迎探讨交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

walfar

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值