归一化方法的详细示例
- Pandas 归一化(无偏)
- Sklearn 标准化(有偏差)
- 有偏见与无偏见会影响机器学习吗?
- 最大混合缩放
参考资料:
Wikipedia: Unbiased Estimation of Standard Deviation
示例数据
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
使用 pandas 进行归一化(给出无偏估计)
当归一化时,我们只需减去均值并除以标准差。
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
使用 sklearn 进行归一化(给出有偏估计,与 pandas 不同)
如果你对sklearn 做同样的事情,你会得到不同的输出!
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
sklearn 的偏差估计是否会降低机器学习的功能?
没有。
sklearn.preprocessing.scale 的官方文档指出,使用有偏估计器不太可能影响机器学习算法的性能,我们可以安全地使用它们。
来自官方文档:
我们对标准差使用有偏估计量,相当于numpy.std(x, ddof=0)。请注意,ddof 的选择不太可能影响模型性能。
MinMax 缩放呢?
在 MinMax 缩放中没有标准偏差计算。所以 pandas 和 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