Python 4种方法对不同数量级数据归一化

liftword4个月前 (01-10)技术文章43

在机器学习和数据处理过程中,对不同数量级的数据进行归一化是一项重要的预处理步骤。归一化可以将数据缩放到同一范围,避免某些特征因数值较大而主导模型训练。

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)  # 显示结果

效果如下:


相关文章

在Python中将函数作为参数传入另一个函数中

在我们的Python学习中,我们学到的众多令人瞠目结舌的事实之一是,你可以将函数传入其他函数。你可以来回传递函数,因为在Python中,函数是对象。在使用Python的第一周,你可能不需要了解这些,但...

【Python时序数据系列】基于GRU模型时序数据二分类(案例+源码)

这是我的第371篇原创文章。一、引言前面我介绍了单变量时序预测和多变量时序预测,都是回归任务。相关链接:时序预测系列文章本文将介绍时序分类任务-基于GRU模型进行时序数据二分类。二、实现过程2.1 准...

【Python时序预测系列】一文搞明白时序数据输入到LSTM模型的格式

这是我的第276篇原创文章。一、引言前面我介绍了多个方法实现单变量和多变量时序数据的单站点单步预测,好多小伙伴最近问我这个LSTM模型数据的输入的格式是怎么样的,今天我专门写一篇文章来聊一聊这个问题,...

在 Python中处理大型机器学习数据集的简单方法

本文的目标受众:想要对大量数据集执行 Pandas/NumPy 操作的人。希望使用Python在大数据上执行机器学习任务的人。本文将使用 .csv 格式的文件来演示 python 的各种操作,其他格式...

147.Python——图像预处理操作:缩放和裁剪

在人工智能计算机视觉任务中,经常需要对图像进行预处理操作,比如,在图像分类任务中,我们需要训练图像数据大小一般为:224*224,416*416等,但在实际给的图像数据大小并不是这样的大小,所以需要需...