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

news2024/10/6 8:30:49

目录

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或DataFrame
    if isinstance(data, pd.Series):
        # 如果是Series,直接应用归一化
        min_val = data.min()
        max_val = data.max()
        data_normalized = (data - min_val) / (max_val - min_val)
        return data_normalized
    elif 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) / std
        return data_normalized
    else:
        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_normalized
    else:
        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转换为DataFrame
    if isinstance(data, pd.DataFrame):
        norms = np.abs(data).sum(axis=1)
        data_normalized = data.div(norms, axis=0)
        return data_normalized
    else:
        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_normalized
    else:
        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.coloradmin.cn/o/1889909.html

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

相关文章

不是大厂云用不起,而是五洛云更有性价比

明月代维的一个客户的大厂云境外云服务器再有几天就到期了,续费提醒那是提前一周准时到来,但是看到客户发来的续费价格截图,我是真的没忍住。这不就是在杀熟吗?就这配置续费竟然如此昂贵?说实话这个客户的服务器代维是…

20240703在飞凌OK3588-C开发板上刷Rockchip原厂的Buildroot20220811

20240703在飞凌OK3588-C开发板上刷Rockchip原厂的Buildroot20220811 2024/7/3 18:25 详细的刷机LOG: [BEGIN] 2024/7/3 18:18:49 rootRK3588:/# DDR Version V1.07 20220412 LPDDR4X, 2112MHz channel[0] BW16 Col10 Bk8 CS0 Row16 CS1 Row16 CS2 Die BW16 Size204…

创建线程的五种方式

一.继承Thread ,重写run class MyThread extends Thread{Overridepublic void run() {//这里的内容就是该线程要完成的工作while(true) {System.out.println("hello thread");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeExceptio…

类和对象(提高)

类和对象(提高) 1、定义一个类 关键字class 6 class Data1 7 { 8 //类中 默认为私有 9 private: 10 int a;//不要给类中成员 初始化 11 protected://保护 12 int b; 13 public://公共 14 int c; 15 //在类的内部 不存在权限之分 16 void showData(void)…

远程登录WINDOWS10,提示你的凭据不工作

1:想通过远程桌面登录WINDOWS10输入用户名和密码后,出现下面的提示。 2:登录WINDOWS10,在运行中输入gpedit.msc 3:本地组策略编辑器窗口中,依次展开,计算机配置 ---> 管理模版---> 系统--…

海外注册 | 欧盟医疗器械法规下免除临床试验的条件与要求

在欧盟医疗器械法规(MDR)的严格监管下,植入性医疗器械和III类医疗器械通常需要进行临床试验来证明其安全性和性能。 然而,MDR也规定了一些特定情况下免除临床试验的可能性。以下是免除临床试验的条件和要求的详细说明&#xff1a…

“穿越时空的机械奇观:记里鼓车的历史与科技探秘“

在人类文明的发展历程中,科技的创新与进步不仅仅推动了社会的进步,也为我们留下了丰富的文化遗产。记里鼓车,作为一种古老的里程计量工具,其历史地位和技术成就在科技史上具有重要的意义。本文将详细介绍记里鼓车的起源、结构原理…

视频分析、目标检测的过去和未来:目标检测从入门到精通 ------ YOLOv8 到 多模态大模型处理视觉基础任务

文章大纲 计算机视觉项目的关键步骤目标检测入门视频分析项目最佳实践数据集构建数据准备:数据集标注规范与数据规模参考标注工具标注工具:目标检测yolo 极简标注工具综合标注工具:label-studio半自动标注工具:X-AnyLabeling目标检测与多模态哪些多模态模型可以做目标检测?…

顺序表--续(C语言详细版)

2.9 在指定位置之前插入数据 // 在指定位置之前插入数据 void SLInsert(SL* ps, int pos, SLDataType x); 步骤: ① 程序开始前,我们要断言一下,确保指针是有效的,不是NULL; ② 我们还要断言一下,指定的…

【大模型LLM面试合集】大语言模型基础_llm概念

1.llm概念 1.目前 主流的开源模型体系 有哪些? 目前主流的开源LLM(语言模型)模型体系包括以下几个: GPT(Generative Pre-trained Transformer)系列:由OpenAI发布的一系列基于Transformer架构…

64位Office API声明语句第120讲

跟我学VBA,我这里专注VBA, 授人以渔。我98年开始,从源码接触VBA已经20余年了,随着年龄的增长,越来越觉得有必要把这项技能传递给需要这项技术的职场人员。希望职场和数据打交道的朋友,都来学习VBA,利用VBA,起码可以提高…

JVM原理(十二):JVM虚拟机类加载过程

一个类型从被加载到虚拟机内存中开始,到卸载为止,它的整个生命周期将会经过 加载、验证、准备、解析、初始化、使用、卸载七个阶段。其中 验证、准备、解析三个部分统称为 连接 1. 加载 加载是整个类加载的一个过程。在加载阶段,Java虚拟机…

第25篇 滑动开关控制LED<三>

Q:如何创建流水灯汇编语言程序工程并运行呢? A:基本原理:与用单个SW控制单个对应LED点亮与熄灭一样,我们创建用SW控制流水灯状态。默认初始状态为4个连续的红色LED为一组(每组之间隔4个熄灭的LED&#xff…

如何在网络抓取过程中绕过 CAPTCHA 和 reCAPTCHA?

什么是 CAPTCHA? CAPTCHA,全称为 “Completely Automated Public Turing test to tell Computers and Humans Apart”(完全自动化的公共图灵测试以区分计算机和人类),是一种用于识别网站访问者是否为真实人的测试。 这…

绝区零国际服怎么下载 绝区零国际服下载教程

绝区零即将上线,每位玩家都能在这里开启全新的时空冒险之旅,主要玩法分为以剧情和副本为主的核心玩法、以刷材料为主的养成副本,以及日常任务为主,在以往的手游中,玩家进入某项玩法只需要从游戏界面调取菜单即可&#…

Django 一对一关系

作用: 两个数据库表建立外键关系当外键表的数据被删除时,主表的数据也会一并删除。 1,添加表模型 Test/app8/views.pyfrom django.db import modelsclass User(models.Model):username models.CharField(max_length50, uniqueTrue)email …

程序员AI提效案例:统计B站课程耗时情况

文章目录 一,时长统计需求二,一波三折三,终极方案 AIJava总结 今天为了写一篇博客,这篇博客介绍了B站的一个Java项目,这个项目分为三个阶段: 初级篇高级篇运维篇 一,时长统计需求 我想根据每个…

软件测试中安全测试包含内容及安全测试怎么测

一、软件测试安全测试包含哪些 1. 漏洞扫描 漏洞扫描是软件测试安全测试的基础,它用于检测应用程序和系统中存在的已知漏洞。安全测试工具如AppScan、OWASP ZAP和Nessus等可以对应用程序进行自动化扫描,发现可能存在的漏洞,如跨站点脚本&am…

大象机器人开源协作机械臂机械臂接入GPT4o大模型!

本文已经或者同济子豪兄作者授权对文章进行编辑和转载 引言 随着人工智能和机器人技术的快速发展,机械臂在工业、医疗和服务业等领域的应用越来越广泛。通过结合大模型和多模态AI,机械臂能够实现更加复杂和智能化的任务,提升了人机协作的效率…