2.2 数据预处理

发布时间 2023-05-23 18:10:00作者: AncilunKiang

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)