专栏名称: 机器学习初学者
号主黄博Github全球排名前90,3.6万Star!致力于为初学者提供学习路线和基础资料,公众号可以当作随身小抄,文章很全,建议收藏!点击菜单可以进入学习!
目录
相关文章推荐
掌上铜山  ·  钙含量比牛奶还高!春天多吃这几种蔬菜 ·  10 小时前  
游戏研究社  ·  如何制作历史上最伟大的网游 ·  昨天  
51好读  ›  专栏  ›  机器学习初学者

【机器学习】通透!数据标准化与归一化 !!

机器学习初学者  · 公众号  ·  · 2025-02-03 11:00

正文

今儿和大家聊一个简单的话题: 数据标准化与归一化的区别与应用场景。

好像很简单,但是为了更加的清晰,从各方面和大家详细的聊聊~

数据标准化与数据归一化

数据标准化(Standardization)

  • 定义 :标准化是将数据转换为具有均值为 0 和标准差为 1 的标准正态分布。
  • 数学公式

其中 是原始数据, 是均值, 是标准差。

  • 操作结果 :经过标准化的数据没有单位限制,更适合基于距离或分布的算法。

数据归一化(Normalization)

  • 定义 :归一化是将数据按比例缩放到特定区间(通常为 [0,1] 或 [-1,1])。
  • 数学公式

其中 分别为数据的最小值和最大值。

  • 操作结果 :归一化后的数据保留了原始数值范围的比例关系。
对比项 标准化(Standardization) 归一化(Normalization)
核心目标 均值为 0,标准差为 1 缩放数据到固定区间
公式参数 均值和标准差 数据最小值和最大值
结果分布 标准正态分布 固定区间的比例缩放

适用场景

数据标准化的适用场景

  1. 机器学习算法对分布敏感 :标准化适合需要数据服从正态分布的算法,例如:
  • 主成分分析(PCA):需要将数据投影到低维空间时,假定变量具有相同的尺度。
  • 线性回归、逻辑回归:模型对特征分布敏感,标准化能提升收敛速度和准确性。
  • 基于距离的算法 :如 K-Means、支持向量机(SVM),需要平衡不同量纲特征的影响。
  • 数据归一化的适用场景

    1. 特征值范围差异显著 :归一化适合数据范围差异大的场景,避免较大值特征对模型的主导性影响。
    2. 深度学习 :神经网络通常以归一化的数据为输入,便于梯度下降优化快速收敛。
    算法类型 推荐方法 原因
    PCA、回归分析 标准化 需要均值为 0,标准差为 1 的特征分布
    KNN、SVM、K-Means 标准化 平衡不同量纲特征的距离权重
    神经网络、梯度下降优化 归一化 小范围特征更便于快速迭代

    优缺点

    数据标准化的优缺点

    • 优点
    1. 对异常值较为鲁棒(异常值不会像归一化那样对比例造成较大干扰)。
    2. 提升基于分布假设的模型表现(如 PCA、回归分析)。
  • 缺点
    1. 转换后的数据失去了原始的物理意义(如温度、价格等直观性)。
    2. 对非高斯分布的数据可能效果较差。

    数据归一化的优缺点

    • 优点
    1. 操作简单,范围固定,适合快速收敛的场景(如神经网络)。
    2. 能保留数据间比例关系。
  • 缺点
    1. 对异常值敏感,异常值可能过度影响缩放范围。
    2. 不适用于需要正态分布假设的模型。

    完整案例

    我们使用一个示例数据集,包含两个特征范围差异明显的列。

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    from sklearn.preprocessing import StandardScaler, MinMaxScaler

    # 创建数据集
    np.random.seed(42)
    data = {
        "Feature1": np.random.randint(110050),  # 范围较大
        "Feature2": np.random.rand(50) * 10,       # 范围较小
    }
    df = pd.DataFrame(data)

    # 原始数据分布
    plt.figure(figsize=(124))
    plt.subplot(121)
    plt.hist(df["Feature1"], bins=10, alpha=0.7, label="Feature1")
    plt.hist(df["Feature2"], bins=10, alpha=0.7, label="Feature2")
    plt.title("Original Data Distribution")
    plt.legend()

    plt.subplot(122)
    plt.boxplot([df["Feature1"], df["Feature2"]], labels=["Feature1""Feature2"])
    plt.title("Original Data Boxplot")
    plt.show()







    请到「今天看啥」查看全文