Python特征工程 — 1.3 对数与指数变换

news2024/11/25 13:20:24

目录

1 对数变换

1.1 对数变换的概念

1.2 对数变换实战

2 指数变换

2.1 指数变换的概念

2.2 指数变换实战

3 Box-Cox变换

3.1 Box-Cox变换概念

3.2 Box-Cox变换实战


1 对数变换

1.1 对数变换的概念

特征对数变换和指数变换是数据预处理中的两种常用技术,它们可以帮助改善数据的分布特性,从而提高某些模型的性能。

对数变换通常用于减少数据的偏斜性(skewness),它将原始数据的每个值转换为该值的自然对数或以10为底的对数。对于具有重尾分布的数据,对数变换时很好的处理方式。公式为:

1.2 对数变换实战

下面代码的目的是通过生成具有重尾分布的数据,并对其进行对数变换,来展示对数变换对数据分布的影响。

import numpy as np
import matplotlib.pyplot as plt

# 设置随机种子以获得可复现的结果
np.random.seed(0)

# 生成具有重尾分布的数据(例如,使用帕累托分布)
data = np.random.pareto(a=1, size=2000)

# 对数变换,这里使用10为底对数
# 为了避免对数变换中的问题,添加一个小的常数(例如1)
log_data = np.log10(data + 1)

# 绘制原始数据的直方图
plt.figure(figsize=(14, 5))  # 调整图形大小以便更清晰的展示
plt.subplot(1, 2, 1)  # 1行2列的第一个图
plt.hist(data, bins=50, color='blue', alpha=0.7, log=True)  # 使用对数刻度
plt.title('Original Data (Log Scale)')
plt.xlabel('Value')  # 添加x轴标签
plt.ylabel('Frequency (log scale)')  # 添加y轴标签,说明y轴是频率的对数刻度

# 绘制对数变换后数据的直方图
plt.subplot(1, 2, 2)  # 1行2列的第二个图
plt.hist(log_data, bins=30, color='green', alpha=0.7)  # 正常刻度
plt.title('Log-transformed Data')
plt.xlabel('Value')  # 添加x轴标签
plt.ylabel('Frequency')  # 添加y轴标签

# 显示图形
plt.tight_layout()  # 调整布局以避免标签重叠
plt.show()

下面是对代码的分析和对数变换前后作用的解释:

  • 使用np.random.pareto(a=2.0, size=2000)生成了2000个服从帕累托分布的数据点。帕累托分布是一种典型的重尾分布,其特点是大部分数据点集中在较小的值附近,而少数数据点是极端大的值。
  • 对原始数据进行以10为底的对数变换,使用np.log10(data + 1)。这里添加了1来避免对数函数在0处未定义的问题。

运行结果如下:

在原始数据的直方图上使用对数刻度,可以清晰地看到数据的重尾特性,即直方图的右侧有一个长尾,对数变换后的数据直方图可能看起来更加紧凑,极端大值的影响被减少

2 指数变换

2.1 指数变换的概念

指数变换通常用于处理具有极端值或非常不均匀分布的数据,它将原始数据的每个值转换为该值的指数函数,指数变换可以放大较小的值而压缩较大的值,有助于减少极端值的影响。公式为:

2.2 指数变换实战

指数变换主要应用与图像处理领域,可参考如下的文章:https://www.cnblogs.com/wancy/p/17819610.html

这段代码演示了如何对一组非正态分布的正值数据进行指数变换,并可视化变换前后的数据分布。

import numpy as np
import matplotlib.pyplot as plt

# 生成数据:使用gamma分布生成非正态分布的正值数据
data = np.random.gamma(shape=1.0, scale=1.0, size=1000)

# 归一化数据到[0, 1]区间
data_normalized = data / np.max(data)

# 应用指数变换
exp_data_normalized = np.exp(data_normalized - 1)  # 减1保证变换后数据不会全为0

# 反归一化到原始数据的范围
exp_data = exp_data_normalized * np.max(data)

# 绘制原始数据的直方图
plt.figure(figsize=(10, 6))
plt.subplot(1, 2, 1)
plt.hist(data, bins=30, color='blue', alpha=0.7)
plt.title("Original Data")

# 绘制指数变换后数据的直方图
# 截断数据以避免过大的值
threshold = np.percentile(exp_data, 99)  # 取99百分位数作为阈值
exp_data[exp_data > threshold] = threshold
plt.subplot(1, 2, 2)
plt.hist(exp_data, bins=30, color='green', alpha=0.7)
plt.title("Exponential Transformed Data")

# 添加坐标轴标签
plt.xlabel('Value')
plt.ylabel('Frequency')

# 显示图形
plt.tight_layout()
plt.show()

下面是对代码的分析:

  • 使用numpyrandom.gamma函数生成一组非正态分布的正值数据,这种分布通常产生偏斜的数据,具有重尾特性。
  • 将数据归一化到[0, 1]区间。这是通过将每个数据点除以数据的最大值来实现的。归一化有助于在变换过程中保持数据的尺度一致性。
  • 反归一化到原始数据的范围。通过将变换后的数据乘以原始数据的最大值来实现。

直方图显示了变换前后数据分布的对比,指数变换后的数据可能更加均匀或具有更小的偏斜度。

两种变换的使用场景和要求

这两种变换通常用于以下情况:

  • 当数据具有非线性特征时,对数变换可以帮助线性化数据。
  • 当数据的方差随着均值的增加而增加时(即方差与均值成正比),对数变换可以稳定方差。
  • 当数据包含极端值或离群点时,指数变换可以帮助减少这些值的影响。

两种变换对数据要求:在应用这些变换之前,需要考虑数据的特性和模型的需求。例如,对数变换不适用于零或负值,因为对数函数在这些值上是未定义的。而指数变换则可以处理负值。

3 Box-Cox变换

3.1 Box-Cox变换概念

平方根变换和对数变换可以简单推广为Box-Cox变换。Box-Cox变换是一种在统计建模中常用的数据变换方法,由George E.P. Box和David Cox在1964年提出,用于处理连续的、正值的、偏斜分布的数据,以便它们更符合正态分布的要求。这种变换特别适用于线性回归模型中,当响应变量不满足正态分布时,通过变换可以使模型满足线性、正态性、独立性以及方差齐性的假设条件。

Box-Cox变换的一般形式为:

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

box-cox变换的主要作用:是将数据进行归一化,使得数据更加符合统计假设。在实际应用中,box-cox变换常用于解决回归分析和方差分析中的数据不满足正态分布的问题,从而提高模型的准确度和可靠性。

box-cox变换优点:

  • 提高模型预测准确性:将非正态分布的数据进行box-cox变换后,可以使数据更加符合正态分布,从而提高模型预测的准确性。
  • 统计推断更可靠:在进行统计推断时,如果假设数据符合正态分布,但实际上并不符合,可能会导致结果的错误。通过box-cox变换将数据转换为正态分布后,统计推断的结果更加可靠。
  • 处理异方差性:对于具有异方差性的数据,进行box-cox变换可以使数据更加平滑,从而更容易处理异方差性。

box-cox变换缺点:

  • 数据必须为正数:box-cox变换要求数据必须为正数,因此无法处理包含负数的数据集。
  • 参数需要选择:box-cox变换中的参数λ需要根据数据集进行选择,不同的λ值可能会导致不同的结果。因此,需要进行多次试验来找到最适合的λ值。例如,当 λ=0 时,Box-Cox变换退化为对数变换;当λ=−1 时为倒数变换;当λ=0.5 时为平方根变换。
  • 数据范围影响变换效果:box-cox变换对于数据的范围敏感,如果数据集范围较小,可能会导致变换效果不佳,或者导致出现数值问题

3.2 Box-Cox变换实战

下面代码演示了如何使用Box-Cox变换对一组非正态分布的正值数据进行处理,并可视化原始数据和变换后数据的分布情况。

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

# 假设有一组非正态分布的正值数据
# 这里我们使用一个偏态分布的示例数据集
data = np.random.gamma(shape=2.0, scale=2.0, size=1000)

# 应用Box-Cox变换,并找到最优的lambda值
transformed_data, optimal_lambda = stats.boxcox(data)

# 打印最优的lambda值
print(f"Optimal lambda value: {optimal_lambda}")

# 绘制原始数据的直方图
plt.figure(figsize=(14, 6))
plt.subplot(1, 2, 1)
plt.hist(data, bins=30, color='blue', alpha=0.7)
plt.title("Original Data")
# 添加坐标轴标签
plt.xlabel('Value')
plt.ylabel('Frequency')

# 绘制变换后数据的直方图
plt.subplot(1, 2, 2)
plt.hist(transformed_data, bins=30, color='green', alpha=0.7)
plt.title(f"Box-Cox Transformed Data \n(lambda = {optimal_lambda})")

# 添加坐标轴标签
plt.xlabel('Value')
plt.ylabel('Frequency')

# 显示图形
plt.tight_layout()
plt.show()
  • 首先使用伽马分布生成一组非正态分布的正值数据,伽马分布是一种偏态分布,常用于模拟具有重尾分布的数据。
  • 进一步使用scipy.stats.boxcox函数对数据进行Box-Cox变换。该函数返回变换后的数据transformed_data和最优的lambda值optimal_lambda。最优的lambda值是通过极大似然估计得到的,用于确定最佳的Box-Cox变换形式。
  • 最后使用matplotlib库绘制原始数据和变换后数据的直方图。

原始数据(伽马分布)具有偏态分布,Box-Cox变换旨在通过非线性变换减少数据的偏态,使数据更接近正态分布。

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

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

相关文章

基于Hadoop平台的电信客服数据的处理与分析④项目实现:任务15:数据生产

任务描述 电信数据生产是一个完整且严密的体系,这样可以保证数据的鲁棒性。在本项目的数据生产模块中,我们来模拟生产一些电信数据。同时,我们必须清楚电信数据的格式和数据结构,这样才能在后续的数据产生、存储、分析和展示环节…

前端基础:CSS(篇一)

目录 css概述 CSS与HTML的关系 基本语法 行内样式表 代码 运行 内嵌样式表 代码 运行 外部样式表 代码 运行 选择器 标签选择器 代码 运行 id选择器 代码 运行 类选择器 代码 运行 选择器优先问题 通配选择器 选中所有的标签 代码 运行 选择器组…

网安小贴士(6)TCP/IP分层

一、前言 1983年,美国国防部决定将TCP/IP作为所有计算机网络的标准协议,这标志着TCP/IP正式成为互联网的基础协议。随着个人计算机的普及和网络技术的发展,TCP/IP模型被广泛应用于各种网络环境中,包括局域网(LAN&#…

MySQL单表千万级数据查询优化大家怎么说(评论有亮点)

题图来自APOD 上次写了一篇MySQL优化实战的文章“MySQL千万级数据从190秒优化到1秒全过程”。 这篇文章主要还是在实战MySQL优化,所以从造数据到查询SQL优化SQL都没有业务或者其它依赖,优化的技巧也不涉及软件架构就是纯SQL优化。 由于笔者经验有限和…

AGI 之 【Hugging Face】 的【Transformer】的 [ Transformer 架构 ] / [ 编码器 ]的简单整理

AGI 之 【Hugging Face】 的【Transformer】的 [ Transformer 架构 ] / [ 编码器 ]的简单整理 目录 AGI 之 【Hugging Face】 的【Transformer】的 [ Transformer 架构 ] / [ 编码器 ]的简单整理 一、简单介绍 二、Transformer 三、Transformer架构 四、编码器 1、自注意…

【flutter问题记录】 无效的源发行版:17

问题描述 在看开源项目的时候,clone下来后一直编译失败,提示:无效的源发行版:17,看描述大概是jdk的版本问题,但是在Android studio各种指定都无用,网上资料也没有flutter项目的解决方案,最后在…

智源十大行业高质量数据集开放申请,经验证可显著提升模型行业能力!

近日,智源研究院非开源、高质量行业预训练数据集开放申请。该数据集覆盖医疗、教育、文学、金融、旅游、法律、体育、汽车、新闻、农业十大行业,总量达597GB。 智源研究院对较难获取的非开源高质量数据、合作伙伴贡献的数据、有行业特征的开源数据进行了…

深度分析和对比本地大语言模型Ollama和LocalAI

前言 在充满活力的人工智能(AI)世界中,开源工具已成为开发人员和组织利用LLM(大型语言模型)力量的重要资源。这些工具通过提供对高级LLM模型的访问权限,使各种用户能够构建创新和前沿的解决方案。在众多可…

【Python】变量与基本数据类型

个人主页:【😊个人主页】 系列专栏:【❤️Python】 文章目录 前言变量声明变量变量的命名规则 变量赋值多个变量赋值 标准数据类型变量的使用方式存储和访问数据:参与逻辑运算和数学运算在函数间传递数据构建复杂的数据结构 NameE…

【博客21】缤果Qt5仿小米耳机APP布局_PC端软件(高级篇)

小米耳机 提示:此软件只是实现简单的布局和界面跳转逻辑,并未加入小米协议相关内容 因需要鉴权方式等也无法进行通讯处理开发工具::qt-opensource-windows-x86-5.14.2 (编程语言C) 反编译工具: apktool 小米小爱开放平台 - 语音服务平台 - 文档中心 …

聚焦大模型应用落地,2024全球数字经济大会人工智能专题论坛在京举办

7月1日下午,2024全球数字经济大会人工智能专题论坛在中关村国家自主创新示范区会议中心举办。论坛紧扣大模型应用落地这一热点,以“应用即未来——大模型赋能千行百业,新生态拥抱产业未来”为主题,备受社会各界关注。 一、北京已…

Docker镜像加速配置

由于当前运营商网络问题,可能会导致您拉取 Docker Hub 镜像变慢,索引可以配置阿里云镜像加速器。阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台 每个人镜像地址都不一样,需要登陆阿里云自行查看,地址在上面&a…

底层软件 | Linux设备驱动模型和sysfs文件系统

Linux设备驱动模型和sysfs文件系统 Linux内核在2.6版本中引入设备驱动模型,简化了驱动程序的编写。Linux设备驱动模型包含设备(device)、总线(bus)、类(class)和驱动(driver),它们之间相互关联。其中**设备(device)和驱动(driver)通过总线(bus)**绑定在…

检测水管缺水的好帮手-管道光电液位传感器

管道光电液位传感器是现代清水管道管理中的重要技术创新,不仅提高了检测液位的精确度,还解决了传统机械式和电容式传感器存在的诸多问题,成为检测管道缺水的可靠利器。 该传感器采用先进的光学感应原理,利用红外光学组件通过精密…

2024源代码加密软件评测丨保护企业源代码防泄密

为什么需要对源代码进行加密?因为源代码泄密可能会带来一系列严重的后果: 源代码泄密会导致企业的知识产权被盗窃,竞争对手可能会利用这些代码开发类似的产品,从而削弱公司的市场竞争力。 由于知识产权被盗,公司可能会…

【机器学习】机器学习与医疗健康在疾病预测中的融合应用与性能优化新探索

文章目录 引言第一章:机器学习在医疗健康中的应用1.1 数据预处理1.1.1 数据清洗1.1.2 数据归一化1.1.3 特征工程 1.2 模型选择1.2.1 逻辑回归1.2.2 决策树1.2.3 随机森林1.2.4 支持向量机1.2.5 神经网络 1.3 模型训练1.3.1 梯度下降1.3.2 随机梯度下降1.3.3 Adam优化…

【c++】C++ IO流

本专栏内容为:C学习专栏,分为初阶和进阶两部分。 通过本专栏的深入学习,你可以了解并掌握C。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:C 🚚代码仓库:小小unicorn的代码仓库&…

使用Vue CLI方式创建Vue3.0应用程序

Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统。新版本的 Vue CLI 的包名由原来的 vue-cli 改成了 vue/cli。 在开发大型项目时,需要考虑项目的组织结构、项目构建和部署等问题。如果手动完成这些配置工作,工作效率会非常低。为此,Vue.…

嵌入式Linux系统编程 — 6.5 获取信号的描述信息

目录 1 strsignal()函数 2 psignal()函数 在 Linux 下,每个信号都有一串与之相对应的字符串描述信息,用于对该信号进行相应的描述。这些字符串位于 sys_siglist 数组中, sys_siglist 数组是一个 char *类型的数组,数组中的每一个…

《软件需求》读书笔记

商业的本质是供需和交换。软件行业也一样,生产别人所需要的软件并获得相应回报,就是成功。《软件需求》这本书是一本软件需求领域的工具书,很全面且具体,可以跳读。 在我所工作或了解的软件公司中,发现不论是初创企业…