No puedo entender la página de StandardScaler
en la documentación de sklearn
.
¿Alguien puede explicarme esto en términos simples?
No puedo entender la página de StandardScaler
en la documentación de sklearn
.
¿Alguien puede explicarme esto en términos simples?
Respuestas:
La idea detrás StandardScaler
es 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).
Introducción: supongo que tiene una matriz X
donde cada fila / línea es una muestra / observación y cada columna es una variable / característica (esta es la entrada esperada para cualquier sklearn
función ML, por cierto, X.shape
debería ser [number_of_samples, number_of_features]
).
Núcleo del método : La idea principal es la de normalizar / estandarizar decir, μ = 0
y σ = 1
sus 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 μ = 0
y σ = 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:
ACTUALIZACIÓN 08/2019 : Con respecto a los parámetros de entrada with_mean
y with_std
a False
/ True
, he proporcionado una respuesta aquí: Diferencia de StandardScaler entre "with_std = False or True" y "with_mean = False or True"
[1.15, 1.15]
cuando calculo como pandas df pd.DataFrame(scaled_data).std(0)
:?
pd.DataFrame(scaled_data)[0]
obtengo una serie con Name: 0, dtype: float64
valores y [-1.0, 1.0, -1.0, 1.0]
. Perdón por el formato
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?
Cómo calcularlo:
Puede leer más aquí:
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.
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.
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.
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 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
Compruebe la desviación media y estándar después de la estandarización
Nota: -2,77555756e-17 está muy cerca de 0.
Referencias
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 ).
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 haysample mean value subtracted
- Vea mi respuesta a continuación