问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

理解数据标准化处理

创作时间:
作者:
@小白创作中心

理解数据标准化处理

引用
CSDN
1.
https://m.blog.csdn.net/lihuayong/article/details/145488419

在机器学习中,数据预处理是构建高效模型的关键步骤之一。其中,数据标准化尤为重要,因为它有助于加速模型收敛、提高数值稳定性,并确保不同特征对模型的影响一致。本文介绍数据标准化的概念、方法及其重要性,并通过Python代码示例展示如何实现数据标准化。

一、数据预处理意义

  1. 提高模型性能
  • 梯度下降更快收敛:许多机器学习算法(如线性回归、逻辑回归、神经网络等)使用梯度下降方法来优化损失函数。如果特征的尺度差异很大,梯度下降可能会沿着某些方向移动得非常慢,导致收敛速度变慢。通过标准化,可以使梯度下降更快地收敛。
  • 避免过拟合:标准化有助于减少特征之间的相关性,从而降低模型的复杂度,减少过拟合的风险。
  1. 改善数值稳定性
  • 避免数值溢出:在某些算法中,特別是涉及矩阵运算和指数函数的算法,特征值的极端值可能导致数值溢出或下溢。标准化可以将特征值限制在一个合理的范围内,提高数值稳定性。
  • 提高计算效率:标准化后的数据通常更容易处理,计算效率更高。
  1. 统一特征尺度
  • 公平对待每个特征:在多特征数据集中,不同特征的尺度可能相差很大。如果不进行标准化,某些特征可能会主导模型的学习过程,而其他特征的影响会被忽略。标准化可以确保每个特征在模型中具有相同的影响力。
  • 距离计算更合理:在使用基于距离的算法(如K-近邻、K-均值聚类等)时,特征的尺度差异会影响距离的计算。标准化可以确保距离计算更加合理和公平。

数据表面上发生了变化,数据内部的信息仍然保留,只是改变了表示形式。

二、数据预处理算法

中心化:将数据减去其均值,使数据均值为0。
归一化:将数据压缩到[0, 1]范围内。
标准化:将数据减去均值并除以标准差,使数据均值为0,标准差为1。

2.1 原始数据

下面生成随机数据作为原始数据,把3种算法使用图形的方式呈现,看看实际效果

import numpy as np
from matplotlib import pyplot as plt

# 生成随机整数数组
scores = np.random.randint(low=0, high=101, size=(30,))
print(scores)

# 绘制原始数据
plt.plot(scores)
plt.title(label="original data")
plt.show()

此时scores输出为[ 58 59 16 43 50 76 10 23 9 7 69 37 45 76 37 40 43 9 42 15 47 97 28 97 29 15 16 100 95 23]

2.2 中心化

对之前生成的scores数据进行中心化处理,然后绘制并展示处理后的数据图表。

scores1 = scores - scores.mean()
plt.plot(scores1)
plt.title("Centered Data")
plt.show()

scores.mean():计算数组scores中所有元素的平均值。这里使用的是numpy数组的方法,它会返回数组中所有数值的算术平均值。
scores - scores.mean():对scores中的每个元素减去整个数组的平均值。这个操作的结果是一个新的数组,其每个元素都是原数组相应位置元素与平均值之差。这个过程称为中心化(或均值中心化),其效果是使新数组的均值为0。在数据预处理阶段,这种技术常用于去除数据的量纲、消除量纲影响等。

2.3 归一化

对一组数据进行归一化处理,并将处理后的结果绘制成图表。归一化是一种常见的数据预处理方法,它通过调整数据的尺度,使得所有数据点都位于一个特定的范围内(通常是[0, 1]或[-1, 1])

min_ = scores.min()
max_ = scores.max()

# 这行代码实现了归一化操作
scores2 = (scores - min_) / (max_ - min_)
plt.plot(scores2)
plt.title("Normalized Data")
plt.show()

scores.min():计算数组scores中的最小值,并将其赋值给变量min_。
scores.max():计算数组scores中的最大值,并将其赋值给变量max_。
这两个步骤是为了获取数据的范围,即数据中最小值和最大值,这在归一化过程中是必需的,因为我们需要知道数据的最大和最小界限来调整数据的尺度。
scores - min_:首先从每个数据点中减去最小值min_,这样可以确保数据集中的最小值变为0。
/ (max_ - min_):然后除以数据范围(即最大值减去最小值),这一步操作确保了数据集中最大的值变为1,其余值按比例缩放到[0, 1]之间。

2.4 标准化

mu = scores.mean()  # 结果 43.7
sigma = scores.std()  # 结果 28.40205391633969
scores3 = (scores - mu) / sigma
print(scores3)
plt.plot(scores3)
plt.title("Standardized Data")
plt.show()

原始数据集scores输出结果:
[ 58 59 16 43 50 76 10 23 9 7 69 37 45 76 37 40 43 9 42 15 47 97 28 97 29 15 16 100 95 23]

标准化之后的数据集scores3输出结果:
[ 0.50348471 0.53869344 -0.97528158 -0.0246461 0.22181494 1.1372417 -1.18653391 -0.72882053 -1.22174263 -1.29216007 0.89078065 -0.23589843 0.04577134 1.1372417 -0.23589843 -0.13027227 -0.0246461 -1.22174263 -0.05985483 -1.0104903 0.11618878 1.87662484 -0.55277692 1.87662484 -0.5175682 -1.0104903 -0.97528158 1.98225101 1.8062074 -0.72882053]

经过这种处理后的数据集会有以下特性:
均值为0:所有数据点减去均值后,新的数据集的平均值为0。
标准差为1:数据被缩放,使得新数据集的标准差为1,这代表每个数据点与均值的偏差平均而言是1个标准差单位。

怎么理解标准差为1?
当一个数据集的标准差为1时,它意味着:

  • 数据点相对于其均值的波动大小是以“标准差”为单位进行测量的。
  • 由于标准差为1,大约68%的数据点会落在距离均值正负1个单位的范围内,约95%的数据点会落在距离均值正负2个单位的范围内(基于正态分布的性质)。

假设有一个原始数据集,其均值为50,标准差为10。对其进行标准化处理后,得到的新数据集将有以下特性:

  • 新数据集的均值将是0。
  • 新数据集的标准差将是1。
    这意味着,如果原始数据中的某个值是60(比均值高10,也就是1个标准差),那么在标准化后的数据集中,该值将会转换为1(因为它是原数据集均值之上1个标准差)。

标准化公式的原理是什么

三、训练集标准化处理

实际项目中,需要对数据的训练集做标准化处理,手动计算均值和标准差进行标准化

# 从训练集中抽取预处理参数 mu 和 sigma
mu = X_train.mean(axis=0)  # 计算每个特征的平均值
sigma = X_train.std(axis=0)  # 计算每个特征的标准差

# 执行标准化操作
X_train = (X_train - mu) / sigma  # 对训练集进行标准化
X_test = (X_test - mu) / sigma  # 使用训练集的均值和标准差对测试集进行标准化

mean(axis=0):计算每个特征(列)的平均值。
std(axis=0):计算每个特征的标准差。
标准化公式 (X - mu) / sigma:将每个特征减去其均值后除以其标准差,使得数据具有零均值和单位方差。

注意,在实际应用中,总是使用训练集的统计量(如均值和标准差)来标准化测试集,这是为了避免信息泄露并确保模型泛化能力的有效评估。

也可以使用另外一种方式做标准化处理,使用StandardScale进行标准化处理

from sklearn.preprocessing import StandardScaler

# 创建一个 StandardScaler 实例
transfer = StandardScaler()

# 对训练集进行 fit_transform 操作
X_train_std_scl = transfer.fit_transform(X_train)

# 对测试集仅使用 transform 操作
X_test_std_scl = transfer.transform(X_test)

fit_transformtransform方法有什么区别?

  • fit_transform 方法同时执行了两个操作:
    fit:计算数据的均值和标准差。
    transform:使用计算出的均值和标准差对数据进行标准化处理。
    适用场景:训练数据:通常在训练数据上使用 fit_transform 方法,因为它既计算了均值和标准差,又对数据进行了标准化处理。

  • transform 方法仅执行一个transform操作,
    transform:使用已经计算好的均值和标准差对数据进行标准化处理。
    适用场景:测试数据:在对测试数据进行标准化处理时,应使用 transform 方法,而不是 fit_transform。这是因为测试数据应该使用训练数据的均值和标准差进行标准化,以保持一致性。

为什么测试数据应该使用训练数据的均值和标准差进行标准化?

这是为了确保模型在训练和测试阶段使用相同的数据分布,从而保持一致性和避免数据泄露。以下是几个主要原因:

  • 保持数据分布的一致性:训练和测试数据的一致性:模型是在训练数据上学习的,因此在测试阶段,测试数据应该与训练数据具有相同的数据分布。如果使用测试数据自身的均值和标准差进行标准化,可能会导致测试数据的分布与训练数据的分布不一致,从而影响模型的性能。
  • 避免数据泄露:如果在测试数据上使用 fit_transform 方法,那么测试数据的统计信息(均值和标准差)会被用来标准化数据。这意味着模型在某种程度上“看到了”测试数据的统计信息,这会导致数据泄露,使得模型在测试数据上的表现过于乐观,无法真实反映模型的泛化能力。
  • 避免过拟合的风险:如果测试数据的均值和标准差与训练数据的均值和标准差差异较大,模型可能会在测试数据上表现不佳。使用训练数据的均值和标准差进行标准化可以减少这种差异,从而降低过拟合的风险。
  • 现实世界的泛化能力 真实世界的预测:在实际应用中,模型将用于处理新的、未见过的数据。这些新数据的分布应该与训练数据的分布尽可能接近。使用训练数据的均值和标准差进行标准化可以更好地模拟这种实际情况,从而提高模型在真实世界中的泛化能力。

如何理解数据分布的一致性?
数据分布的一致性是指在训练数据和测试数据之间保持相似的统计特性,如均值、方差、分布形状等。这种一致性对于确保模型在训练和测试阶段的表现一致,以及在实际应用中具有良好的泛化能力至关重要。以下是对数据分布一致性的详细解释:

  • 训练数据和测试数据的相似性
    模型学习:模型在训练阶段通过学习训练数据的特征和模式来建立预测模型。如果训练数据和测试数据的分布不一致,模型在测试数据上的表现可能会大打折扣,因为它没有见过类似的分布。
    泛化能力:模型的泛化能力是指模型在未见过的新数据上的表现。如果测试数据的分布与训练数据的分布相似,模型在测试数据上的表现会更接近其在训练数据上的表现,从而提高泛化能力。

  • 避免数据泄露
    数据泄露:如果在标准化处理时使用了测试数据的统计信息(如均值和标准差),模型在某种程度上“看到了”测试数据的统计信息。这会导致数据泄露,使得模型在测试数据上的表现过于乐观,无法真实反映模型的泛化能力。
    独立性:测试数据应该完全独立于训练数据,这样才能真实评估模型的性能。使用训练数据的统计信息进行标准化可以确保这一点。

  • 现实世界的预测 实际应用:在实际应用中,模型将用于处理新的、未见过的数据。这些新数据的分布应该与训练数据的分布尽可能接近。使用训练数据的统计信息进行标准化可以更好地模拟这种实际情况,从而提高模型在真实世界中的泛化能力。

四、结论

数据标准化是机器学习中不可或缺的一步,它不仅能够提高模型的性能,还能确保模型在面对新数据时有更好的泛化能力。通过手动计算或使用 StandardScaler 等工具,我们可以轻松地对数据进行标准化处理。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号