首页 > 其他分享 >三、归一化与标准化

三、归一化与标准化

时间:2024-10-23 20:18:38浏览次数:3  
标签:20 30000 Age 34.4 标准化 归一化 frac 55400


归一化与标准化


前言

  • 特征的单位或者大小相差较大,或者某特征的方差相比其他的特征要大出几个数量级容易影响(支配)目标结果,使得一些模型(算法)无法学习到其它的特征。
  • 所以我们需要对特征进行预处理,让不同特征在同一尺度下进行比较,从而避免因特征值大小差异而导致的模型训练偏倚。

一、最小最大值归一化

1.1 原理(公式)

  • 这种方法将特征值缩放到指定的区间内,默认是0到1之间。计算公式如下:
    x n o r m = x − m i n ( x ) m a x ( x ) − m i n ( x ) x_{norm} = \frac{x-min(x)}{max(x)-min(x)} xnorm​=max(x)−min(x)x−min(x)​
  • 如果需要缩放至其他区间[a, b],则可以使用:
    x n o r m = a + ( x − m i n ( x ) m a x ( x ) − m i n ( x ) ) ⋅ ( b − a ) x_{norm} = a + (\frac{x-min(x)}{max(x)-min(x)}) \cdot (b-a) xnorm​=a+(max(x)−min(x)x−min(x)​)⋅(b−a)

1.2 API 介绍

  • sklearn.preprocessing.MinMaxScaler ( )

1.2.1 参数介绍

  • feature_range:tuple (min, max), default=(0, 1)
    • 描述:这个参数用于设定缩放的范围。默认情况下,数据会被缩放到 [0, 1] 范围内。但用户可以根据需要设定其他范围,例如 [-1, 1]。
    • 作用:通过调整缩放范围,可以对数据的分布进行更精细的控制,以适应不同的机器学习算法和数据特点。
  • copy:boolean, optional, default=True
    • 描述:这个参数用于指定是否将转换后的数据覆盖原数据。如果设置为 True,则不会修改原始数据,而是返回一个新的缩放后的数据数组。如果设置为 False,则会在原地修改原始数据。
    • 作用:通过控制是否覆盖原数据,可以保护原始数据的完整性,避免在数据处理过程中发生数据丢失或修改。
  • clip:boolean, optional, default=False
    • 描述:clip 参数是一个布尔值,用于控制是否对变换后的数据进行裁剪。
    • 作用:当 clip=True 时,变换后的数据将被裁剪到指定的范围内,确保数据的一致性和有效性;当 clip=False 时,变换后的数据可能超出指定的范围,这需要根据具体情况来决定是否启用裁剪功能。

1.2.2 属性介绍

在 MinMaxScaler 类中,还有一些重要的属性,用于存储缩放过程中的相关信息:

  • min_:ndarray of shape (n_features,)
    • 描述:存储每个特征调整后的最小值。
  • scale_:ndarray of shape (n_features,)
    • 描述:存储每个特征数据缩放的比例。这个比例是通过计算特征的最大值和最小值之差,然后除以指定的缩放范围(feature_range)来得到的。
  • data_min_ 和 data_max_:ndarray of shape (n_features,)
    • 描述:分别存储每个特征在训练数据中的最小值和最大值。这些值是在调用 fit 或 fit_transform 方法时计算得到的。

1.2.3 注意事项

  • 归一化受到最大值与最小值的影响,这种方法容易受到异常数据的影响, 鲁棒性较差,适合传统精确小数据场景

1.2.4 代码演示

代码如下(示例):

# 导包
from sklearn.preprocessing import MinMaxScaler  # 归一化的类

# 1. 准备特征数据.  每个子列表 = 1个样本(Sample)
data = [[90, 2, 10, 40], [60, 4, 15, 45], [75, 3, 13, 46]]

# 2. 创建归一化对象.
transfer = MinMaxScaler()

# 3. 具体的 归一化动作.
# fit_transform(): 训练 + 转换 => 适用于 训练集.
# transform(): 直接转换 => 适用于 测试集.
new_data = transfer.fit_transform(data)

# 4. 打印 归一化后的结果
print(f'归一化后, 数据集为: {new_data}') #  [[1.         0.         0.         0.        ]
 										#	[0.         1.         1.         0.83333333]
										#	[0.5        0.5        0.6        1.        ]]

1.3 举例说明

  • 1.有以下一个数据集,包含两个特征:年龄(Age)和收入(Income)。我们希望这两个特征进行归一化处理。
AgeIncome
2030000
2232000
3555000
4575000
5085000
  • 2.我们将年龄和收入都归一化到0到1的范围内。

    • 2.1 年龄归一化:
      A g e n o r m = A g e − m i n ( A g e ) m a x ( A g e ) − m i n ( A g e ) Age_{norm} = \frac{Age-min(Age)}{max(Age)-min(Age)} Agenorm​=max(Age)−min(Age)Age−min(Age)​

      • A g e n o r m = 20 − 20 50 − 20 = 0 Age_{norm} = \frac{20-20}{50-20} = 0 Agenorm​=50−2020−20​=0
      • A g e n o r m = 22 − 20 50 − 20 = 0.0667 Age_{norm} = \frac{22-20}{50-20} = 0.0667 Agenorm​=50−2022−20​=0.0667
      • A g e n o r m = 35 − 20 50 − 20 = 0.5 Age_{norm} = \frac{35-20}{50-20} = 0.5 Agenorm​=50−2035−20​=0.5
      • A g e n o r m = 45 − 20 50 − 20 = 0.8333 Age_{norm} = \frac{45-20}{50-20} = 0.8333 Agenorm​=50−2045−20​=0.8333
      • A g e n o r m = 50 − 20 50 − 20 = 1 Age_{norm} = \frac{50-20}{50-20} = 1 Agenorm​=50−2050−20​=1
    • 2.2 收入归一化:
      I n c o m e n o r m = I n c o m e − m i n ( I n c o m e ) m a x ( I n c o m e ) − m i n ( I n c o m e ) Income_{norm} = \frac{Income-min(Income)}{max(Income)-min(Income)} Incomenorm​=max(Income)−min(Income)Income−min(Income)​

      • I n c o m e n o r m = 30000 − 30000 85000 − 30000 = 0 Income_{norm} = \frac{30000-30000}{85000-30000} = 0 Incomenorm​=85000−3000030000−30000​=0
      • I n c o m e n o r m = 32000 − 30000 85000 − 30000 = 0.0364 Income_{norm} = \frac{32000-30000}{85000-30000} = 0.0364 Incomenorm​=85000−3000032000−30000​=0.0364
      • I n c o m e n o r m = 55000 − 30000 85000 − 30000 = 0.4545 Income_{norm} = \frac{55000-30000}{85000-30000} = 0.4545 Incomenorm​=85000−3000055000−30000​=0.4545
      • I n c o m e n o r m = 75000 − 30000 85000 − 30000 = 0.8182 Income_{norm} = \frac{75000-30000}{85000-30000} = 0.8182 Incomenorm​=85000−3000075000−30000​=0.8182
      • I n c o m e n o r m = 85000 − 30000 85000 − 30000 = 1 Income_{norm} = \frac{85000-30000}{85000-30000} = 1 Incomenorm​=85000−3000085000−30000​=1
  • 3 原数据集就会变成下面这样

AgeIncome
00
0.06670.0364
0.50.4545
0.83330.8182
11

二、标准化

2.1 原理(公式)

  • 标准化是将特征值转换为具有零均值和单位方差的形式。计算公式如下:
    x s t d = x − μ σ x_{std} = \frac{x-μ}{σ} xstd​=σx−μ​
  • 其中, μ μ μ 是特征的平均值, σ σ σ 是特征的标准差。

2.2 API 介绍

  • sklearn.preprocessing.StandardScaler( )

2.2.1 参数介绍

  • copy:类型:布尔值(Boolean);默认值:True
    • 说明:如果设置为 True,则会在操作后创建数据的副本,不会修改原始数据。如果设置为 False,则不会创建副本,操作后会直接替换原始数据。
  • with_mean:类型:布尔值(Boolean);默认值:True
    • 说明:如果设置为 True,则在转换数据时会减去均值(即进行中心化)。如果设置为 False,则不会在转换时减去均值,但 fit 操作仍然会计算均值,并可以通过 mean_ 属性查看。
  • with_std:类型:布尔值(Boolean);默认值:True
    • 说明:如果设置为 True,则在转换数据时会除以标准差(即进行缩放)。如果设置为 False,则不会在转换时除以标准差,但 fit 操作仍然会计算标准差,并可以通过 scale_ 属性查看。

2.2.2 属性介绍

  • scale_
    • 存放每个特征的标准差,是一个列表,长度为特征数。
  • mean_:
    • 存放每个特征的均值,是一个列表,长度为特征数。
  • var_
    • 存放每个特征的方差,是一个列表,长度为特征数。
  • feature_names_in_
    • 存放特征的名字,只有导入的数据中有特征名字时才会被定义。
  • n_samples_seen_
    • 导入样本数据的个数。

2.2.3 注意事项

  • 对于标准化来说,如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大。

2.2.4 代码演示

代码如下(示例):

from sklearn.preprocessing import StandardScaler

# 1. 准备特征数据.  每个子列表 = 1个样本(Sample)
data = [[90, 2, 10, 40], [60, 4, 15, 45], [75, 3, 13, 46]]

# 2. 创建 标准化 对象.
transfer = StandardScaler()

# 3. 具体的 标准化 动作.
# fit_transform(): 训练 + 转换 => 适用于 训练集.
# transform(): 直接转换 => 适用于 测试集.
new_data = transfer.fit_transform(data)

# 4. 打印 标准化 后的结果
print(f'标准化后, 数据集为: {new_data}')

# 5. 打印每个特征列的 平均值 和 方差 和 标准差
print(f'均值: {transfer.mean_}')
print(f'方差: {transfer.var_}')
print(f'标准差: {transfer.scale_}')
print(f'样本数: {transfer.n_samples_seen_}')

2.3 举例说明

  • 1.有以下一个数据集,包含两个特征:年龄(Age)和收入(Income)。我们希望这两个特征进行归一化处理。
AgeIncome
2030000
2232000
3555000
4575000
5085000
  • 2.我们将年龄和收入标准化到具有零均值和单位方差的形式。

    • 2.1 年龄标准化:
      x s t d = x − μ σ x_{std} = \frac{x-μ}{σ} xstd​=σx−μ​
      μ A g e = 20 + 22 + 35 + 45 + 50 5 = 34.4 μ_{Age} = \frac{20+22+35+45+50}{5} = 34.4 μAge​=520+22+35+45+50​=34.4
      σ A g e = ( 20 − 34.4 ) 2 + ( 22 − 34.4 ) 2 + ( 35 − 34.4 ) 2 + ( 45 − 34.4 ) 2 + ( 50 − 34.4 ) 2 5 = 142.8856 ≈ 11.9536 σ_{Age} = \sqrt{\frac{(20-34.4)^2+(22-34.4)^2+(35-34.4)^2+(45-34.4)^2+(50-34.4)^2}{5}} = \sqrt{142.8856} ≈ 11.9536 σAge​=5(20−34.4)2+(22−34.4)2+(35−34.4)2+(45−34.4)2+(50−34.4)2​ ​=142.8856 ​≈11.9536

      • A g e s t d = 20 − 34.4 11.9536 ≈ − 1.2047 Age_{std} = \frac{20-34.4}{11.9536} ≈ -1.2047 Agestd​=11.953620−34.4​≈−1.2047
      • A g e s t d = 22 − 34.4 11.9536 ≈ − 1.037 Age_{std} = \frac{22-34.4}{11.9536} ≈ -1.037 Agestd​=11.953622−34.4​≈−1.037
      • A g e s t d = 35 − 34.4 11.9536 ≈ 0.0502 Age_{std} = \frac{35-34.4}{11.9536} ≈ 0.0502 Agestd​=11.953635−34.4​≈0.0502
      • A g e s t d = 45 − 34.4 11.9536 ≈ 0.8868 Age_{std} = \frac{45-34.4}{11.9536} ≈ 0.8868 Agestd​=11.953645−34.4​≈0.8868
      • A g e s t d = 50 − 34.4 11.9536 ≈ 1.3050 Age_{std} = \frac{50-34.4}{11.9536} ≈ 1.3050 Agestd​=11.953650−34.4​≈1.3050
    • 2.2 收入标准化:
      μ I n c o m e = 30000 + 32000 + 55000 + 75000 + 85000 ​ 5 = 55 , 400 μ_{Income} = \frac{30000+32000+55000+75000+85000​}{5} = 55,400 μIncome​=530000+32000+55000+75000+85000​​=55,400
      σ I n c o m e = ( 30000 − 55400 ) 2 + ( 32000 − 55400 ) 2 + ( 55000 − 55400 ) 2 + ( 75000 − 55400 ) 2 + ( 85000 − 55400 ) 2 5 = 486176800 ≈ 22049 σ_{Income} = \sqrt{\frac{(30000-55400)^2+(32000-55400)^2+(55000-55400)^2+(75000-55400)^2+(85000-55400)^2}{5}} = \sqrt{486176800} ≈ 22049 σIncome​=5(30000−55400)2+(32000−55400)2+(55000−55400)2+(75000−55400)2+(85000−55400)2​ ​=486176800 ​≈22049

      • I n c o m e n o r m = 30000 − 55400 22049 = − 1.1520 Income_{norm} = \frac{30000-55400}{22049} = -1.1520 Incomenorm​=2204930000−55400​=−1.1520
      • I n c o m e n o r m = 32000 − 55400 22049 = − 1.0613 Income_{norm} = \frac{32000-55400}{22049} = -1.0613 Incomenorm​=2204932000−55400​=−1.0613
      • I n c o m e n o r m = 55000 − 55400 22049 = − 0.0181 Income_{norm} = \frac{55000-55400}{22049} = -0.0181 Incomenorm​=2204955000−55400​=−0.0181
      • I n c o m e n o r m = 75000 − 55400 22049 = 0.8889 Income_{norm} = \frac{75000-55400}{22049} = 0.8889 Incomenorm​=2204975000−55400​=0.8889
      • I n c o m e n o r m = 85000 − 55400 22049 = 1.3425 Income_{norm} = \frac{85000-55400}{22049} = 1.3425 Incomenorm​=2204985000−55400​=1.3425
  • 3 原数据集就会变成下面这样

AgeIncome
-1.2047-1.1520
-1.037-1.0613
0.0502-0.0181
0.88680.8889
1.30501.3425

三、案例代码:利用KNN算法进行鸢尾花分类

代码如下(示例):

# 0.导入工具包
from sklearn.datasets import load_iris
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score

# 1.加载数据集
iris_data = load_iris()
# print(iris_data)
# print(iris_data.target)


# 2.数据展示
iris_df = pd.DataFrame(iris_data['data'], columns=iris_data.feature_names)
iris_df['label'] = iris_data.target
# print(iris_data.feature_names)
# sns.lmplot(x='sepal length (cm)',y='sepal width (cm)',data = iris_df,hue='label')
# plt.show()


# 3.特征工程(预处理-标准化)
# 3.1 数据集划分
x_train, x_test, y_train, y_test = train_test_split(iris_data.data, iris_data.target, test_size=0.3, random_state=22)
print(len(iris_data.data))
print(len(x_train))
# 3.2 标准化
process = StandardScaler()
x_train = process.fit_transform(x_train)
x_test = process.transform(x_test)
# 4.模型训练
# 4.1 实例化
model = KNeighborsClassifier(n_neighbors=3)
# 4.2 调用fit法
model.fit(x_train,y_train)
# 5.模型预测
x = [[5.1, 3.5, 1.4, 0.2]]
x=process.transform(x)
y_predict =model.predict(x_test)
print(model.predict_proba(x))

# 6.模型评估(准确率)
# 6.1 使用预测结果
acc =accuracy_score(y_test,y_predict)
print(acc)

# 6.2 直接计算
acc = model.score(x_test,y_test)
print(acc)

总结

  • 文章总结了特征预处理中的归一化和标准化,并对每一种方法做了详细讲解,最后用一个综合案例,使用前面学过的的KNN算法来验证预处理的必要性。

标签:20,30000,Age,34.4,标准化,归一化,frac,55400
From: https://blog.csdn.net/Lyg970112/article/details/143188794

相关文章

  • 【旧文重发】MATLAB 通过函数封装一劳永逸地解决线性规划与运输问题的linprog的标准化
    这篇随笔原本是我上实验课时候的笔记,2023年7月曾经在CSDN平台上发布过。今天恰好有朋友跟我问起MATLAB自带的求解器输入很不直观的问题,我打开这个文章发给他的时候发现自己一年前写的LaTeX公式依托答辩,所以重打了一遍。再加上由于CSDN平台的持续摆烂,终于是用不下去......
  • YoloV8改进策略:归一化改进|ContraNorm在YoloV8中的创新应用(全网首发)
    论文介绍ContraNorm提出背景:过平滑是图神经网络(GNNs)和Transformer中普遍存在的一种现象,随着层数的增加,性能会恶化。现有方法多从表征完全收敛到单一点的视角来刻画过平滑,但论文深入到一个更一般的维度坍缩视角,其中表征位于一个狭窄的锥体中。ContraNorm的提出:受对比学习......
  • YoloV9改进策略:归一化改进| ContraNorm在YoloV8中的创新应用(全网首发)
    论文介绍ContraNorm提出背景:过平滑是图神经网络(GNNs)和Transformer中普遍存在的一种现象,随着层数的增加,性能会恶化。现有方法多从表征完全收敛到单一点的视角来刻画过平滑,但论文深入到一个更一般的维度坍缩视角,其中表征位于一个狭窄的锥体中。ContraNorm的提出:受对比学习......
  • 鸿蒙Next之数据同步艺术之三:标准化数据类型解析-UTD详解
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。本文将深入探讨华为鸿蒙HarmonyOSNext......
  • 鸿蒙Next之数据同步艺术之二:深入理解标准化数据类型 (UTD)
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。UTD的设计原则层级结构:UTD采用层级......
  • 安全生产标准化综合管理平台是什么样的?如何做好安全生产标准化?
    我国安全生产标准化体系由国家一系列详尽而全面的规定构成,旨在全方位提升企业的安全生产管理水平,确保生产活动在安全的环境下进行。核心在于《企业安全生产标准化基本规范》(GB/T33000-2016),该规范明确了企业建立、保持与评定安全生产标准化管理体系的原则、一般要求以及八个......
  • 14.归一化——关键的数据预处理方法
    引言在人工智能(AI)和机器学习中,归一化(Normalization)是一个重要的预处理步骤。它的主要目的是将数据转换到某个特定的范围。归一化可以帮助模型更高效地学习和提高预测的准确性。归一化在数据预处理方法中占据核心地位,是确保数据质量和模型性能的关键步骤。通过阅读本篇博客,你......
  • OpenAI OpenAPI 规范:探索 OpenAI API 的标准化接口定义
    OpenAIOpenAPI规范简介OpenAIOpenAPI规范是由OpenAI官方发布的一个开源项目,旨在为OpenAIAPI提供标准化的接口定义。这个项目托管在GitHub上,为开发者提供了一个清晰、结构化的方式来理解和使用OpenAI的强大API。OpenAILogo项目概览OpenAIOpenAPI规范项目位于......
  • wms智能仓储管理系统标准化流程
    wms智能仓储管理系统标准化流程的标准化流程通常包括以下几个主要步骤: 需求分析:与客户充分沟通,了解其仓储管理需求和业务流程,确定系统功能和特性的需求,制定系统开发和实施计划。系统设计:根据需求分析结果,设计WMS系统的功能模块、流程和界面,包括入库管理、出库管理、库存管理......
  • 未发表的原创模型!三类典型需求响应负荷的标准化建模+共享储能提升灵活性(Matlab代码实
      ......