Python特征工程 — 1.4 特征归一化方法详解

目录

1 Min-Max归一化

方法1:自定义的Min-Max归一化封装函数

方法2: scikit-learn库中的MinMaxScaler

2 Z-score归一化

方法1:自定义的Z-score归一化封装函数

方法2: scikit-learn库中的StandardScaler

3 最大值归一化

4 L1归一化

方法1:自定义的Z-score归一化封装函数

方法2: scikit-learn库中的Normalizer

5 L2归一化

方法1:自定义的L2归一化归一化封装函数

方法2: scikit-learn库中的Normalizer

6 Box-Cox归一化

方法1:自定义的L2归一化归一化封装函数

方法2: scipy库的boxcox

7 选择哪种归一化


实验数据:链接:https://pan.baidu.com/s/1yT1ct_ZM5uFLgcYsaBxnHg?pwd=czum  提取码:czum 

实验数据介绍:参考文章1.2节(数据介绍链接)

1 Min-Max归一化

最小-最大归一化(Min-Max Normalization)是一种将数据缩放到特定范围内的线性变换方法,通常是[0, 1]。这种方法保证了数据的最小值被映射为0,最大值被映射为1,中间的值则按比例进行缩放。

最小-最大归一化的公式为:

其中,是归一化后的值,x 是原始数据点,max(x) 和 min(x) 分别是数据集中的最大值和最小值。

示例程序将使用两种方法实现,自定义的最小-最大归一化封装函数,并使用scikit-learn库中的MinMaxScaler类作为第二种方法来实现归一化。以下是具体的实现:

方法1:自定义的Min-Max归一化封装函数

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt# 定义最小-最大归一化函数,使其能够处理DataFrame或Series
def min_max_normalization(data):# 检查数据是否为pandas Series或DataFrameif isinstance(data, pd.Series):# 如果是Series,直接应用归一化min_val = data.min()max_val = data.max()data_normalized = (data - min_val) / (max_val - min_val)return data_normalizedelif isinstance(data, pd.DataFrame):# 如果是DataFrame,逐列应用归一化return (data - data.min()) / (data.max() - data.min())else:raise ValueError("Input data must be a pandas Series or DataFrame")# 方法一:使用自定义函数进行归一化
data_normalized_custom = min_max_normalization(data['Total_Spending'])

方法2: scikit-learn库中的MinMaxScaler

from sklearn.preprocessing import MinMaxScaler# 方法二:使用 scikit-learn 的 MinMaxScaler 进行归一化
scaler = MinMaxScaler()
data_normalized_sklearn = scaler.fit_transform(data[['Total_Spending']])
plt.figure(figsize=(14, 5))
# 绘制原始数据和归一化数据的对比图
plt.subplot(1, 2, 1)
# 绘制原始数据的线条图
plt.plot(data['Total_Spending'], marker='o')
plt.title('Original Data')
plt.xlabel('Index')
plt.ylabel('Value')plt.subplot(1, 2, 2)
# 绘制自定义归一化方法的数据的线条图
plt.plot(data_normalized_custom, label='Normalized (Custom)', linestyle='--', marker='x')
# 绘制 scikit-learn 归一化方法的数据的线条图
plt.plot(data_normalized_sklearn, label='Normalized (scikit-learn)', linestyle='-.', marker='s')# 添加图例、标题和坐标轴标签
# plt.legend(loc='upper center')
plt.title('min_max_normalization')
plt.xlabel('Index')
plt.ylabel('Value')

运行结果如下: 

2 Z-score归一化

 Z-score归一化,也称为标准化(Standardization),是一种将数据按比例缩放至特定均值(mean)和标准差(standard deviation)的方法。其目的是将数据转换为一个标准分布,其中数据的均值为0,标准差为1。Z-score归一化它确保了不同特征具有相同的尺度和分布特性。 

示例程序将使用两种方法实现,自定义的最小-最大归一化封装函数,并使用scikit-learn库中的StandardScaler类作为第二种方法来实现归一化。以下是具体的实现:

方法1:自定义的Z-score归一化封装函数

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt# 使用自定义函数进行Z-score归一化
def z_score_normalization(data):if isinstance(data, (pd.Series, pd.DataFrame)):mean = data.mean()std = data.std()data_normalized = (data - mean) / stdreturn data_normalizedelse:raise ValueError("Input data must be a pandas Series or DataFrame")# 使用自定义函数进行Z-score归一化
data_normalized_custom = z_score_normalization(data.iloc[:, 7:10])

方法2: scikit-learn库中的StandardScaler

from sklearn.preprocessing import StandardScaler# 使用 scikit-learn 的 StandardScaler 进行Z-score归一化
scaler = StandardScaler()
data_normalized_sklearn = scaler.fit_transform(data.iloc[:, 7:10])
data_normalized_sklearn = pd.DataFrame(data_normalized_sklearn, columns=data.columns[7:10])

 运行结果如下,选取的3个数据有不同的尺度,最后归一化到了0-1的范围:  

3 最大值归一化

最大最小值归一化(Min-Max Normalization)是一种线性变换,它将数据的最小值映射到0,最大值映射到1,所有其他值按比例映射到0和1之间。

最大最小值归一化的公式为:

其中:x 是原始数据点,x′ 是归一化后的数据点,min(x) 是数据中的最小值,max(x) 是数据中的最大值。

示例程序自定义的最小-最大归一化封装函数,以下是具体的实现:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt# 使用自定义函数进行最大最小值归一化
def min_max_normalization(data):if isinstance(data, (pd.Series, pd.DataFrame)):data_normalized = (data - data.min()) / (data.max() - data.min())return data_normalizedelse:raise ValueError("Input data must be a pandas Series or DataFrame")# 使用自定义函数进行最大最小值归一化
data_normalized_custom = min_max_normalization(data.iloc[:, 7:10])# 绘制原始数据和归一化数据的对比图
plt.figure(figsize=(14, 5))plt.subplot(1, 2, 1)
# 绘制原始数据的线条图,假设我们有3列数据
for idx, col in enumerate(data.columns[7:10]):plt.plot(data.index, data[col], marker='o', linewidth=1, markersize=3)plt.title('Original Data')
plt.xlabel('Index')
plt.ylabel('Value')plt.subplot(1, 2, 2)
# 绘制自定义最大最小值归一化方法的数据的线条图
for idx, col in enumerate(data.columns[7:10]):plt.plot(data.index, data_normalized_custom[col], linestyle='--', marker='x', linewidth=1, markersize=3)# 添加图例、标题和坐标轴标签
plt.title('Min-Max Normalization')
plt.xlabel('Index')
plt.ylabel('Normalized Value')# 显示图形
plt.tight_layout()
plt.show()

运行结果如下:

4 L1归一化

L1归一化,也称为曼哈顿距离归一化或1-范数归一化,是一种将数据的特征向量按其绝对值的总和进行归一化的方法。其目的是将每个特征的绝对值加和为1。L1归一化在某些特定的机器学习算法中很有用,比如在L1正则化(Lasso回归)中。

L1归一化的公式为:

  • x 是原始数据向量。
  • x′ 是归一化后的数据向量。
  • ∑∣x∣ 是向量x中所有元素绝对值的总和。

L1归一化的优点包括:

  • 它对异常值具有一定的鲁棒性,因为异常值不会像在L2归一化中那样对结果产生过大的影响。
  • 它可以将数据转换为稀疏表示,这在某些类型的机器学习算法中是有利的。

示例程序将使用两种方法实现,自定义的L1归一化封装函数,并使用scikit-learn库中的Normalizer类作为第二种方法来实现归一化。以下是具体的实现:

方法1:自定义的Z-score归一化封装函数

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt# 使用自定义函数进行L1归一化
def l1_normalization(data):if isinstance(data, pd.Series):data = data.to_frame()  # 将Series转换为DataFrameif isinstance(data, pd.DataFrame):norms = np.abs(data).sum(axis=1)data_normalized = data.div(norms, axis=0)return data_normalizedelse:raise ValueError("Input data must be a pandas Series or DataFrame")# 使用自定义函数进行L1归一化
data_normalized_custom = l1_normalization(data.iloc[:, 7:10])

方法2: scikit-learn库中的Normalizer

from sklearn.preprocessing import Normalizer# 使用 scikit-learn 的 Normalizer 进行L1归一化
normalizer = Normalizer(norm='l1')
data_normalized_sklearn_l1 = normalizer.fit_transform(data.iloc[:, 7:10])
data_normalized_sklearn_l1 = pd.DataFrame(data_normalized_sklearn_l1, columns=data.columns[7:10])
# 绘制原始数据和归一化数据的对比图
plt.figure(figsize=(14, 5))
plt.subplot(1, 2, 1)
# 绘制原始数据的线条图
for idx, col in enumerate(data.columns[7:10]):plt.plot(data.index, data[col], label=f'Original {col}', marker='o', linewidth=1, markersize=3)plt.title('Original Data')
plt.xlabel('Index')
plt.ylabel('Value')
plt.subplot(1, 2, 2)
# 绘制自定义L1归一化方法的数据的线条图
for idx, col in enumerate(data_normalized_custom.columns):plt.plot(data.index, data_normalized_custom[col], linestyle='--', marker='x', linewidth=1, markersize=3)
# 绘制自定义L1归一化方法的数据的线条图
for idx, col in enumerate(data_normalized_sklearn_l1.columns):plt.plot(data.index, data_normalized_sklearn_l1[col], linestyle='--', marker='x', linewidth=1, markersize=3)# 添加图例、标题和坐标轴标签
plt.title('L1 Normalization')
plt.xlabel('Index')
plt.ylabel('Normalized Value')# 显示图形
plt.tight_layout()
plt.show()

运行结果如下:

5 L2归一化

L2归一化,也称为欧几里得归一化或2-范数归一化,是一种将数据的特征向量按其平方和的平方根进行归一化的方法。其目的是将每个特征的平方和除以向量的欧几里得范数,使得每个特征向量的范数为1。L2归一化在许多机器学习算法中很有用,特别是在需要考虑距离度量时,例如在K近邻(KNN)算法中。

L2归一化的公式为:

其中:x 是原始数据向量,′x′ 是归一化后的数据向量。∑x2 是向量x中所有元素平方的总和。

L2归一化的优点包括:

  • 它对数据的每个维度赋予了相等的重要性,因为它是基于向量的欧几里得距离。
  • 它在处理需要考虑角度和方向的应用中有广泛的应用,如在图像识别和计算机视觉中。

示例程序将使用两种方法实现,自定义的L2归一化封装函数,并使用scikit-learn库中的Normalizer类作为第二种方法来实现归一化。以下是具体的实现:

方法1:自定义的L2归一化归一化封装函数

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import Normalizer# 使用自定义函数进行L2归一化
def l2_normalization(data):if isinstance(data, (pd.Series, pd.DataFrame)):norms = np.sqrt(np.sum(data**2, axis=1))data_normalized = data.div(norms, axis=0)return data_normalizedelse:raise ValueError("Input data must be a pandas Series or DataFrame")# 使用自定义函数进行L2归一化
data_normalized_custom = l2_normalization(data.iloc[:, 7:10])

方法2: scikit-learn库中的Normalizer

# 使用 scikit-learn 的 Normalizer 进行L2归一化
normalizer = Normalizer(norm='l2')
data_normalized_sklearn_l2 = normalizer.fit_transform(data.iloc[:, 7:10])
data_normalized_sklearn_l2 = pd.DataFrame(data_normalized_sklearn_l2, columns=data.columns[7:10])
# 绘制原始数据和归一化数据的对比图
plt.figure(figsize=(14, 5))plt.subplot(1, 2, 1)
# 绘制原始数据的线条图
for idx, col in enumerate(data.columns[7:10]):plt.plot(data.index, data[col], label=f'Original {col}', marker='o', linewidth=1, markersize=3)plt.title('Original Data')
plt.xlabel('Index')
plt.ylabel('Value')plt.subplot(1, 2, 2)
# 绘制自定义L2归一化方法的数据的线条图
for idx, col in enumerate(data_normalized_custom.columns):plt.plot(data.index, data_normalized_custom[col], linestyle='--', marker='x', linewidth=1, markersize=3)# 绘制 scikit-learn L2归一化方法的数据的线条图
for idx, col in enumerate(data_normalized_sklearn_l2.columns):plt.plot(data.index, data_normalized_sklearn_l2[col], linestyle='-.', marker='s', linewidth=1, markersize=3)# 添加图例、标题和坐标轴标签
plt.title('L2 Normalization')
plt.xlabel('Index')
plt.ylabel('Normalized Value')# 显示图形
plt.tight_layout()
plt.show()

运行结果如下:

6 Box-Cox归一化

Box-Cox归一化是一种用于变换数据的分布,使其更接近正态分布的方法。它特别适用于处理具有偏态分布的数据,能够减少数据的偏斜性并稳定方差。Box-Cox变换是一种幂律变换,可以表示为:

其中,y 是原始数据,λ 是变换参数。

Box-Cox归一化的关键步骤包括:

  1. 选择合适的变换参数 λ。这通常通过最大化变换后数据的似然函数来实现。
  2. 应用变换公式,根据选定的 λ 对数据进行变换。

Box-Cox归一化的优点包括:

  • 它能够处理正值数据的偏态分布问题。
  • 它可以减少数据的偏斜性,使数据更接近正态分布。
  • 它可以稳定方差,使方差与均值无关。

示例程序将使用两种方法实现,自定义的L2归一化封装函数,并使用scipy的boxcox作为第二种方法来实现归一化。以下是具体的实现:

方法1:自定义的L2归一化归一化封装函数

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt# 自定义Box-Cox归一化函数
def custom_boxcox(data, lam):if lam == 0:return np.log(data)else:return (np.power(data, lam) - 1) / lam# 选择Box-Cox变换的参数lambda,这里我们先假设为0.5(可以根据数据调整)
lambda_value = 0.5# 为每一列分别使用自定义Box-Cox归一化函数
data_normalized_custom = pd.DataFrame()
for col_name in data.iloc[:, 7:10].columns:data_col = data[col_name] + 1  # 确保数据为正数,这里加1进行平移data_normalized_custom[col_name] = custom_boxcox(data_col, lambda_value)

方法2: scipy库的boxcox

from scipy import stats# 使用scipy的boxcox进行归一化
data_normalized_scipy, lambda_selected = stats.boxcox(data.iloc[:, 7] + 1)
# 绘制原始数据和归一化数据的对比图
plt.figure(figsize=(14, 5))plt.subplot(1, 2, 1)
# 绘制原始数据的线条图
for idx, col_name in enumerate(data.columns[7:10]):plt.plot(data.index, data[col_name], marker='o', linewidth=1, markersize=3)plt.title('Original Data')
plt.xlabel('Index')
plt.ylabel('Value')plt.subplot(1, 2, 2)
# 绘制自定义Box-Cox归一化方法的数据的线条图
for idx, col_name in enumerate(data_normalized_custom.columns):plt.plot(data.index, data_normalized_custom[col_name], linestyle='--', linewidth=1, markersize=3)# 绘制scipy Box-Cox归一化方法的数据的线条图
plt.plot(data.index, data_normalized_scipy, linestyle='-.', linewidth=1, markersize=3)# 添加图例、标题和坐标轴标签
plt.title('Box-Cox Normalization')
plt.xlabel('Index')
plt.ylabel('Normalized Value')# 显示图形
plt.tight_layout()
plt.show()

运行结果如下: 

7 选择哪种归一化

各种归一化方法各有其特点和适用场景,以下是它们的使用场景和优缺点的对比:

归一化方法特点
Min-Max归一化

优点:可以指定数据变换后的范围。

缺点:对异常值敏感,因为最大值和最小值会受其影响。

Z-score归一化

优点:降低了异常值的影响。

缺点:数据必须有明确的均值和方差。

最大值归一化

优点:可以处理非正态分布的数据。

缺点:对数据中的零值和负值不敏感,如果数据集中的最大值很少变化,可能导致归一化效果不佳。

L1归一化

优点:能够产生稀疏表示,对异常值有一定的鲁棒性。

缺点:可能导致数据的某些特征被忽略,特别是当这些特征的绝对值较小时。

L2归一化

优点:考虑了特征的相对大小,有助于保留数据的几何结构,常用于距离度量和聚类算法。

缺点:对异常值敏感,计算相对复杂。

Box-Cox归一化

优点:可以处理正值数据的偏态分布,通过变换参数λ调整,可以找到最佳的数据分布。

缺点:需要选择合适的λ值,这可能需要多次尝试,对数据中的零值或负值不适用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/40373.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

考研生活day1--王道课后习题2.2.1、2.2.2、2.2.3

2.2.1 题目描述: 解题思路: 这是最基础的操作,思路大家应该都有,缺少的应该是如何下笔,很多同学都是有思路但是不知道如何下笔,这时候看思路的意义不大,可以直接看答案怎么写,最好…

Java项目:基于SSM框架实现的游戏攻略网站系统分前后台【ssm+B/S架构+源码+数据库+毕业论文+任务书】

一、项目简介 本项目是一套基于SSM框架实现的游戏攻略网站系统 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美观、操作简单、功能…

redhat7.x 升级openssh至openssh-9.8p1

1.环境准备: OS系统:redhat 7.4 2.备份配置文件: cp -rf /etc/ssh /etc/ssh.bak cp -rf /usr/bin/openssl /usr/bin/openssl.bak cp -rf /etc/pam.d /etc/pam.d.bak cp -rf /usr/lib/systemd/system /usr/lib/systemd/system.bak 3.安装…

UB9A0全系统全频高精度板卡性能指标

UB9A0 板卡是基于和芯星通自主研发的新一代射频基带及高精度算法一体化 GNSS SoC 芯片—Nebulas Ⅳ开发的全系统全频点高精 OEM 板卡 ,支持 BDS,GPS, GLONASS,Galileo,QZSS,NavIC,SBAS&#xff…

linux c 应用编程定时器函数

在 Linux C 应用编程中,对于多线程编程中的定时器函数使用,通常可以借助 pthread 库和系统提供的定时器相关的函数来实现。 首先,常见的定时器函数有 setitimer() 和 alarm() 。setitimer() 函数可以更精确地设置定时器,它可以设…

JAVA学习-练习试用Java实现“螺旋矩阵 II”

问题: 给定一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1: 输入:n 3 输出:[[1,2,3],[8,9,4],[7,6,5]] 示例 2: 输入&…

C++标准模板(STL)- 迭代器库 - 流迭代器- 写入 std::basic_streambuf 的输出迭代器(二)

迭代器库-流迭代器 迭代器库提供了五种迭代器的定义,同时还提供了迭代器特征、适配器及相关的工具函数。 迭代器分类 迭代器共有五 (C17 前)六 (C17 起)种:遗留输入迭代器 (LegacyInputIterator) 、遗留输出迭代器 (LegacyOutputIterator) 、遗留向前迭代…

MySQL环境搭配

下载版本37滴 下载第二个 之后进行安装 进入安装界面 next 选择默认的 进行下一步 安装成功后,进行一系列配置,成功界面如下: 配置 MySQL8.0 环境变量 如果不配置 MySQL 环境变量,就不能在命令行直接输入 MySQL 登录命令。 步…

强烈推荐!12 组超惊艳的 Midjourney 风格提示词!

前言 Midjourney 的 --sref random 随机风格功能推出之后,出现了很多对不同代码生成效果的探索。今天就为大家推荐 12 组我觉得非常惊艳的风格代码,将它们添加在提示词中,不需要写复杂的关键词就能得到高质量的指定风格,并且效果…

CUDA编译配置中来自 CUDA 12.1.targets 的MSB3721错误和核函数调用语法错误‘<’解决及可用的代码示例框架

今天开始整cuda编程处理图像,好久没玩cuda,又从小白开始。情况不妙,第一个工程坑不少,记录一下如下2个重要的错误: (1)来自 CUDA 12.1.targets 的MSB3721错误 错误 命令““C:\Program Files\N…

Scrapy框架的基本使用教程

1、创建scrapy项目 首先在自己的跟目录文件下执行命令: PS D:\BCprogram\python_pro\bigdata> scrapy startproject theridion_grallatorscrapy startproject 项目名 具体执行操作如下:1、创建项目目录:Scrapy会在当前工作目录下创建一…

Git 操作总结

1. 安装、Git 环境配置 1.1 安装 Git 官方版本可以在 Git 官方网站下载:打开 https://git-scm.com/download/win,选择相应版本即可。 Git 安装完成后,可以在开始菜单中看到 Git 的三个启动图标(Git Bash、Git CMD、Git GUI&…

koa导出数据为csv文件给前端下载

后端代码 async userActivityExport(ctx) {const limit ctx.query.limit || 2const offset ctx.query.offset || 0const UserActivity ctx.module.db().entity(userActivity)const findOption {}const ret await UserActivity.findMany_(findOption)const firtCol Objec…

QT5.12环境搭建与源码编译

一、概述 QT版本:QT5.12.10 Qt网址:http://download.qt.io/archive/qt/ 编译平台 ubuntu18.04 二、安装交叉编译工具链 1、获取交叉编译工具链 一般如果是编译系统如果有对应的gcc 就是用这个就可以了 比如rk3128 lin…

【Qt】QTableWidget设置可以选择多行多列,并能复制选择的内容到剪贴板

比如有一个 QTableWidget*m_tbwQuery m_tbwQuery->installEventFilter(this); //进行事件过滤处理//设置可以选择多行多列 m_tbwQuery->setSelectionMode(QAbstractItemView::MultiSelection); m_tbwQuery->setSelectionBehavior(QAbstractItemView::SelectItems); …

字符串相似度算法完全指南:编辑、令牌与序列三类算法的全面解析与深入分析

在自然语言处理领域,人们经常需要比较字符串,这些字符串可能是单词、句子、段落甚至是整个文档。如何快速判断两个单词或句子是否相似,或者相似度是好还是差。这类似于我们使用手机打错一个词,但手机会建议正确的词来修正它&#…

如何为老化的汽车铅酸电池充电

一项小研究表明,汽车铅酸电池不同于深循环或固定电池。汽车电池旨在限度地提高启动电流容量,并且对深度放电或浮充(也称为第 3 阶段充电循环)反应不佳。起动电池的极板结构使表面积化,并且电解液比重 (SG) 高于其他电池,以提供高启…

C# 实现位比较操作

1、目标 对两个字节进行比较,统计变化位数、一位发生变化的位数、二位发生变化的位数、多位发生变化的位数。 2、代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Lin…

php 跨域问题

设置header <?php $origin isset($_SERVER[HTTP_ORIGIN])? $_SERVER[HTTP_ORIGIN]:;$allow_originarray(http://www.aaa.com,http://www.bbb.com, ); if( $origin in $allow_origin ){header("Access-Control-Allow-Origin:".$origin);header("Access-Co…

Electron Forge 打包更改打包后图片

确认 ICO 文件有效 确保 icon.ico 文件是有效的并且包含多种分辨率的图标&#xff08;如 16x16, 32x32, 48x48, 256x256&#xff09;。可以使用工具如 icoconverter 来生成有效的 ICO 文件。 https://icoconvert.com/确认图标文件路径 确保图标文件路径正确并且文件存在。 确…