前一篇文章讲到数据归一化,本文继续讲解无量纲化的第二种方法,数据标准化。其过程是:先将数据按均值中心化后,再按标准差缩放,得到的数据服从均值为0,标准差为1的标准正态分布。

公式表示:x' = (x-μ)/δ

Numpy实现标准化

import numpy as np

x = np.array([[-1, 2], [-0.5, 6], [0, 10], [1, 18]])

# 标准化
x_std = (x-x.mean(axis=0)) / x.std(axis=0)
print(x_std)

# 标准化逆转
x_inv = x_std * x.std(axis=0) + x.mean(axis=0)
print(x_inv)

Sklearn实现标准化

from sklearn.preprocessing import StandardScaler

data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]

scaler = StandardScaler()
scaler.fit(data)  # 计算均值和方差
print(scaler.mean_)  # 均值
print(scaler.var_)  # 方差

x_std = scaler.transform(data)
print(x_std)

# 训练和导出一步到位
x_std = scaler.fit_transform(data)
print(x_std)

# 标准化逆转
x_inv = scaler.inverse_transform(x_std)
print(x_inv)

归一化和标准化的选择

大多数机器学习算法中,会选择StandardScaler来进行特征缩放,因为MinMaxScaler对异常值非常敏感。在PCA,聚类,逻辑回归,支持向量机,神经网络这些算法中,StandardScaler往往是最好的选择。

MinMaxScaler在不涉及距离度量、梯度、协方差计算以及数据需要被压缩到特定区间时使用广泛,比如数字图像处理中量化像素强度时,都会使用MinMaxScaler,将数据压缩于[0,1]区间之中。

建议先试试看StandardScaler,效果不好换MinMaxScaler。

本文为 陈华 原创,欢迎转载,但请注明出处:http://ichenhua.cn/read/262