Muitos algoritmos de aprendizagem de máquinas fazem suposições sobre seus dados. Muitas vezes, é uma boa idéia preparar seus dados de forma a melhor expor a estrutura do problema aos algoritmos de aprendizagem de máquina que você pretende usar. Neste capítulo, você descobrirá como preparar seus dados para a aprendizagem de máquinas em Python usando scikit-learn. Depois de completar esta lição você saberá como:
Necessidade de pré-processamento de dados
Pré-processar seus dados é um passo necessário. Uma dificuldade é que diferentes algoritmos fazem diferentes pressupostos sobre seus dados e podem exigir transformações diferentes. Além disso, quando você segue todas as regras e prepara seus dados, às vezes os algoritmos podem oferecer melhores resultados sem pré-processamento.
Geralmente, eu recomendaria a criação de muitas visualizações e transformações diferentes dos seus dados, e depois exercitaria um punhado de algoritmos em cada visualização do seu conjunto de dados. Isso irá ajudá-lo a eliminar as transformações de dados que podem ser melhores ao expor a estrutura do seu problema em geral.
Nesta lição, você trabalhará através de 4 diferentes tarefas de pré-processamento de dados para aprendizagem em máquina. O conjunto de dados do diabetes indiano Pima é usado em cada exemplo. Cada exemplo segue a mesma estrutura:
A biblioteca scikit-learn fornece dois idiomas padrão para transformar dados. Cada um é útil em diferentes circunstâncias. As transformações são calculadas de tal forma que elas podem ser aplicadas aos dados de treinamento e a qualquer amostra de dados que você possa ter no futuro. A documentação scikit-learn contém algumas informações sobre como usar vários métodos de pré-processamento diferentes:
O método Fit e Multiple Transform é a abordagem preferida. Você chama a função fit () para preparar os parâmetros da transformação uma vez em seus dados. Depois, você pode usar a função transform () nos mesmos dados para prepará-lo para modelagem e novamente no conjunto de dados de teste ou validação ou novos dados que você possa ver no futuro. O Combined Fit-And-Transform é uma conveniência que você pode usar para uma tarefa fora. Isso pode ser útil se você estiver interessado em traçar ou resumir os dados transformados. Você pode revisar a API de pré-processamento no scikit-learn clicando neste link.
Quando seus dados são compostos por atributos com diferentes escalas, muitos algoritmos de aprendizado de máquina podem se beneficiar de redimensionar os atributos para que todos tenham a mesma escala. Muitas vezes, isso é referido como normalização e os atributos são freqüentemente redimensionados para o intervalo entre 0 e 1. Isso é útil para algoritmos de otimização usados no núcleo de algoritmos de aprendizado de máquinas como gradiente descendente. Também é útil para algoritmos que ponderam as entradas de regressão e redes neurais ou algoritmos que utilizam medidas de distância como k-Nearest Neighbours. Você pode redimensionar seus dados usando scikit-learn usando a classe MinMaxScaler.
In [11]:
# Rescalando dados (entre 0 e 1)
from pandas import read_csv
from numpy import set_printoptions
from sklearn.preprocessing import MinMaxScaler
filename = 'pima-indians-diabetes.data'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(filename, names=names)
array = dataframe.values
# separar array em entrada e saída
X = array[:,0:8]
Y = array[:,8]
scaler = MinMaxScaler(feature_range=(0, 1))
rescaledX = scaler.fit_transform(X)
# sumarizando os dados transformados
set_printoptions(precision=3)
print(rescaledX[0:5,:])
A padronização é uma técnica útil para transformar atributos assumindo que os mesmos seguem uma distribuição gaussiana, modificando as médias e desvios padrão para uma distribuição gaussiana padrão com uma média de 0 e um desvio padrão de 1. É mais adequado para técnicas que assumem uma distribuição gaussiana nas variáveis de entrada e funcionam melhor com dados redimensionados, como regressão linear, regressão logística e análise de discriminação linear. Você pode padronizar dados usando scikit-learn com a classe StandardScaler
In [12]:
# Standardize data (0 mean, 1 stdev)
from sklearn.preprocessing import StandardScaler
from pandas import read_csv
from numpy import set_printoptions
filename = 'pima-indians-diabetes.data'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(filename, names=names)
array = dataframe.values
# separate array into input and output components
X = array[:,0:8]
Y = array[:,8]
scaler = StandardScaler().fit(X)
rescaledX = scaler.transform(X)
# summarize transformed data
set_printoptions(precision=3)
print(rescaledX[0:5,:])
A normalização em scikit-learn refere-se a reescalonamento de cada observação (linha) para ter um comprimento de 1 (chamado de norma de unidade ou vetor com o comprimento de 1 em álgebra linear). Este método de pré-processamento pode ser útil para conjuntos de dados esparsos (quantidade grande de zeros) com atributos de escalas variáveis quando aplicados aos algoritmos que ponderam valores de entrada, como redes neurais e algoritmos que usam medidas de distância, como k-Nearest Neighbours. Você pode normalizar dados em Python com scikit-learn usando a classe Normalizer.
In [13]:
# Normalize data (length of 1)
from sklearn.preprocessing import Normalizer
from pandas import read_csv
from numpy import set_printoptions
filename = 'pima-indians-diabetes.data'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(filename, names=names)
array = dataframe.values
# separate array into input and output components
X = array[:,0:8]
Y = array[:,8]
scaler = Normalizer().fit(X)
normalizedX = scaler.transform(X)
# summarize transformed data
set_printoptions(precision=3)
print(normalizedX[0:5,:])
Você pode transformar seus dados usando um limite binário. Todos os valores acima do limite são marcados como 1 e todos iguais ou inferiores são marcados como 0. Isso é chamado de binarizar seus dados ou limitar seus dados. Pode ser útil quando você tem probabilidades de que você deseja criar valores nítidos. Também é útil quando você está realizando a engenharia de características e quer adicionar novas características (features) que possuem algum significativo. Você pode criar novos atributos binários no Python usando scikit-learn com a classe Binarizer
In [14]:
# binarization
from sklearn.preprocessing import Binarizer
from pandas import read_csv
from numpy import set_printoptions
filename = 'pima-indians-diabetes.data'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(filename, names=names)
array = dataframe.values
# separate array into input and output components
X = array[:,0:8]
Y = array[:,8]
binarizer = Binarizer(threshold=0.0).fit(X)
binaryX = binarizer.transform(X)
# summarize transformed data
set_printoptions(precision=3)
print(binaryX[0:5,:])
In [ ]: