Python 4种方法对不同数量级数据归一化
在机器学习和数据处理过程中,对不同数量级的数据进行归一化是一项重要的预处理步骤。归一化可以将数据缩放到同一范围,避免某些特征因数值较大而主导模型训练。
Python 提供了多种方法对数据进行归一化,以下介绍一些常用的归一化方法以及python实现。
①MinMaxScaler:将所有数据缩放到0到1的范围,保留了每列数据的比例关系。
原理:通过线性变换将数据压缩到[0, 1]区间,公式为:
优点:保留原始数据分布,简单直观。
缺点:对异常值非常敏感,异常值会极大地影响缩放效果。
②StandardScaler:对数据进行标准化,使其均值为0,标准差为1,适用于假设数据符合正态分布的情况。
原理:对数据进行标准化处理,使其均值为0,标准差为1,公式为:
其中,μ为均值,σ为标准差。
优点:适合正态分布数据,消除量纲影响。
缺点:对非正态分布的数据表现一般。
③MaxAbsScaler:按每列数据的最大绝对值进行缩放,保留了数据的稀疏性。
原理:根据每列数据的最大绝对值进行缩放,使数据范围在[-1, 1]之间,公式为:
优点:适合稀疏数据,保留稀疏性。
缺点:对异常值依然敏感。
④RobustScaler:对数据的中位数和四分位距进行缩放,减少异常值对归一化的影响。
原理:基于中位数和四分位间距(IQR)对数据进行缩放,公式为:
其中,IQR为第75百分位数减去第25百分位数。
优点:对异常值有较强的鲁棒性。
缺点:对于分布极端不均的数据,效果可能不理想。
下面是归一化的Python程序:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler, StandardScaler, MaxAbsScaler, RobustScaler
# 生成不同数量级的数据
def generate_data():
np.random.seed(42)
data1 = np.random.randint(1, 10, 100) # 数量级1-10
data2 = np.random.randint(100, 1000, 100) # 数量级100-1000
data3 = np.random.randint(10000, 100000, 100) # 数量级10000-100000
return np.vstack((data1, data2, data3)).T
# 归一化方法
def apply_normalization(data):
scalers = {
"MinMaxScaler": MinMaxScaler(), # 将数据线性缩放到[0, 1]区间
"StandardScaler": StandardScaler(), # 标准化(z-score),均值为0,标准差为1
"MaxAbsScaler": MaxAbsScaler(), # 以最大绝对值缩放,范围[-1, 1]
"RobustScaler": RobustScaler(), # 使用中位数和IQR缩放,减少异常值影响
}
return {name: scaler.fit_transform(data) for name, scaler in scalers.items()}
# 绘图函数
def plot_normalization(data, methods):
fig, axs = plt.subplots(len(methods) + 1, 1, figsize=(12, 18))
# 原始数据
axs[0].plot(data, alpha=0.7)
axs[0].set_title("Original Data (Different Scales)")
axs[0].grid(True)
# 绘制归一化后的数据
for i, (name, norm_data) in enumerate(methods.items(), start=1):
axs[i].plot(norm_data, alpha=0.7)
axs[i].set_title(f"Data Normalized with {name}")
axs[i].grid(True)
plt.tight_layout()
plt.show()
# 主程序
if __name__ == "__main__":
data = generate_data() # 生成数据
normalized_data = apply_normalization(data) # 归一化处理
plot_normalization(data, normalized_data) # 显示结果
效果如下: