IA com Python - preparação de dados
Já estudamos algoritmos de aprendizado de máquina supervisionados e não supervisionados. Esses algoritmos requerem dados formatados para iniciar o processo de treinamento. Devemos preparar ou formatar os dados de uma determinada maneira para que possam ser fornecidos como uma entrada para algoritmos de ML.
Este capítulo enfoca a preparação de dados para algoritmos de aprendizado de máquina.
Pré-processamento dos dados
Em nossa vida diária, lidamos com muitos dados, mas esses dados estão na forma bruta. Para fornecer os dados como entrada de algoritmos de aprendizado de máquina, precisamos convertê-los em dados significativos. É aí que o pré-processamento de dados entra em cena. Em outras palavras simples, podemos dizer que antes de fornecer os dados aos algoritmos de aprendizado de máquina, precisamos pré-processar os dados.
Etapas de pré-processamento de dados
Siga estas etapas para pré-processar os dados em Python -
Step 1 − Importing the useful packages - Se estivermos usando Python, então este seria o primeiro passo para converter os dados em um determinado formato, ou seja, pré-processamento. Isso pode ser feito da seguinte forma -
import numpy as np
import sklearn.preprocessing
Aqui, usamos os dois pacotes a seguir -
NumPy - Basicamente, o NumPy é um pacote de processamento de array de propósito geral projetado para manipular eficientemente grandes arrays multidimensionais de registros arbitrários sem sacrificar muita velocidade para pequenos arrays multi-dimensionais.
Sklearn.preprocessing - Este pacote fornece muitas funções utilitárias comuns e classes de transformador para transformar vetores de recursos brutos em uma representação mais adequada para algoritmos de aprendizado de máquina.
Step 2 − Defining sample data - Depois de importar os pacotes, precisamos definir alguns dados de amostra para que possamos aplicar técnicas de pré-processamento nesses dados. Vamos agora definir os seguintes dados de amostra -
input_data = np.array([2.1, -1.9, 5.5],
[-1.5, 2.4, 3.5],
[0.5, -7.9, 5.6],
[5.9, 2.3, -5.8])
Step3 − Applying preprocessing technique - Nesta etapa, precisamos aplicar qualquer uma das técnicas de pré-processamento.
A seção a seguir descreve as técnicas de pré-processamento de dados.
Técnicas de pré-processamento de dados
As técnicas de pré-processamento de dados são descritas abaixo -
Binarização
Esta é a técnica de pré-processamento que é usada quando precisamos converter nossos valores numéricos em valores booleanos. Podemos usar um método embutido para binarizar os dados de entrada, digamos, usando 0,5 como o valor limite da seguinte maneira -
data_binarized = preprocessing.Binarizer(threshold = 0.5).transform(input_data)
print("\nBinarized data:\n", data_binarized)
Agora, depois de executar o código acima, obteremos a seguinte saída, todos os valores acima de 0,5 (valor limite) seriam convertidos para 1 e todos os valores abaixo de 0,5 seriam convertidos para 0.
Binarized data
[[ 1. 0. 1.]
[ 0. 1. 1.]
[ 0. 0. 1.]
[ 1. 1. 0.]]
Remoção Média
É outra técnica de pré-processamento muito comum usada no aprendizado de máquina. Basicamente, ele é usado para eliminar a média do vetor de recurso de forma que cada recurso seja centralizado em zero. Também podemos remover a polarização dos recursos no vetor de recursos. Para aplicar a técnica de pré-processamento de remoção média nos dados de amostra, podemos escrever o código Python mostrado abaixo. O código exibirá a média e o desvio padrão dos dados de entrada -
print("Mean = ", input_data.mean(axis = 0))
print("Std deviation = ", input_data.std(axis = 0))
Obteremos a seguinte saída após executar as linhas de código acima -
Mean = [ 1.75 -1.275 2.2]
Std deviation = [ 2.71431391 4.20022321 4.69414529]
Agora, o código a seguir removerá a média e o desvio padrão dos dados de entrada -
data_scaled = preprocessing.scale(input_data)
print("Mean =", data_scaled.mean(axis=0))
print("Std deviation =", data_scaled.std(axis = 0))
Obteremos a seguinte saída após executar as linhas de código acima -
Mean = [ 1.11022302e-16 0.00000000e+00 0.00000000e+00]
Std deviation = [ 1. 1. 1.]
Dimensionamento
É outra técnica de pré-processamento de dados usada para dimensionar os vetores de recursos. O dimensionamento dos vetores de recursos é necessário porque os valores de cada recurso podem variar entre muitos valores aleatórios. Em outras palavras, podemos dizer que o dimensionamento é importante porque não queremos que nenhum recurso seja sinteticamente grande ou pequeno. Com a ajuda do seguinte código Python, podemos fazer a escala de nossos dados de entrada, ou seja, vetor de recurso -
# Min max scaling
data_scaler_minmax = preprocessing.MinMaxScaler(feature_range=(0,1))
data_scaled_minmax = data_scaler_minmax.fit_transform(input_data)
print ("\nMin max scaled data:\n", data_scaled_minmax)
Obteremos a seguinte saída após executar as linhas de código acima -
Min max scaled data
[ [ 0.48648649 0.58252427 0.99122807]
[ 0. 1. 0.81578947]
[ 0.27027027 0. 1. ]
[ 1. 0. 99029126 0. ]]
Normalização
É outra técnica de pré-processamento de dados usada para modificar os vetores de recursos. Esse tipo de modificação é necessário para medir os vetores de recursos em uma escala comum. A seguir estão dois tipos de normalização que podem ser usados no aprendizado de máquina -
L1 Normalization
Também é conhecido como Least Absolute Deviations. Este tipo de normalização modifica os valores de forma que a soma dos valores absolutos seja sempre até 1 em cada linha. Ele pode ser implementado nos dados de entrada com a ajuda do seguinte código Python -
# Normalize data
data_normalized_l1 = preprocessing.normalize(input_data, norm = 'l1')
print("\nL1 normalized data:\n", data_normalized_l1)
A linha de código acima gera o seguinte resultado & miuns;
L1 normalized data:
[[ 0.22105263 -0.2 0.57894737]
[ -0.2027027 0.32432432 0.47297297]
[ 0.03571429 -0.56428571 0.4 ]
[ 0.42142857 0.16428571 -0.41428571]]
L2 Normalization
Também é conhecido como least squares. Este tipo de normalização modifica os valores para que a soma dos quadrados seja sempre até 1 em cada linha. Ele pode ser implementado nos dados de entrada com a ajuda do seguinte código Python -
# Normalize data
data_normalized_l2 = preprocessing.normalize(input_data, norm = 'l2')
print("\nL2 normalized data:\n", data_normalized_l2)
A linha de código acima irá gerar a seguinte saída -
L2 normalized data:
[[ 0.33946114 -0.30713151 0.88906489]
[ -0.33325106 0.53320169 0.7775858 ]
[ 0.05156558 -0.81473612 0.57753446]
[ 0.68706914 0.26784051 -0.6754239 ]]
Rotulando os Dados
Já sabemos que dados em um determinado formato são necessários para algoritmos de aprendizado de máquina. Outro requisito importante é que os dados devem ser rotulados corretamente antes de serem enviados como entrada de algoritmos de aprendizado de máquina. Por exemplo, se falamos sobre classificação, há muitos rótulos nos dados. Esses rótulos estão na forma de palavras, números, etc. Funções relacionadas ao aprendizado de máquina emsklearnespere que os dados tenham rótulos numéricos. Portanto, se os dados estiverem em outra forma, eles devem ser convertidos em números. Este processo de transformar os rótulos das palavras em forma numérica é chamado de codificação de rótulos.
Etapas de codificação de rótulo
Siga estas etapas para codificar os rótulos de dados em Python -
Step1 − Importing the useful packages
Se estivermos usando Python, então este seria o primeiro passo para converter os dados em determinado formato, ou seja, pré-processamento. Isso pode ser feito da seguinte forma -
import numpy as np
from sklearn import preprocessing
Step 2 − Defining sample labels
Depois de importar os pacotes, precisamos definir alguns rótulos de amostra para que possamos criar e treinar o codificador de rótulos. Agora definiremos os seguintes rótulos de amostra -
# Sample input labels
input_labels = ['red','black','red','green','black','yellow','white']
Step 3 − Creating & training of label encoder object
Nesta etapa, precisamos criar o codificador de rótulo e treiná-lo. O código Python a seguir ajudará nisso -
# Creating the label encoder
encoder = preprocessing.LabelEncoder()
encoder.fit(input_labels)
O seguinte seria o resultado após a execução do código Python acima -
LabelEncoder()
Step4 − Checking the performance by encoding random ordered list
Esta etapa pode ser usada para verificar o desempenho codificando a lista ordenada aleatória. O seguinte código Python pode ser escrito para fazer o mesmo -
# encoding a set of labels
test_labels = ['green','red','black']
encoded_values = encoder.transform(test_labels)
print("\nLabels =", test_labels)
As etiquetas seriam impressas da seguinte forma -
Labels = ['green', 'red', 'black']
Agora, podemos obter a lista de valores codificados, ou seja, rótulos de palavras convertidos em números da seguinte forma -
print("Encoded values =", list(encoded_values))
Os valores codificados seriam impressos da seguinte forma -
Encoded values = [1, 2, 0]
Step 5 − Checking the performance by decoding a random set of numbers −
Esta etapa pode ser usada para verificar o desempenho, decodificando o conjunto aleatório de números. O seguinte código Python pode ser escrito para fazer o mesmo -
# decoding a set of values
encoded_values = [3,0,4,1]
decoded_list = encoder.inverse_transform(encoded_values)
print("\nEncoded values =", encoded_values)
Agora, os valores codificados seriam impressos da seguinte forma -
Encoded values = [3, 0, 4, 1]
print("\nDecoded labels =", list(decoded_list))
Agora, os valores decodificados seriam impressos da seguinte forma -
Decoded labels = ['white', 'black', 'yellow', 'green']
Rotulado v / s Dados não rotulados
Os dados não rotulados consistem principalmente em amostras de objetos naturais ou criados pelo homem que podem ser facilmente obtidos do mundo. Eles incluem áudio, vídeo, fotos, artigos de notícias, etc.
Por outro lado, os dados rotulados pegam um conjunto de dados não rotulados e aumentam cada parte desses dados não rotulados com alguma tag ou rótulo ou classe que seja significativa. Por exemplo, se tivermos uma foto, o rótulo pode ser colocado com base no conteúdo da foto, ou seja, é a foto de um menino ou menina ou animal ou qualquer outra coisa. A rotulagem dos dados requer perícia humana ou julgamento sobre um dado dado não rotulado.
Existem muitos cenários onde os dados não rotulados são abundantes e facilmente obtidos, mas os dados rotulados geralmente requerem um humano / especialista para fazer anotações. O aprendizado semissupervisionado tenta combinar dados marcados e não marcados para construir modelos melhores.