Alguém pode me explicar o StandardScaler?

Respostas:

106

A ideia por trás StandardScaleré que ele irá transformar seus dados de forma que sua distribuição tenha um valor médio 0 e desvio padrão de 1.
No caso de dados multivariados, isso é feito em termos de recursos (em outras palavras, independentemente para cada coluna dos dados) .
Dada a distribuição dos dados, cada valor no conjunto de dados terá o valor médio subtraído e, em seguida, dividido pelo desvio padrão de todo o conjunto de dados (ou recurso no caso multivariado).

user6903745
fonte
3
Acho que essa resposta não está correta. each value in the dataset will have the sample mean value subtracted-- isso não é verdade. A média de CADA característica / coluna será subtraída dos valores da coluna específica. Isso é feito em colunas. Não há sample mean value subtracted- Veja minha resposta abaixo
seralouk
@makis Eu editei minha resposta seguindo o esclarecimento que você sugeriu.
user6903745
98

Introdução: Presumo que você tenha uma matriz Xonde cada linha / linha é uma amostra / observação e cada coluna é uma variável / característica (essa é a entrada esperada para qualquer sklearnfunção ML, a propósito - X.shapedeveria ser [number_of_samples, number_of_features]).


Núcleo do método : A idéia principal é normalizar / padronizar ie μ = 0e σ = 1seus recursos / variáveis / colunas de X, individualmente , antes de aplicar qualquer modelo de aprendizagem de máquina.

StandardScaler()irá normalizar os recursos, ou seja, cada coluna de X, INDIVIDUALMENTE , de modo que cada coluna / recurso / variável terá μ = 0e σ = 1.


PS: Acho que a resposta mais votada nesta página está errada. Estou citando "cada valor no conjunto de dados terá o valor médio da amostra subtraído" - Isso não é verdadeiro nem correto.


Veja também: Como e por que padronizar seus dados: um tutorial de python


Exemplo:

from sklearn.preprocessing import StandardScaler
import numpy as np

# 4 samples/observations and 2 variables/features
data = np.array([[0, 0], [1, 0], [0, 1], [1, 1]])
scaler = StandardScaler()
scaled_data = scaler.fit_transform(data)

print(data)
[[0, 0],
 [1, 0],
 [0, 1],
 [1, 1]])

print(scaled_data)
[[-1. -1.]
 [ 1. -1.]
 [-1.  1.]
 [ 1.  1.]]

Verifique se a média de cada recurso (coluna) é 0:

scaled_data.mean(axis = 0)
array([0., 0.])

Verifique se o padrão de cada recurso (coluna) é 1:

scaled_data.std(axis = 0)
array([1., 1.])

As matemáticas:

insira a descrição da imagem aqui


ATUALIZAÇÃO 08/2019 : Concertando os parâmetros de entrada with_meane with_stdpara False/ True, forneci uma resposta aqui: StandardScaler diferença entre “with_std = False or True” e “with_mean = False or True”

Seralouk
fonte
Você tem alguma ideia de por que eu recebo [1.15, 1.15]quando calculo como um pandas df pd.DataFrame(scaled_data).std(0):?
Sos
quando corro pd.DataFrame(scaled_data)[0], obtenho uma série com os Name: 0, dtype: float64valores e [-1.0, 1.0, -1.0, 1.0]. Desculpe pela formatação
Sos
@seralouk gostei da sua resposta, mas ainda estou me perguntando qual é a intenção por trás de transformar os dados de entrada usando StandardScaler, isso torna o algoritmo de aprendizado de máquina mais rápido ou ajuda a tomar decisões mais precisas, ou algo mais?
sepisoad
A padronização de um conjunto de dados é um requisito comum para muitos estimadores de aprendizado de máquina: eles podem se comportar mal se os recursos individuais não se parecerem mais ou menos com dados normalmente distribuídos padrão (por exemplo, Gaussiano com média 0 e variação unitária). Por exemplo, muitos elementos usados ​​na função objetivo de um algoritmo de aprendizagem (como o kernel RBF de SVM ou os regularizadores L1 e L2 de modelos lineares) assumem que todas as características estão centradas em torno de 0 e têm variância na mesma ordem.
seralouk
Portanto, a padronização leva a a) mais estável b) menos influenciada pela gama de variáveis ​​c) ajuste mais rápido d) desempenho mais estável
seralouk
22

StandardScaler executa a tarefa de padronização . Normalmente, um conjunto de dados contém variáveis ​​que são diferentes em escala. Por exemplo, um conjunto de dados de funcionários conterá a coluna AGE com valores na escala 20-70 e a coluna SALARY com valores na escala 10000-80000 .
Como essas duas colunas são diferentes em escala, elas são padronizadas para ter uma escala comum durante a construção do modelo de aprendizado de máquina.

Krish___na
fonte
10

Isso é útil quando você deseja comparar dados que correspondem a unidades diferentes. Nesse caso, você deseja remover as unidades. Para fazer isso de forma consistente com todos os dados, você transforma os dados de forma que a variância seja unitária e que a média da série seja 0.

Riccardo Petraglia
fonte
1
você pode explicar com um exemplo ... como em como isso ajuda? .. que seria realmente útil
obrigado
6

As respostas acima são ótimas, mas eu precisava de um exemplo simples para aliviar algumas preocupações que tive no passado. Eu queria ter certeza de que ele estava tratando cada coluna separadamente. Agora estou tranquilo e não consigo descobrir que exemplo me preocupou. Todas as colunas SÃO dimensionadas separadamente, conforme descrito acima.

CÓDIGO

import pandas as pd
import scipy.stats as ss
from sklearn.preprocessing import StandardScaler


data= [[1, 1, 1, 1, 1],[2, 5, 10, 50, 100],[3, 10, 20, 150, 200],[4, 15, 40, 200, 300]]

df = pd.DataFrame(data, columns=['N0', 'N1', 'N2', 'N3', 'N4']).astype('float64')

sc_X = StandardScaler()
df = sc_X.fit_transform(df)

num_cols = len(df[0,:])
for i in range(num_cols):
    col = df[:,i]
    col_stats = ss.describe(col)
    print(col_stats)

RESULTADO

DescribeResult(nobs=4, minmax=(-1.3416407864998738, 1.3416407864998738), mean=0.0, variance=1.3333333333333333, skewness=0.0, kurtosis=-1.3599999999999999)
DescribeResult(nobs=4, minmax=(-1.2828087129930659, 1.3778315806221817), mean=-5.551115123125783e-17, variance=1.3333333333333337, skewness=0.11003776770595125, kurtosis=-1.394993095506219)
DescribeResult(nobs=4, minmax=(-1.155344148338584, 1.53471088361394), mean=0.0, variance=1.3333333333333333, skewness=0.48089217736510326, kurtosis=-1.1471008824318165)
DescribeResult(nobs=4, minmax=(-1.2604572012883055, 1.2668071116222517), mean=-5.551115123125783e-17, variance=1.3333333333333333, skewness=0.0056842140599118185, kurtosis=-1.6438177182479734)
DescribeResult(nobs=4, minmax=(-1.338945389819976, 1.3434309690153527), mean=5.551115123125783e-17, variance=1.3333333333333333, skewness=0.005374558840039456, kurtosis=-1.3619131970819205)
Thom Ives
fonte
1
Por que a variância não é 1, por favor?
Máx.
6

A seguir está um exemplo simples de trabalho para explicar como funciona o cálculo de padronização. A parte teórica já está bem explicada em outras respostas.

>>>import numpy as np
>>>data = [[6, 2], [4, 2], [6, 4], [8, 2]]
>>>a = np.array(data)

>>>np.std(a, axis=0)
array([1.41421356, 0.8660254 ])

>>>np.mean(a, axis=0)
array([6. , 2.5])

>>>from sklearn.preprocessing import StandardScaler
>>>scaler = StandardScaler()
>>>scaler.fit(data)
>>>print(scaler.mean_)

#Xchanged = (X−μ)/σ  WHERE σ is Standard Deviation and μ is mean
>>>z=scaler.transform(data)
>>>z

Cálculo

Como você pode ver na saída, a média é [6. , 2,5] e o desvio padrão é [1,41421356, 0,8660254]

Os dados são (0,1) a posição é 2 Padronização = (2 - 2,5) / 0,8660254 = -0,57735027

Os dados na posição (1,0) são 4 Padronização = (4-6) / 1,41421356 = -1,414

Resultado após padronização

insira a descrição da imagem aqui

Verifique a média e o desvio padrão após a padronização

insira a descrição da imagem aqui

Nota: -2,77555756e-17 é muito próximo de 0.

Referências

  1. Compare o efeito de diferentes scalers em dados com outliers

  2. Qual é a diferença entre normalização e padronização?

  3. A média dos dados escalados com sklearn StandardScaler não é zero

LCJ
fonte
3

Após a aplicação StandardScaler(), cada coluna em X terá média 0 e desvio padrão 1.

As fórmulas são listadas por outras pessoas nesta página.

Justificativa: alguns algoritmos requerem que os dados tenham a seguinte aparência (consulte a documentação do sklearn ).

Paulo
fonte