Não consigo compreender a página do StandardScaler
na documentação de sklearn
.
Alguém pode me explicar isso em termos simples?
Não consigo compreender a página do StandardScaler
na documentação de sklearn
.
Alguém pode me explicar isso em termos simples?
Respostas:
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).
Introdução: Presumo que você tenha uma matriz X
onde cada linha / linha é uma amostra / observação e cada coluna é uma variável / característica (essa é a entrada esperada para qualquer sklearn
função ML, a propósito - X.shape
deveria ser [number_of_samples, number_of_features]
).
Núcleo do método : A idéia principal é normalizar / padronizar ie μ = 0
e σ = 1
seus 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á μ = 0
e σ = 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:
ATUALIZAÇÃO 08/2019 : Concertando os parâmetros de entrada with_mean
e with_std
para False
/ True
, forneci uma resposta aqui: StandardScaler diferença entre “with_std = False or True” e “with_mean = False or True”
[1.15, 1.15]
quando calculo como um pandas df pd.DataFrame(scaled_data).std(0)
:?
pd.DataFrame(scaled_data)[0]
, obtenho uma série com os Name: 0, dtype: float64
valores e [-1.0, 1.0, -1.0, 1.0]
. Desculpe pela formatação
StandardScaler
, isso torna o algoritmo de aprendizado de máquina mais rápido ou ajuda a tomar decisões mais precisas, ou algo mais?
Como calcular:
Você pode ler mais aqui:
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.
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.
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.
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)
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)
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
Verifique a média e o desvio padrão após a padronização
Nota: -2,77555756e-17 é muito próximo de 0.
Referências
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 ).
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