《动手学深度学习 Pytorch版》 2.2 数据预处理
2.2.1 读取数据集
import os
import pandas as pd
import torch
创建一个人工数据集并存储在CSV文件../data/house_tiny.csv中。
调用 read_csv 函数读出该文件
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,Prince\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)
data
| NumRooms | Alley | Prince | |
|---|---|---|---|
| 0 | NaN | Pave | 127500 | 
| 1 | 2.0 | NaN | 106000 | 
| 2 | 4.0 | NaN | 178100 | 
| 3 | NaN | NaN | 140000 | 
2.2.2 处理缺失值
通过位置索引 iloc 将 data 分成 inputs(前两列)和 outputs(后一列),并使用列均值替代 NaN 项。
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
inputs = inputs.fillna(inputs.mean())
inputs
| NumRooms | Alley | |
|---|---|---|
| 0 | 3.0 | Pave | 
| 1 | 2.0 | NaN | 
| 2 | 4.0 | NaN | 
| 3 | 3.0 | NaN | 
将类型值或离散值的 NaN 视为一个类别,可将 Alley 列分解成 Alley_Pava 和 Alley_nan 两列。
inputs = pd.get_dummies(inputs, dummy_na=True)
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 | 
2.2.3 转换为张量格式
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]))
练习
# 整个更多数据的表
data_file2 = os.path.join('..', 'data', 'test_c2.csv')
with open(data_file2, 'w') as f:
    f.write('col0,col1,col2\n') # 列名
    f.write('1,Pave,127500\n') # 每行表示一个数据样本
    f.write('2,NA,106000\n')
    f.write('4,NA,178100\n')
    f.write('3,NA,NA\n')
    f.write('5,NA,140000\n')
    f.write('NA,NA,NA\n')
    f.write('9,NA,140000\n')
    f.write('7,NA,NA\n')
    f.write('9,NA,140000\n')
    f.write('3,NA,140000\n')
data = pd.read_csv(data_file2)
data
| col0 | col1 | col2 | |
|---|---|---|---|
| 0 | 1.0 | Pave | 127500.0 | 
| 1 | 2.0 | NaN | 106000.0 | 
| 2 | 4.0 | NaN | 178100.0 | 
| 3 | 3.0 | NaN | NaN | 
| 4 | 5.0 | NaN | 140000.0 | 
| 5 | NaN | NaN | NaN | 
| 6 | 9.0 | NaN | 140000.0 | 
| 7 | 7.0 | NaN | NaN | 
| 8 | 9.0 | NaN | 140000.0 | 
| 9 | 3.0 | NaN | 140000.0 | 
(1)删除缺失值最多的列
调用 isnull 函数判断哪些值为缺失值,再调用 sum 函数求和,最后调用 idxmax 获取其中的最大值列的索引
data.isnull(), data.isnull().sum(), data.isnull().sum().idxmax() # 得到缺失值最多列的索引
(    col0   col1   col2
 0  False  False  False
 1  False   True  False
 2  False   True  False
 3  False   True   True
 4  False   True  False
 5   True   True   True
 6  False   True  False
 7  False   True   True
 8  False   True  False
 9  False   True  False,
 col0    1
 col1    9
 col2    3
 dtype: int64,
 'col1')
data = data.drop(data.isnull().sum().idxmax(), axis=1) # 删除
data
| col0 | col2 | |
|---|---|---|
| 0 | 1.0 | 127500.0 | 
| 1 | 2.0 | 106000.0 | 
| 2 | 4.0 | 178100.0 | 
| 3 | 3.0 | NaN | 
| 4 | 5.0 | 140000.0 | 
| 5 | NaN | NaN | 
| 6 | 9.0 | 140000.0 | 
| 7 | 7.0 | NaN | 
| 8 | 9.0 | 140000.0 | 
| 9 | 3.0 | 140000.0 | 
(2)处理剩余缺失值后转换为张量格式
data = data.fillna(data.mean())
data
| col0 | col2 | |
|---|---|---|
| 0 | 1.000000 | 127500.0 | 
| 1 | 2.000000 | 106000.0 | 
| 2 | 4.000000 | 178100.0 | 
| 3 | 3.000000 | 138800.0 | 
| 4 | 5.000000 | 140000.0 | 
| 5 | 4.777778 | 138800.0 | 
| 6 | 9.000000 | 140000.0 | 
| 7 | 7.000000 | 138800.0 | 
| 8 | 9.000000 | 140000.0 | 
| 9 | 3.000000 | 140000.0 | 
Y = torch.tensor(data.values)
Y
tensor([[1.0000e+00, 1.2750e+05],
        [2.0000e+00, 1.0600e+05],
        [4.0000e+00, 1.7810e+05],
        [3.0000e+00, 1.3880e+05],
        [5.0000e+00, 1.4000e+05],
        [4.7778e+00, 1.3880e+05],
        [9.0000e+00, 1.4000e+05],
        [7.0000e+00, 1.3880e+05],
        [9.0000e+00, 1.4000e+05],
        [3.0000e+00, 1.4000e+05]], dtype=torch.float64)
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号