技术交流28群

服务热线

135-6963-3175

微信服务号

数据预处理之归一化 更新时间 2023-11-10 浏览2285次

什么是归一化?

      归一化是一种数据预处理技术,旨在将特征数据缩放到一个特定的范围内,通常是 0 到 1 或 -1 到 1 之间。这样做的目的是消除特征之间的量纲差异,以便更好地适应某些机器学习算法。

      举个例子来说明归一化的意思。假设你有一个包含房屋面积(以平方英尺为单位)和房价(以美元为单位)的数据集,数据如下:

房屋面积   房价
1500    200000
2000    250000
1200    180000

      在这个例子中,房屋面积的范围是 1200 到 2000 平方英尺,而房价的范围是 180,000 到 250,000 美元。这两个特征的量纲差异很大,可能会对某些机器学习算法产生影响。

      为了解决这个问题,你可以使用归一化将两个特征缩放到 0 到 1 或 -1 到 1 的范围内。使用 Min-Max 归一化方法可以实现这一目标。经过归一化处理后的数据如下:

房屋面积   房价
0.333    0.444
1.000    1.000
0.000    0.000

      在归一化后的数据中,房屋面积和房价的值都位于 0 到 1 的范围内,消除了量纲差异。这样,在使用归一化后的数据进行机器学习模型的训练时,模型能够更好地处理这些特征,不会因为量纲差异而对特征产生不恰当的权重影响。

      归一化是预处理数据的一种常见方法,可以应用于各种机器学习任务,包括回归问题、分类问题等。

特征之间的量纲差异是什么呢?

      特征之间的量纲差异是指不同特征的取值范围或单位之间的差异。当特征之间的量纲差异很大时,可能会对某些机器学习算法产生影响,导致模型无法准确地学习特征之间的关系。

      举个例子来说明特征之间的量纲差异。假设你有一个汽车数据集,其中包含以下两个特征:车速(以公里/小时为单位)和车龄(以年为单位)。数据如下所示:

车速   车龄
100   3
60    5
120   1

      在这个例子中,车速的范围是 60 到 120 公里/小时,而车龄的范围是 1 到 5 年。这两个特征的量纲差异很大,车速的值通常在 60 到 120 之间,而车龄的值通常在 1 到 5 之间。

      如果不对这两个特征进行归一化处理,某些机器学习算法可能会受到量纲差异的影响。例如,如果你使用基于欧几里德距离的算法(如 KNN)来计算样本之间的相似度,车速这个特征的影响将远大于车龄,因为车速的数值范围更大。这可能导致模型过度依赖车速特征,而无法正确地学习车速和车龄之间的关系。

      通过归一化处理,将车速和车龄缩放到相同的范围内,可以消除特征之间的量纲差异,使得模型能够更好地学习特征之间的关系,减少量纲差异对模型的影响。

如何进行归一化计算处理?

归一化计算处理可以使用不同的方法,其中最常见的方法是使用最小-最大归一化(Min-Max Normalization)和标准化(Standardization)。

1、最小-最大归一化(Min-Max Normalization):

     最小-最大归一化将数据缩放到指定的范围内,通常是 0 到 1 或 -1 到 1。具体计算步骤如下:

    对于每个特征,找到最小值(min)和最大值(max)。

    对于每个特征的每个值,使用以下公式进行归一化计算:

normalized_value = (value - min) / (max - min)

    归一化后的值将在指定范围内,例如 0 到 1 或 -1 到 1。

  举例:

    假设你有一个包含房屋面积和房屋价格的数据集,如下所示:     

面积   价格
150    500000
200    600000
120    400000

要对这些数据进行最小-最大归一化计算,可以按照以下步骤进行操作:

1.1 找到每个特征的最小值(min)和最大值(max)。

import numpy as np
# 创建一个包含面积和价格数据的 NumPy 数组
data = np.array([[150, 500000], [200, 600000], [120, 400000]])
# 找到面积和价格的最小值和最大值
min_value = np.min(data, axis=0)
max_value = np.max(data, axis=0)

在这个例子中,min_value 是一个包含面积和价格的最小值数组,max_value 是一个包含面积和价格的最大值数组。

1.2 对每个特征的每个值进行最小-最大归一化计算。

# 对每个特征的每个值进行最小-最大归一化计算
normalized_data = (data - min_value) / (max_value - min_value)

在这个例子中,normalized_data 是一个与原始数据具有相同形状的数组,其中的值经过最小-最大归一化处理。

最小-最大归一化后的数据如下所示:


面积    价格
0.375  0.5
1.0    1.0
0.0    0.0

在最小-最大归一化后的数据中,面积和价格的值都被缩放到 0 到 1 的范围内。

通过最小-最大归一化处理,可以将不同特征的值缩放到相同的范围内,消除量纲差异,使得数据更适合某些机器学习算法的使用。

2、标准化(Standardization):

    标准化将数据转换为具有零均值和单位方差的分布。具体计算步骤如下:

    对于每个特征,计算均值(mean)和标准差(standard deviation)。

    对于每个特征的每个值,使用以下公式进行标准化计算:

standardized_value = (value - mean) / standard_deviation

      标准化后的值将具有均值为 0,标准差为 1 的分布。

      这些归一化方法可以使用各种编程语言和库来实现,例如 Python 中的 sklearn.preprocessing 模块。你可以根据自己的需求和数据特点选择适合的归一化方法。

      值得注意的是,在进行归一化处理之前,你应该先确定是否需要对数据进行归一化,以及选择合适的归一化方法,这取决于数据的分布和机器学习算法的要求。

例子:

假设你有一个包含身高(以厘米为单位)和体重(以千克为单位)的数据集,如下所示:

身高   体重
170   65
165   60
180   75

要对这些数据进行标准化计算,可以按照以下步骤进行操作:

2.1 计算每个特征的均值和标准差。

import numpy as np
# 创建一个包含身高和体重数据的 NumPy 数组
data = np.array([[170, 65], [165, 60], [180, 75]])
# 计算均值和标准差
mean = np.mean(data, axis=0)
std = np.std(data, axis=0)

在这个例子中,mean 是一个包含身高和体重的均值数组,std 是一个包含身高和体重的标准差数组。

2.2 对每个特征的每个值进行标准化计算。

#对每个特征的每个值进行标准化计算
normalized_data = (data - mean) / std

在这个例子中,normalized_data 是一个与原始数据具有相同形状的数组,其中的值经过标准化处理。

标准化后的数据如下所示:

身高         体重
-0.267  -0.267
-1.069  -1.069
1.336   1.336

在标准化后的数据中,身高和体重的值都具有均值为 0,标准差为 1 的分布。

通过标准化处理,数据的单位和范围被转换为相对的标准差单位,使得不同特征之间具有可比性,更适合某些机器学习算法的使用。