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).


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”


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.


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.


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)

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


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 ).

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.