¿Alguien puede explicarme StandardScaler?

Respuestas:

107

La idea detrás StandardScaleres que transformará sus datos de manera que su distribución tenga un valor medio de 0 y una desviación estándar de 1.
En el caso de datos multivariados, esto se hace en función de las características (en otras palabras, de forma independiente para cada columna de los datos) .
Dada la distribución de los datos, cada valor en el conjunto de datos tendrá el valor medio restado y luego dividido por la desviación estándar de todo el conjunto de datos (o característica en el caso multivariado).

usuario6903745
fuente
4
Encuentro que esta respuesta no es correcta. each value in the dataset will have the sample mean value subtracted-- esto no es verdad. La media de CADA característica / columna se restará de los valores de la columna específica. Esto se hace por columnas. No hay sample mean value subtracted- Vea mi respuesta a continuación
seralouk
@makis Edité mi respuesta siguiendo la aclaración que sugieres.
user6903745
103

Introducción: supongo que tiene una matriz Xdonde cada fila / línea es una muestra / observación y cada columna es una variable / característica (esta es la entrada esperada para cualquier sklearnfunción ML, por cierto, X.shapedebería ser [number_of_samples, number_of_features]).


Núcleo del método : La idea principal es la de normalizar / estandarizar decir, μ = 0y σ = 1sus características / variables / columnas de X, por separado , antes de aplicar cualquier modelo de aprendizaje de máquina.

StandardScaler()se normalizar las características , es decir, cada columna de X, INDIVIDUALMENTE , de modo que cada columna / función / variable de tendrán μ = 0y σ = 1.


PD: Encuentro la respuesta más votada en esta página, incorrecta. Estoy citando "a cada valor en el conjunto de datos se le restará el valor medio de la muestra". Esto no es cierto ni correcto.


Consulte también: Cómo y por qué estandarizar sus datos: un tutorial de Python


Ejemplo:

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 que la media de cada característica (columna) sea 0:

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

Verifique que el estándar de cada característica (columna) sea 1:

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

Las matemáticas:

ingrese la descripción de la imagen aquí


ACTUALIZACIÓN 08/2019 : Con respecto a los parámetros de entrada with_meany with_stda False/ True, he proporcionado una respuesta aquí: Diferencia de StandardScaler entre "with_std = False or True" y "with_mean = False or True"

seralouk
fuente
¿Tienes alguna idea de por qué obtengo [1.15, 1.15]cuando calculo como pandas df pd.DataFrame(scaled_data).std(0):?
Sos
cuando corro pd.DataFrame(scaled_data)[0]obtengo una serie con Name: 0, dtype: float64valores y [-1.0, 1.0, -1.0, 1.0]. Perdón por el formato
Sos
@seralouk Me gustó su respuesta, sin embargo, todavía me pregunto cuál es la intención detrás de transformar el uso de datos de entrada StandardScaler, ¿hace que el algoritmo de aprendizaje automático sea más rápido o ayuda a tomar decisiones más precisas, o algo más?
sepisoad
La estandarización de un conjunto de datos es un requisito común para muchos estimadores de aprendizaje automático: pueden comportarse mal si las características individuales no se ven más o menos como datos estándar distribuidos normalmente (por ejemplo, gaussiano con media 0 y varianza unitaria). Por ejemplo, muchos elementos utilizados en la función objetivo de un algoritmo de aprendizaje (como el núcleo RBF de SVM o los regularizadores L1 y L2 de modelos lineales) asumen que todas las características se centran alrededor de 0 y tienen varianza en el mismo orden.
Seralouk
Entonces, la estandarización conduce a a) más estable b) menos influenciada por el rango de variables c) ajuste más rápido d) desempeño más estable
seralouk
23

StandardScaler realiza la tarea de estandarización . Por lo general, un conjunto de datos contiene variables que son diferentes en escala. Por ejemplo, un conjunto de datos de Empleado contendrá una columna EDAD con valores en la escala 20-70 y una columna SALARIO con valores en la escala 10000-80000 .
Como estas dos columnas tienen una escala diferente, están estandarizadas para tener una escala común al crear el modelo de aprendizaje automático.

krish___na
fuente
10

Esto es útil cuando desea comparar datos que corresponden a diferentes unidades. En ese caso, desea eliminar las unidades. Para hacer eso de una manera consistente de todos los datos, transforma los datos de manera que la varianza sea unitaria y que la media de la serie sea 0.

Riccardo Petraglia
fuente
1
¿Pueden explicarnos con un ejemplo ... como en cómo ayuda? ... eso sería realmente
útil
6

Las respuestas anteriores son geniales, pero necesitaba un ejemplo simple para aliviar algunas preocupaciones que he tenido en el pasado. Quería asegurarme de que efectivamente trataba cada columna por separado. Ahora estoy tranquilo y no puedo encontrar qué ejemplo me había preocupado. Todas las columnas SON escaladas por separado como se describe arriba.

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)

SALIDA

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
fuente
1
¿Por qué la varianza no es 1, por favor?
Máximo
6

A continuación se muestra un ejemplo de trabajo simple para explicar cómo funciona el cálculo de estandarización. La parte de la teoría ya está bien explicada en otras respuestas.

>>>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 puede ver en la salida, la media es [6. , 2.5] y la desviación estándar es [1.41421356, 0.8660254]

Los datos son (0,1) la posición es 2 Estandarización = (2 - 2,5) /0,8660254 = -0,57735027

Los datos en la posición (1,0) son 4 Estandarización = (4-6) /1.41421356 = -1.414

Resultado después de la estandarización

ingrese la descripción de la imagen aquí

Compruebe la desviación media y estándar después de la estandarización

ingrese la descripción de la imagen aquí

Nota: -2,77555756e-17 está muy cerca de 0.

Referencias

  1. Compare el efecto de diferentes escaladores en los datos con valores atípicos

  2. ¿Cuál es la diferencia entre normalización y estandarización?

  3. La media de los datos escalados con sklearn StandardScaler no es cero

LCJ
fuente
3

Después de aplicar StandardScaler(), cada columna en X tendrá una media de 0 y una desviación estándar de 1.

Otros enumeran las fórmulas en esta página.

Justificación: algunos algoritmos requieren que los datos se vean así (consulte los documentos de sklearn ).

Pablo
fuente