2.2. Pré-processamento de Dados
Open the notebook in Colab
Open the notebook in Colab
Open the notebook in Colab
Open the notebook in SageMaker Studio Lab

Até agora, introduzimos uma variedade de técnicas para manipular dados que já estão armazenados em tensores. Para aplicar o Deep Learning na solução de problemas do mundo real, frequentemente começamos com o pré-processamento de dados brutos, em vez daqueles dados bem preparados no formato tensor. Entre as ferramentas analíticas de dados populares em Python, o pacote pandas é comumente usado. Como muitos outros pacotes de extensão no vasto ecossistema do Python, pandas podem trabalhar em conjunto com tensores. Então, vamos percorrer brevemente as etapas de pré-processamento de dados brutos com pandas e convertendo-os no formato tensor. Abordaremos mais técnicas de pré-processamento de dados em capítulos posteriores.

2.2.1. Lendo o Dataset

Como um exemplo, começamos criando um conjunto de dados artificial que é armazenado em um arquivo csv (valores separados por vírgula) ../ data / house_tiny.csv. Dados armazenados em outro formatos podem ser processados de maneiras semelhantes.

Abaixo, escrevemos o conjunto de dados linha por linha em um arquivo 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')  # Column names
    f.write('NA,Pave,127500\n')  # Each row represents a data example
    f.write('2,NA,106000\n')
    f.write('4,NA,178100\n')
    f.write('NA,NA,140000\n')

Para carregar o conjunto de dados bruto do arquivo csv criado, importamos o pacote pandas e chamamos a funçãoread_csv. Este conjunto de dados tem quatro linhas e três colunas, onde cada linha descreve o número de quartos (“NumRooms”), o tipo de beco (“Alley”) e o preço (“Price”) de uma casa.

# Se o pandas ainda não estiver instalado descomente a linha abaixo:
# !pip install pandas
import pandas as pd

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
# Se o pandas ainda não estiver instalado descomente a linha abaixo:
# !pip install pandas
import pandas as pd

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
# Se o pandas ainda não estiver instalado descomente a linha abaixo:
# !pip install pandas
import pandas as pd

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

2.2.2. Lidando com Dados Faltantes

Observe que as entradas “NaN” têm valores ausentes. Para lidar com dados perdidos, os métodos típicos incluem imputação e exclusão, onde a imputação substitui os valores ausentes por outros substituídos, enquanto a exclusão ignora os valores ausentes. Aqui, consideraremos a imputação.

Por indexação baseada em localização de inteiros (iloc), dividimos os dados em entradas e saídas, onde o primeiro leva as duas primeiras colunas, enquanto o último mantém apenas a última coluna. Para valores numéricos em entradas que estão faltando, nós substituímos as entradas “NaN” pelo valor médio da mesma coluna.

inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
inputs = inputs.fillna(inputs.mean())
print(inputs)
   NumRooms Alley
0       3.0  Pave
1       2.0   NaN
2       4.0   NaN
3       3.0   NaN
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
inputs = inputs.fillna(inputs.mean())
print(inputs)
   NumRooms Alley
0       3.0  Pave
1       2.0   NaN
2       4.0   NaN
3       3.0   NaN
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
inputs = inputs.fillna(inputs.mean())
print(inputs)
   NumRooms Alley
0       3.0  Pave
1       2.0   NaN
2       4.0   NaN
3       3.0   NaN

Para valores categóricos ou discretos em entradas, consideramos “NaN” como uma categoria. Como a coluna “Alley” aceita apenas dois tipos de valores categóricos “Pave” e “NaN”, O pandas pode converter automaticamente esta coluna em duas colunas “Alley_Pave” e “Alley_nan”. Uma linha cujo tipo de beco é “Pave” definirá os valores de “Alley_Pave” e “Alley_nan” como 1 e 0. Uma linha com um tipo de beco ausente definirá seus valores para 0 e 1

inputs = pd.get_dummies(inputs, dummy_na=True)
print(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
inputs = pd.get_dummies(inputs, dummy_na=True)
print(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
inputs = pd.get_dummies(inputs, dummy_na=True)
print(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. Convertendo para o Formato Tensor

Agora que todas as entradas em entradas e saídas são numéricas, elas podem ser convertidas para o formato tensor. Uma vez que os dados estão neste formato, eles podem ser manipulados posteriormente com as funcionalidades de tensor que introduzimos em Section 2.1.

from mxnet import np

X, y = np.array(inputs.values), np.array(outputs.values)
X, y
(array([[3., 1., 0.],
        [2., 0., 1.],
        [4., 0., 1.],
        [3., 0., 1.]], dtype=float64),
 array([127500, 106000, 178100, 140000], dtype=int64))
import torch

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]))
import tensorflow as tf

X, y = tf.constant(inputs.values), tf.constant(outputs.values)
X, y
(<tf.Tensor: shape=(4, 3), dtype=float64, numpy=
 array([[3., 1., 0.],
        [2., 0., 1.],
        [4., 0., 1.],
        [3., 0., 1.]])>,
 <tf.Tensor: shape=(4,), dtype=int64, numpy=array([127500, 106000, 178100, 140000])>)

2.2.4. Sumário

  • Como muitos outros pacotes de extensão no vasto ecossistema do Python, pandas pode trabalhar junto com tensores.

  • Imputação e exclusão podem ser usadas para lidar com dados perdidos.

2.2.5. Exercícios

Crie um conjunto de dados bruto com mais linhas e colunas.

  1. Exclua a coluna com a maioria dos valores ausentes.

  2. Converta o conjunto de dados pré-processado para o formato tensor.