文章目录
前言
一般所收集到的数据都需要进行数据标准化,因为在数据集中存在许多量纲不同的指标,比如在学生体质数据集中,包含身高(cm)、体重(kg)等身体指标,可以发现两组指标的数据量纲不一致,指标之间的性质、量纲、数量级、可用性等特征均存在差异,这就会导致我们无法直接用其分析研究对象的特征和规律,同时对模型的可靠性也会造成影响。其次数据标准化在深度学习中会被经常使用,其能够减少噪声的同时,加速模型收敛,提高模型的性能和稳定性。
一、什么是数据标准化?
数据标准化简单来说就是将处于不同“规制”下的数据,或者是不同量纲、级别的数据,统一整合到一个标准“规则”下,就像秦始皇统一度量衡一样^^,专业点就是将原始数据按照一定的规则进行转换,去除数据的单位限制,将其转化为无量纲的纯数值,使得数据落在特定的范围内或服从特定的分布(一般是在 -1~1或者是0 ~ 1之间),以便更好地应用于机器学习算法和数据分析中。
二、数据标准化方法
二、使用步骤
1. Z-score 标准化
Z-score 标准化也称为标准差标准化,将数据减去均值并除以标准差,使得数据的均值为0,标准差为1的标准正态分布,能消除不同特征间的量纲影响,使得数据更易于比较和分析。它适用于大多数数据分布,能保留数据的分布信息,并具有一定的鲁棒性处理异常值。然而,它对异常值较敏感,可能改变数据的原始范围和边界。
z
=
x
−
μ
σ
z = \frac{x - \mu}{\sigma}
z=σx−μ
from sklearn.preprocessing import StandardScaler
import numpy as np
# 原始数据
data = np.array([[1, 2],
[3, 4],
[5, 6]])
# 创建一个 StandardScaler 对象
scaler = StandardScaler()
# 对数据进行 Z-score 标准化
scaled_data = scaler.fit_transform(data)
# 输出标准化后的数据
print("原始数据:\n", data)
print("\nZ-score 标准化后的数据:\n", scaled_data)
2. Min-Max 标准化
Min-Max 标准化是一种线性的数据标准化方法,也称为最小-最大缩放(归一化、极差标准化法),通过将数据线性地缩放到一个给定的范围内,通常是 [0, 1] 或者 [-1, 1]。计算公式如下:
x
norm
=
x
−
x
min
x
max
−
x
min
x_{\text{norm}} = \frac{x - x_{\text{min}}}{x_{\text{max}} - x_{\text{min}} }
xnorm=xmax−xminx−xmin
x
norm
是标准化后的数值,
x
是原始数据点,
x
min
是数据的最小值,
x
max
是数据的最大值。
x_{\text{norm}} 是标准化后的数值, x 是原始数据点, x_{\text{min}} 是数据的最小值, x_{\text{max}} 是数据的最大值。
xnorm是标准化后的数值,x是原始数据点,xmin是数据的最小值,xmax是数据的最大值。
Min-Max 标准化能够将数据线性地缩放到一个固定的范围内 [0, 1] ,适用于对数据的绝对值大小不敏感的情况下,保留了原始数据的分布情况,对某些算法的性能有较好的影响。然而,Min-Max 标准化也存在一些缺点,例如对极端值敏感,可能会受到异常值的影响,而且当数据分布不均匀或存在噪声较大时,可能会导致标准化后的数据失去一部分信息。同时,当遇到某个指标的最大值和最小值未知的情况,或有超出取值范围的离群数值时,Min-Max 标准化就不再适用,可以使用Z-score 标准化。
from sklearn.preprocessing import MinMaxScaler
import numpy as np
# 原始数据
data = np.array([[1, 2],
[3, 4],
[5, 6]])
# 创建一个 MinMaxScaler 对象
scaler = MinMaxScaler()
# 对数据进行 Min-Max 标准化
scaled_data = scaler.fit_transform(data)
# 输出标准化后的数据
print("原始数据:\n", data)
print("\nMin-Max 标准化后的数据:\n", scaled_data)
3.均值标准化
均值标准化(Mean normalization)是一种数据标准化方法,它通过将数据减去均值并除以范围或标准差的方式来处理数据。与 Z-score 标准化不同,均值标准化只考虑数据的分布范围,而不涉及标准差。均值标准化使得数据集中在以均值为中心的范围内,有助于消除数据间的偏差,使得数据更易于比较和分析。这种标准化方法适用于特征具有明显范围但不符合正态分布的数据。均值标准化的计算公式如下:
x
norm
=
x
−
μ
range
x_{\text{norm}} = \frac{x - \mu}{\text{range}}
xnorm=rangex−μ
x
norm
是标准化后的数值,
x
是原始数据点,
μ
是数据的均值,range是数据的范围(通常是最大值减去最小值)
x_{\text{norm}} 是标准化后的数值, x 是原始数据点, \mu是数据的均值, \text{range}是数据的范围(通常是最大值减去最小值)
xnorm是标准化后的数值,x是原始数据点,μ是数据的均值,range是数据的范围(通常是最大值减去最小值)
import numpy as np
# 原始数据
data = np.array([[1, 2],
[3, 4],
[5, 6]])
# 计算数据的均值和范围
data_mean = np.mean(data, axis=0)
data_range = np.max(data, axis=0) - np.min(data, axis=0)
# 进行均值标准化
normalized_data = (data - data_mean) / data_range
# 输出标准化后的数据
print("原始数据:\n", data)
print("\n均值标准化后的数据:\n", normalized_data)
4.小数标准化
小数标准化它通过移动数据的小数点位置来将数据缩放到一个指定的范围内。具体而言,对于每个特征,我们找到一个缩放因子,通常是该特征的最大绝对值,然后将所有的数据点除以这个缩放因子,保留了数据的相对比例关系,适用于对数据的绝对值大小不敏感的情况下,且数据的范围已知的情况下使用。然而,小数标准化也存在着对极端值敏感的问题,可能会受到异常值的影响,同时当数据分布不均匀或存在噪声较大时,可能会导致标准化后的数据失去一部分信息。这种方法的计算公式如下:
x
norm
=
x
1
0
j
x_{\text{norm}} = \frac{x}{10^j}
xnorm=10jx
j是使得所有数据点落在指定范围内的小数位数。如在一组数据中[1,2,300],则j取值为3,300被标准化为0.3
5.Robust 标准化
Robust 标准化(Robust Standardization)通过利用中位数和四分位距而不是均值和标准差,对异常值具有较好的鲁棒性,使得数据标准化后不易受到异常值的影响。优点包括对异常值的处理能力强,适用于数据中存在较多异常值的情况下。然而,Robust 标准化的缺点在于计算复杂度较高,对数据分布的形状要求较高。
x
norm
=
x
−
median
IQR
x_{\text{norm}} = \frac{x - \text{median}}{\text{IQR}}
xnorm=IQRx−median
median是数据的中位数,IQR是数据的四分位数间距,即上四分位数减去下四分位数。
\text{median} 是数据的中位数, \text{IQR}是数据的四分位数间距,即上四分位数减去下四分位数。
median是数据的中位数,IQR是数据的四分位数间距,即上四分位数减去下四分位数。
from sklearn.preprocessing import RobustScaler
import numpy as np
# 原始数据
data = np.array([[1, 2],
[3, 4],
[5, 6],
[1000, 2000]]) # 添加一个异常值
# 创建 RobustScaler 对象
scaler = RobustScaler()
# 对数据进行 Robust 标准化
scaled_data = scaler.fit_transform(data)
# 输出标准化后的数据
print("原始数据:\n", data)
print("\nRobust 标准化后的数据:\n", scaled_data)
6.向量长度标准化
向量长度标准化(Unit Vector Length Normalization)将数据向量转换为具有单位长度的向量,这种标准化方法可以消除不同数据的量纲带来的影响,同时保留了数据的方向信息。优点包括简单易实现、消除了量纲影响、保留了数据的相对方向关系,适用于需要考虑数据方向而忽略其大小的情况,如文本分类、图像识别等。这种标准化通常用于机器学习和数据分析中的特征向量标准化,以确保不同特征之间的尺度差异不会对模型产生不良影响,使得它们在模型中的影响更加平衡。
对于一个给定的向量
(
x
=
[
x
1
,
x
2
,
…
,
x
n
]
)
(\mathbf{x} = [x_1, x_2, \ldots, x_n])
(x=[x1,x2,…,xn]),它的长度或模长可以通过下式计算得到:
∥
x
∥
=
x
1
2
+
x
2
2
+
…
+
x
n
2
\lVert \mathbf{x} \rVert = \sqrt{x_1^2 + x_2^2 + \ldots + x_n^2}
∥x∥=x12+x22+…+xn2
公式为L2 范数,也称为欧几里得范数,在深度学习中也有用到,比如防止数据过拟合,会添加一个惩罚项。
要将向量长度标准化为1,我们可以简单地将每个分量除以向量的长度:
x
norm
=
x
∥
x
∥
=
[
x
1
∥
x
∥
,
x
2
∥
x
∥
,
…
,
x
n
∥
x
∥
]
\mathbf{x}_{\text{norm}} = \frac{\mathbf{x}}{\lVert \mathbf{x} \rVert} = \left[ \frac{x_1}{\lVert \mathbf{x} \rVert}, \frac{x_2}{\lVert \mathbf{x} \rVert}, \ldots, \frac{x_n}{\lVert \mathbf{x} \rVert} \right]
xnorm=∥x∥x=[∥x∥x1,∥x∥x2,…,∥x∥xn]
import numpy as np
# 原始数据向量
x = np.array([1, 2, 3])
# 计算向量的 L2 范数
norm_x = np.linalg.norm(x)
# 进行向量长度标准化
normalized_x = x / norm_x
# 输出标准化后的向量
print("原始向量:", x)
print("向量的 L2 范数:", norm_x)
print("向量长度标准化后的向量:", normalized_x)
7. Softmax 标准化
Softmax 标准化是一种常用的数学函数,通常应用于多分类问题中,用于将一个实数向量转化为表示概率分布的向量。Softmax 函数可以将每个元素的取值映射到 (0, 1) 区间,并且所有元素的和等于1,因此适合用来表示各个类别的概率。
对于给定的实数向量 ( z = [ z 1 , z 2 , … , z n ] ) ( \mathbf{z} = [z_1, z_2, \ldots, z_n] ) (z=[z1,z2,…,zn]),Softmax 函数的计算公式如下:
[ softmax ( z ) i = e z i ∑ j = 1 n e z j ] [ \text{softmax}(\mathbf{z})i = \frac{e^{z_i}}{\sum{j=1}^{n} e^{z_j}} ] [softmax(z)i=∑j=1nezjezi]
其中
(
softmax
(
z
)
i
)
( \text{softmax}(\mathbf{z})_i )
(softmax(z)i)表示 Softmax 函数输出向量的第 ( i ) 个元素。Softmax 函数通过对每个元素进行指数运算,并对所有元素的指数和归一化,得到一个概率分布向量。
Softmax 标准化常用于神经网络的输出层,将神经网络的输出转化为概率分布,便于进行分类任务的训练和预测。softmax函数在深度学习中扮演着非常重要的角色,被广泛应用于图像分类、自然语言处理等领域。
import numpy as np
def softmax(x):
"""
Softmax 标准化函数
参数:
x -- 输入的原始数据,是一个一维数组或矩阵
返回值:
s -- 经过 Softmax 标准化后的数据
"""
# 对输入数据进行指数运算
exp_x = np.exp(x)
# 对指数运算后的结果进行归一化
s = exp_x / np.sum(exp_x, axis=0)
return s
# 原始数据
x = np.array([1, 2, 3])
# 进行 Softmax 标准化
softmax_x = softmax(x)
# 输出标准化后的数据
print("原始数据:", x)
print("Softmax 标准化后的数据:", softmax_x)
8.log标准化
log标准化通常用于处理数据的偏度(skewness)和尾重(heavy-tailed)分布,使数据更加符合正态分布或者对称分布。该方法通过取数据的对数来压缩数据的范围,有时可以改善数据的分布特性。
对于一个给定的数据集
(
x
1
,
x
2
,
…
,
x
n
)
( {x_1, x_2, \ldots, x_n} )
(x1,x2,…,xn),log标准化可以通过以下公式来实现:
[ x norm = log ( x ) ] [ x_{\text{norm}} = \log(x) ] [xnorm=log(x)]
log标准化常用于处理右偏(正偏)分布的数据,即数据向较大值偏移。通过取对数,可以对数据进行压缩,使得极端值的影响减小,并且可以让数据更加接近对称分布。在某些情况下,log标准化也可以帮助数据更好地符合线性模型的假设。
但是,在进行log标准化时,需要确保原始数据中不包含负数或零,因为对数函数在这些数值上是未定义的。
import numpy as np
def log_normalize(data):
"""
对数(log)标准化函数
参数:
data -- 原始数据,是一个一维或二维的 NumPy 数组
返回值:
normalized_data -- 经过对数标准化后的数据
"""
# 对数标准化
normalized_data = np.log(data)
return normalized_data
# 原始数据
data = np.array([[1, 2, 3],
[4, 5, 6]])
# 对数标准化
log_normalized_data = log_normalize(data)
# 输出标准化后的数据
print("原始数据:\n", data)
print("\n对数标准化后的数据:\n", log_normalized_data)
总结
本文主要介绍了8种数据标准化的方法,具体解释了各个方法的原理以及优缺点,以帮助读者更好的理解掌握。一般情况下,通常会使用 Z-score 标准化与Min-Max 标准化,这两种方法简单实用,数学理论强,能适应大部分的数据集,同时在sklearn中有内置库,可以很方便的调用该方法。当然其他的方法也有很多优点,可以根据自己的数据集与分析目标,来选择合适的方法是最好的。有一些模型对数据要求并不高,比如随机森林等集成学习方法,当无法选择那种标准化方法时,可以尝试运用该方法建模。