2.2 Предобработка данных
Чтобы использовать глубокое обучение для решения задач реального мира, мы часто начинаем с предобработки исходных данных, а не с уже готовых данных в формате тензоров.
Из инструментов анализа данных в Python обычно используют пакет pandas.
Как и многие другие расширения обширной экосистемы Python, pandas умеет работать с тензорами.
В этом разделе мы кратко покажем, как предобработать исходные данные с помощью pandas и как преобразовать их в формат тензоров.
В последующих главах будут описаны и другие методы предобработки данных.
2.2.1 Чтение набора данных
Для примера мы сначала создадим искусственный набор данных и сохраним его в CSV-файл ../data/house_tiny.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')
Чтобы загрузить исходный набор данных из созданного CSV-файла, импортируем пакет pandas и вызовем функцию read_csv.
В этом наборе данных четыре строки и три столбца.
Каждая строка описывает количество комнат («NumRooms»), тип переулка («Alley») и цену дома («Price»).
# Если pandas не установлен, достаточно раскомментировать следующие строки, чтобы его установить
# !pip install pandas
import pandas as pd
data = pd.read_csv(data_file)
print(data)
2.2.2 Обработка пропущенных значений
Обратите внимание: значения «NaN» обозначают пропущенные данные. Для обработки пропущенных данных обычно применяют импутацию (заполнение пропусков) и удаление, где импутация заменяет пропущенное значение подходящим значением, а удаление просто игнорирует пропущенные значения. Здесь мы рассмотрим импутацию.
С помощью индексации по позиции iloc разделим data на inputs и outputs: первые — это два первых столбца data, а вторые — последний столбец.
Пропущенные числовые значения в inputs мы заменим средним значением того столбца, в котором они находятся.
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
inputs = inputs.fillna(inputs.mean())
print(inputs)
Для категориальных или дискретных значений в inputs мы будем считать «NaN» отдельной категорией.
Поскольку столбец «Alley» принимает только два категориальных значения «Pave» и «NaN», pandas может автоматически преобразовать его в два столбца «Alley_Pave» и «Alley_nan».
Строка, в которой тип переулка «Pave», получит в столбце «Alley_Pave» значение 1, а в столбце «Alley_nan» — значение 0.
Строка без типа переулка получит в «Alley_Pave» значение 0, а в «Alley_nan» — значение 1.
inputs = pd.get_dummies(inputs, dummy_na=True)
print(inputs)
2.2.3 Преобразование в формат тензора
Теперь все элементы inputs и outputs имеют числовой тип, и их можно преобразовать в тензоры.
Когда данные представлены в формате тензоров, их можно обрабатывать с помощью функций для тензоров, которые были введены в разделе 2.1.
MXNet:
from mxnet import np
X, y = np.array(inputs.to_numpy(dtype=float)), np.array(outputs.to_numpy(dtype=float))
X, y
PyTorch:
import torch
X = torch.tensor(inputs.to_numpy(dtype=float))
y = torch.tensor(outputs.to_numpy(dtype=float))
X, y
TensorFlow:
import tensorflow as tf
X = tf.constant(inputs.to_numpy(dtype=float))
y = tf.constant(outputs.to_numpy(dtype=float))
X, y
PaddlePaddle:
import warnings
warnings.filterwarnings(action='ignore')
import paddle
X, y = paddle.to_tensor(inputs.values), paddle.to_tensor(outputs.values)
X, y
Резюме
- Пакет
pandas— распространённый в Python инструмент анализа данных, и он совместим с тензорами. - При работе с пропущенными данными в
pandasмы в зависимости от ситуации выбираем импутацию или удаление.
Упражнения
Создайте исходный набор данных с большим количеством строк и столбцов.
- Удалите столбец, в котором больше всего пропущенных значений.
- Преобразуйте предобработанный набор данных в формат тензоров.
MXNet: Обсуждение
PyTorch: Обсуждение
TensorFlow: Обсуждение
PaddlePaddle: Обсуждение