动手学深度学习day1(第二章:数据预处理)

数据预处理:
读取数据集:

 

import os
import pandas as pd

# os.makedirs(...): 创建一个新目录。如果目录的各级父目录不存在,则同时创建这些父目录。
# exist_ok=True: 如果目录已经存在,则不会抛出异常,而是正常继续执行。
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:
# 这里的数据包含缺失值(用NA表示)。
    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')

# data = pd.read_csv(data_file): 使用Pandas的read_csv函数读取之前创建的CSV文件,并将内容加载到一个DataFrame对象中。
# DataFrame是Pandas中的一种数据结构,用于以表格形式存储和操作结构化数据
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”项代表缺失值。为了处理缺失的数据,典型的方法包括插值法和删除法,其中插值法用一个替代值弥补缺失值,而删除法则直接忽略缺失值。
插值法:


# 这行代码尝试用每列的均值来填充inputs DataFrame中的缺失值(NA)。fillna函数用于填充缺失值,
# 而inputs.mean(numeric_only=True)计算inputs中所有数值型列的均值。
inputs,outputs = data.iloc[:,0:2],data.iloc[:,2]       # 位置索引iloc

# 由于Alley列很可能包含非数值型数据,正确的做法可能是仅对数值型列(如NumRooms)应用均值填充,
# 或者对Alley列使用不同的缺失值处理策略(如填充为最常见的类别或保留为缺失)。
inputs = inputs.fillna(inputs.mean(numeric_only=True))
print(inputs)


# inputs = pd.get_dummies(inputs,dummy_na=True,dtype=int):这行代码使用pd.get_dummies函数将inputs DataFrame中的分类变量(在这个例子中,Alley列)转换为哑变量(独热编码)。
# dummy_na=True参数指示函数为缺失值(NA)也创建一个哑变量。dtype=int参数指定输出DataFrame的数据类型为整数。
# “巷子类型”(“Alley”)列只接受两种类型的类别值“Pave”和“NaN”, pandas可以自动将此列转换为两列“Alley_Pave”和“Alley_nan”。巷子类型为“Pave”的行会将“Alley_Pave”的值设置为1,“Alley_nan”的值设置为0。
inputs = pd.get_dummies(inputs,dummy_na=True,dtype=int)
print(inputs)


输出结果:
  NumRooms Alley
0       3.0  Pave
1       2.0   NaN
2       4.0   NaN
3       3.0   NaN
   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

删除值:

import pandas as pd  
import torch  
import os  
  
os.makedirs(os.path.join('..', 'data'), exist_ok=True)  
data_file = os.path.join('..', 'data', 'house_tiny_2.csv')  
with open(data_file, 'w') as f:  
    f.write("Alley,NumRooms,Price\n")  
    f.write("NA,NA,100\n")  
    f.write("Pave,3,3000\n")  
    f.write("NA,NA,900\n")  
    f.write("Pave,6,400\n")  
  
# 读取 CSV 文件,并将 'NA' 字符串转换为 NaN  
data = pd.read_csv(data_file, na_values=['NA'])  
print("原始数据:")  
print(data)  
  
# 删除包含缺失值的行  
data_cleaned = data.dropna()  
print("\n删除缺失值后的数据:")  
print(data_cleaned)  
  
# 现在可以从清理后的数据中分离 inputs 和 outputs  
inputs_cleaned, outputs_cleaned = data_cleaned.iloc[:, 0:2], data_cleaned.iloc[:, 2]  
  
# 对 inputs_cleaned 应用 one-hot 编码(注意此时不再需要 fillna,因为已经删除了缺失值)  
inputs_encoded = pd.get_dummies(inputs_cleaned, dummy_na=True, dtype=int)  
  
# 转换为 PyTorch Tensor  
x = torch.tensor(inputs_encoded.to_numpy(dtype=float))  
y = torch.tensor(outputs_cleaned.to_numpy(dtype=float))  
  
print("\n转换为 PyTorch Tensor 后的数据:")  
print(x)  
print(y)

转化为张量格式:
 

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

输出结果:
(tensor([[3., 1., 0.],
[2., 0., 1.],
[4., 0., 1.],
[3., 0., 1.]], dtype=torch.float64),
tensor([127500., 106000., 178100., 140000.], dtype=torch.float64))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值