Ejemplo de diferentes estandarizaciones en python.
Para una referencia, mire este artículo de Wikipedia:
https://en.wikipedia.org/wiki/Unlimited_estimation_of_standard_deviation
Datos de ejemplo
import pandas as pd
df = pd.DataFrame({
'A':[1,2,3],
'B':[100,300,500],
'C':list('abc')
})
print(df)
A B C
0 1 100 a
1 2 300 b
2 3 500 c
Normalización usando pandas (Da estimaciones imparciales)
Al normalizar, simplemente restamos la media y la dividimos por desviación estándar.
df.iloc[:,0:-1] = df.iloc[:,0:-1].apply(lambda x: (x-x.mean())/ x.std(), axis=0)
print(df)
A B C
0 -1.0 -1.0 a
1 0.0 0.0 b
2 1.0 1.0 c
Normalización usando sklearn (Da estimaciones sesgadas, diferentes de los pandas)
Si hace lo mismo con sklearn
usted, ¡obtendrá DIFERENTES resultados!
import pandas as pd
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
df = pd.DataFrame({
'A':[1,2,3],
'B':[100,300,500],
'C':list('abc')
})
df.iloc[:,0:-1] = scaler.fit_transform(df.iloc[:,0:-1].to_numpy())
print(df)
A B C
0 -1.224745 -1.224745 a
1 0.000000 0.000000 b
2 1.224745 1.224745 c
¿Las estimaciones sesgadas de sklearn hacen que el aprendizaje automático sea menos potente?
NO.
La documentación oficial de sklearn.preprocessing.scale establece que el uso del estimador sesgado NO PROBABLEMENTE afecta el rendimiento de los algoritmos de aprendizaje automático y podemos usarlos de manera segura.
From official documentation:
We use a biased estimator for the standard deviation,
equivalent to numpy.std(x, ddof=0).
Note that the choice of ddof is unlikely to affect model performance.
¿Qué pasa con la escala MinMax?
No hay cálculo de desviación estándar en la escala MinMax. Por lo tanto, el resultado es el mismo tanto en pandas como en scikit-learn.
import pandas as pd
df = pd.DataFrame({
'A':[1,2,3],
'B':[100,300,500],
})
(df - df.min()) / (df.max() - df.min())
A B
0 0.0 0.0
1 0.5 0.5
2 1.0 1.0
# Using sklearn
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
arr_scaled = scaler.fit_transform(df)
print(arr_scaled)
[[0. 0. ]
[0.5 0.5]
[1. 1. ]]
df_scaled = pd.DataFrame(arr_scaled, columns=df.columns,index=df.index)
print(df_scaled)
A B
0 0.0 0.0
1 0.5 0.5
2 1.0 1.0