É uma prática comum normalizar dados para treinar uma rede neural para média zero e desvio padrão de “unidade” para reduzir os efeitos de gradiente de explosão e desaparecimento etc.
O que significa “unidade” std aqui? Um exemplo seria muito útil.
Comentários
- Significa igual a 1. Para conseguir isso, você divide os valores pelo desvio padrão dos dados originais . (A média zero vem subtraindo a média.)
Resposta
Significa que você está convertendo seus recursos de dados de suas unidades originais (milhas, dólares, tempo decorrido, …) para unidades de desvio padrão. Conforme solicitado, segue um exemplo muito simples:
Suponha que você queira prever os preços das casas a partir de duas características: número de quartos (unidade inteira) e tamanho (em unidades de metros quadrados), como os dados fictícios abaixo:
import numpy as np X = np.array([[1, 65],[3, 130],[2, 80],[2, 70],[1, 50]])
Observe que cada recurso tem média e desvio padrão muito diferentes
print("mean={}, std{}".format(X.mean(axis=0), X.std(axis=0))
Resultados: mean=[ 1.83333333, 78.33333333]), std=[ 0.68718427, 24.94438258])
Percebido que o tamanho do recurso tem média e padrão mais de 30x maior do que o número do quarto, isso produz distorções no cálculo de alguns algoritmos (como redes neurais, svm , knn, etc) onde alguns recursos com valores maiores dominam completamente os outros com valores menores. Para resolver isso uma prática comum e muito eficaz é transformar os dados em unidades de desvio padrão com média zero, ou seja, você subtrai a média e divide pelo desvio padrão, conforme abaixo:
X_t = (X - X.mean(axis=0))/X.std(axis=0)
A variável X_t
(X transformado) contém seus recursos em desvios padrão da unidade com média zero, imprimindo X_t
você obtém:
array([[-1.21267813, -0.53452248], [ 1.69774938, 2.07127462], [ 0.24253563, 0.06681531], [ 0.24253563, -0.33407655], [-1.21267813, -1.13586028], [ 0.24253563, -0.13363062]])
Veja como os números em ambos os recursos têm a mesma magnitude. Se você imprimir X_t
mean e std agora, obterá
mean=[ 1.11022302e-16 2.08166817e-16], std=[ 1. 1.]
como esperado.