简介
数据特征的标准化和归一化是数据预处理中常见的两种数据转换技术,它们的目的是使数据符合某种分布或范围,从而更适合于某些数据挖掘算法的使用。
标准化(Standardization)
也称为 Z-score 标准化
公式: z = x − μ σ z = \frac{x - \mu}{\sigma} z=σx−μ
其中 z z z 是标准化后的数值, x x x 是原始数值, μ \mu μ 是特征的平均值, σ \sigma σ 是特征的标准差
标准化后,数据的分布具有 0 均值和 1 标准差的标准正态分布
常用于需要对特征进行比较的场景,如距离计算、回归分析等
为什么需要标准化
消除特征量纲的差异
不同特征可能有不同的量纲和取值范围,这会影响一些算法的性能。
标准化可以将所有特征转换到同一量纲,取值范围通常为标准正态分布 N(0, 1)。
提高算法收敛速度
很多机器学习算法,如梯度下降法,对于特征量纲敏感。
标准化可以使所有特征的重要性相当,从而提高算法的收敛速度。
防止数值溢出
一些算法,如逻辑回归和神经网络,对输入数据的数值大小很敏感。
标准化可以将数据映射到合适的范围,避免数值溢出的问题。
增强算法稳定性
标准化后,各特征对模型的影响力将更加均衡,避免某些特征主导预测结果。
这有助于提高算法的泛化能力和稳定性。
辅助特征选择和权重确定
标准化后,各特征的重要性可以通过权重大小直观地比较。
这对于特征选择和确定特征权重很有帮助。
标准化(Standardization)的常见方法
Z-score 标准化
公式: z = x − μ σ z = \frac{x - \mu}{\sigma} z=σx−μ
其中 z z z 是标准化后的数值, x x x 是原始数值, μ \mu μ 是特征的平均值, σ \sigma σ 是特征的标准差
标准化后,数据服从标准正态分布 N(0, 1)
import numpy as npX = np.array([1, 2, 3, 4, 5])
X_scaled = (X - np.mean(X)) / np.std(X)
print(X_scaled)
# Output: [-1.41421356 -0.70710678 0.0 0.70710678 1.41421356]
Min-Max 标准化
公式: z = x − m i n ( x ) m a x ( x ) − m i n ( x ) z = \frac{x - min(x)}{max(x) - min(x)} z=max(x)−min(x)x−min(x)
将数据线性映射到 [0, 1] 区间
与归一化的公式类似,但结果不完全一致
import numpy as npX = np.array([1, 2, 3, 4, 5])
X_scaled = (X - np.min(X)) / (np.max(X) - np.min(X))
print(X_scaled)
# Output: [0. 0.25 0.5 0.75 1. ]
Mean-Variance 标准化
公式: z = x − x ˉ s z = \frac{x - \bar{x}}{s} z=sx−xˉ
其中 x ˉ \bar{x} xˉ 是样本均值, s s s 是样本标准差
与 Z-score 标准化类似,但不需要知道总体参数
import numpy as np# 假设有一个特征X
X = np.array([1, 2, 3, 4, 5])# Mean-Variance 标准化
X_scaled = (X - np.mean(X)) / np.std(X)print(X_scaled)
# Output:
# [-1.41421356 -0.70710678 0. 0.70710678 1.41421356]
让我们一步一步分析这个代码:
首先我们导入 numpy 库,用于进行数值计算。
假设我们有一个特征 X,包含 5 个数据点。
对 X 进行 Mean-Variance 标准化:
计算 X 的均值 np.mean(X)
计算 X 的标准差 np.std(X)
然后对每个数据点执行 (x - mean(X)) / std(X) 的计算
最终输出标准化后的结果 X_scaled。
这种标准化方法将数据转换为以 0 为中心、标准差为 1 的分布,这在很多机器学习算法中都非常有用。它可以帮助提高算法的收敛速度和稳定性。
Robust 标准化
公式: z = x − m e d i a n ( x ) I Q R ( x ) z = \frac{x - median(x)}{IQR(x)} z=IQR(x)x−median(x)
中位数和四分位数范围代替了均值和标准差
对异常值更加鲁棒
import numpy as npX = np.array([1, 2, 3, 4, 5, 100])
X_scaled = (X - np.median(X)) / (np.percentile(X, 75) - np.percentile(X, 25))
print(X_scaled)
# Output: [-0.5 -0.25 0. 0.25 0.5 2.75]
Quantile 标准化
将数据映射到标准正态分布的对应分位数
可以使数据服从任意目标分布
import numpy as np
from scipy.stats import normX = np.array([1, 2, 3, 4, 5])
X_scaled = norm.ppf(np.percentile(X, np.linspace(0, 100, len(X))))
print(X_scaled)
# Output: [-1.33996439 -0.67448975 0. 0.67448975 1.33996439]
标准化的常用模块
scikit-learn (sklearn)
这是一个强大的机器学习库,提供了丰富的标准化方法。
主要包括 StandardScaler、MinMaxScaler、RobustScaler 等。
使用简单,适用于大多数标准化需求。
from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler# Z-score 标准化
X = [[1, 2, 3], [4, 5, 6]]
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
print(X_scaled)
# Output: [[-1.22474487 -1.22474487 -1.22474487], [1.22474487 1.22474487 1.22474487]]# Min-Max 标准化
X = [[1, 2, 3], [4, 5, 6]]
scaler = MinMaxScaler()
X_scaled = scaler.fit_transform(X)
print(X_scaled)
# Output: [[0. 0. 0. ], [1. 1. 1. ]]# Robust 标准化
X = [[1, 2, 3], [4, 5, 6], [90, 100, 110]]
scaler = RobustScaler()
X_scaled = scaler.fit_transform(X)
print(X_scaled)
# Output: [[-0.66666667 -0.66666667 -0.66666667], [-0.33333333 -0.33333333 -0.33333333], [1. 1. 1. ]]
statsmodels:
这是一个统计建模和分析的库。
提供了standardize()函数,可以进行均值中心化和方差标准化。
与 sklearn 相比,更侧重于统计分析。
import numpy as np
from statsmodels.tools.tools import add_constant, standardize# 标准化
X = np.array([[1, 2, 3], [4, 5, 6]])
X_scaled = standardize(X)
print(X_scaled)
# Output: [[-1.22474487 -1.22474487 -1.22474487], [1.22474487 1.22474487 1.22474487]]
numpy:
NumPy 是Python的一个重要数值计算库。
可以使用 (X - X.mean()) / X.std() 实现 Z-score 标准化。
灵活性高,可以根据需求自行编写标准化代码。
import numpy as np# Z-score 标准化
X = np.array([[1, 2, 3], [4, 5, 6]])
X_scaled = (X - X.mean(axis=0)) / X.std(axis=0)
print(X_scaled)
# Output: [[-1.22474487 -1.22474487 -1.22474487], [1.22474487 1.22474487 1.22474487]]
pandas:
Pandas 是Python中数据分析和操作的主要库。
提供了 (df - df.mean()) / df.std() 的标准化方法。
与 sklearn 相比,在处理DataFrame数据时更加方便。
import pandas as pd# 读取数据
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})# 标准化
df_scaled = (df - df.mean()) / df.std()
print(df_scaled)
# A B
# 0 -1.224745 -1.224745
# 1 -0.408248 -0.408248
# 2 1.632993 1.632993
scipy.stats:
SciPy 是Python科学计算的核心库,包含了 stats 子模块。
可以使用 scipy.stats.zscore(X) 实现 Z-score 标准化。
在处理概率分布和统计分析时很有用。
import numpy as np
from scipy.stats import zscore# Z-score 标准化
X = np.array([[1, 2, 3], [4, 5, 6]])
X_scaled = zscore(X, axis=0)
print(X_scaled)
# Output: [[-1.22474487 -1.22474487 -1.22474487], [1.22474487 1.22474487 1.22474487]]