Python机器学习:特征变换

news2024/9/23 5:30:14

🌕 特征变换

特征变换主要就是针对一个特征,使用合适的方法,对数据的分布、尺度等进行变换,以满足建模时对数据的需求。

特征变换可分为数据的数据的无量纲化处理数据特征变换

🌗 数据的无量纲化处理

常用处理方法有:数据标准化、数据缩放、数据归一化等。

下面使用一个数据集进行演示。

import pandas as pd
data = pd.read_csv("D:/Pycharm/MachineLearning/program/data/chap2/Iris.csv")
print(data)

在这里插入图片描述
这里我们再去除“Id”列和“Species”列(因为数据的无量纲化只用数值就好)

import pandas as pd
data = pd.read_csv("D:/Pycharm/MachineLearning/program/data/chap2/Iris.csv")
data = data.drop(["Id","Species"],axis = 1)
print(data)

在这里插入图片描述

🌑 数据标准化

数据变量x标准化的公式为 x ′ = x − m e a n ( x ) s t d ( x ) x{'}=\frac{x-mean(x)}{std(x)} x=std(x)xmean(x),mean(x)为x的均值,std(x)为x的标准差,即每个数值减去变量的均值后再除以标准差。

import pandas as pd
data = pd.read_csv("D:/Pycharm/MachineLearning/program/data/chap2/Iris.csv")
data = data.drop(["Id","Species"],axis = 1)
data = (data - data.mean()) / data.std()
print(data)

在这里插入图片描述
在这里我们还可以使用sklearn库中preprocessing模块的scale()StandardScaler()函数来完成,可以通过参数with_mean和with_std来控制是否减去均值和是否除以标准差。下面使用箱线图进行可视化分析:

# 导入相关的库
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import preprocessing
# 中文显示问题
import matplotlib
matplotlib.rcParams['axes.unicode_minus']=False
import seaborn as sns
sns.set(font="Kaiti",style="ticks",font_scale=1.4)

data = pd.read_csv("D:/Pycharm/MachineLearning/program/data/chap2/Iris.csv")
data = data.drop(["Id","Species"],axis = 1)
data_scale1 = preprocessing.scale(data,with_mean = True,with_std = True)    # 使用scale函数标准化
data_scale2 = preprocessing.StandardScaler(with_mean = True,with_std = True).fit_transform(data)    # 使用StandardScale函数标准化

labs = ['SepalL','SepalW','PetalL','PetalW']    # 可用labs=data.columns.values获取列名,我这里重命名是因为原列名太长,列名之间会交错出现。

plt.figure(figsize = (14,6))
plt.subplot(1,3,1)      # 将画布分为1行3列3部分,现在对从左到右从上到下第1个图进行绘制 
plt.boxplot(data.values,notch = True,labels = labs)
plt.grid()              
plt.title("原始数据")
plt.subplot(1,3,2)      # 对第2个图进行绘制
plt.boxplot(data_scale1,notch = True,labels = labs)
plt.grid()
plt.title("第一种形式标准化")
plt.subplot(1,3,3)      # 对第3个图进行绘制
plt.boxplot(data_scale2,notch = True,labels = labs)
plt.grid()
plt.title("第二种形式标准化")
plt.subplots_adjust(wspace = 0.1)   # 调整每个图形间的间距
plt.show()

在这里插入图片描述
??上面这个图是个啥?这个怎么看?
先看下面这个图
在这里插入图片描述
也许你看了还是会感到迷惑,但如果我们将它横过来看一下:
在这里插入图片描述
因为正态分布里也有中位数、上四分位数和下四分位数,所以我们就可以将其结合起来看,如下图:

图片来自知乎博主:jinzhao → \rightarrow 原文链接
在这里插入图片描述

这样一对比,应该就好理解了,把箱线图当成正态分布图来理解就行了。

🌑 数据缩放

数据缩放的计算公式位: x ′ = x − m i n ( x ) m a x ( x ) − m i n ( x ) x^{'}=\frac{x-min(x)}{max(x)-min(x)} x=max(x)min(x)xmin(x),它可以将数据缩放到指定的范围。可以用preprocessing模块中的MinMaxScale()函数来完成,并且可以使用feature_range参数指定缩放的范围。

# 导入相关的库
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import preprocessing
# 中文显示问题
import matplotlib
matplotlib.rcParams['axes.unicode_minus']=False
import seaborn as sns
sns.set(font="Kaiti",style="ticks",font_scale=1.4)


data = pd.read_csv("D:/Pycharm/MachineLearning/program/data/chap2/Iris.csv")
data = data.drop(["Id","Species"],axis = 1)

data_minmax1 = preprocessing.MinMaxScaler(feature_range = (0,1)).fit_transform(data)
data_minmax2 = preprocessing.MinMaxScaler(feature_range = (1,10)).fit_transform(data)

labs = ['SepalL','SepalW','PetalL','PetalW']
plt.figure(figsize = (25,6))
plt.subplot(1,3,1)
plt.boxplot(data.values,notch = True,labels = labs)
plt.grid()
plt.title("原石数据")
plt.subplot(1,3,2)
plt.boxplot(data_minmax1,notch = True,labels = labs)
plt.grid()
plt.title("缩放范围为0~1")
plt.subplot(1,3,3)
plt.boxplot(data_minmax2,notch = True,labels = labs)
plt.grid()
plt.title("缩放范围为1~10")
plt.subplots_adjust(wspace = 0.1)
plt.show()

在这里插入图片描述

可以看到,和原始数据相比,缩放后的数据分布趋势变化不明显,但是数据的取值范围发生了改变。

preprocessing模块中MaxAbsScale()函数还可以通过最大绝对值缩放每个特征。

data_maxabs = preprocessing.MaxAbsScaler().fit_transform(data)
labs = ['SepalL','SepalW','PetalL','PetalW']
plt.figure(figsize = (16,6))
plt.subplot(1,2,1)
plt.boxplot(data.values,notch = True,labels = labs)
plt.grid()
plt.title("原始数据")
plt.subplot(1,2,2)
plt.boxplot(data_maxabs,notch = True,labels = labs)
plt.grid()
plt.title("MaxAbsScaler()")
plt.show()

在这里插入图片描述
变换后数据的取值范围为0~1,但是4个特征的整体取值大小的分布和原始特征的空间分布变化较大。

🌑 数据归一化

preprocessing模块中的normalize()函数可以对数据特征进行正则化归一化。

data_normL1 = preprocessing.normalize(data,norm = "l1",axis = 0)
data_normL2 = preprocessing.normalize(data,norm = "l2",axis = 0)

labs = ['SepalL','SepalW','PetalL','PetalW']
plt.figure(figsize = (15,6))
plt.subplot(1,2,1)
plt.boxplot(data_normL1,notch = True,labels = labs)
plt.grid()
plt.title("L1约束归一化")
plt.subplot(1,2,2)
plt.boxplot(data_normL2,notch = True,labels = labs)
plt.grid()
plt.title("L2约束归一化")
plt.subplots_adjust(wspace = 0.15)
plt.show()

在这里插入图片描述
可以看到两种数据整体的取值范围相似,但是在某些特征的取值上有较明显的差异,例如前两个箱线图的取值范围较小。

下面再使axis=1来看一下可视化后的结果。
在这里插入图片描述
可以看到数据取值范围发生了变化,数据分布趋势变化不明显。

🌗 数据特征变换

很多时候单个变量的分布情况可能不是我们所期望的那样,而我们希望数据的分布服从正态分布,或者说接近正态分布。为此,特征变换就是用来满足人们的期望。

🌑 对数变换

下面使用泊松分布的数据使用对数变换,将其转化为接近正态分布。

泊松分布: P ( X = k ) = λ k k ! e − λ P(X=k)=\frac{\lambda^k}{k!}e^{-\lambda} P(X=k)=k!λkeλ

  1. np.random.possion():该函数用于生成泊松分布的数据,possion的中文意思就是泊松分布,该函数的返回值是一个数组的形状。
  2. np.random.rand():该函数返回一组服从0~1([0,1))均匀分布的随机样本值。
  3. np.log():以e为底
  4. np.log10():以10为底
# 导入相关的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 中文显示问题
import matplotlib
matplotlib.rcParams['axes.unicode_minus']=False
import seaborn as sns
sns.set(font="Kaiti",style="ticks",font_scale=1.4)

np.random.seed(12)
x = 1 + np.random.poisson(lam = 1.5,size = 5000) + np.random.rand(5000)
lnx = np.log(x)
plt.figure(figsize = (10,6))
plt.subplot(1,2,1)
plt.hist(x,bins = 50)
plt.title("原始数据分布")
plt.subplot(1,2,2)
plt.hist(lnx,bins = 50)
plt.title("对数变换后数据分布")
plt.show()

在这里插入图片描述
可以看到,服从泊松分布的数据经过对数变换后,其分布情况更加接近于正态分布

🌑 Box-Cox变换

该变换是一种自动寻找最佳正态分布变换函数的 方法,计算公式为:
y ( λ ) { y λ − 1 λ ,        λ ≠ 0 l n y ,          λ = 0   y(\lambda)\begin{cases} \frac{y^{\lambda}-1}{\lambda},~~~~~~\lambda \ne 0\\ lny,~~~~~~~~\lambda = 0\ \end{cases} y(λ){λyλ1,      λ=0lny,        λ=0 
λ \lambda λ在取不同的值时有不同的数据变换效果,可通过scipy.stats模块中的boxcox()函数完成。

# 导入相关的库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import boxcox
# 中文显示问题
import matplotlib
matplotlib.rcParams['axes.unicode_minus']=False
import seaborn as sns
sns.set(font="Kaiti",style="ticks",font_scale=1.4)

np.random.seed(12)
x = 1 + np.random.poisson(lam = 1.5,size = 5000) + np.random.rand(5000)
boxcox1 = boxcox(x,lmbda = 0)		# 对数变换
boxcox2 = boxcox(x,lmbda = 0.5)		# x^-1的变换
boxcox3 = boxcox(x,lmbda = 2)		# x^2的变换
boxcox4 = boxcox(x,lmbda = -1)		# 1/x的变换

plt.figure(figsize = (14,8))
plt.subplot(2,2,1)
plt.hist(boxcox1,bins = 50)
plt.title("ln(x)")
plt.subplot(2,2,2)
plt.hist(boxcox2,bins = 50)
plt.title("x^-1")
plt.subplot(2,2,3)
plt.hist(boxcox3,bins = 50)
plt.title("x^2")
plt.subplot(2,2,4)
plt.hist(boxcox4,bins = 50)
plt.title("1/x")
plt.subplots_adjust(hspace = 0.4)   # 调整子图布局,修改子图间距。hspace是调整子图间高度内边距
plt.show()

在这里插入图片描述
可以看到,原始数据经变换后,只有对数变换后的分布情况更接近于正态分布。

🌑 指定变换

sklearn库中的preprocessing模块提供了几种将数据变换为指定数据分布的方法,例如QuantileTransformer是一种利用数据的分位数信息进行数据特征变换的方法,可以把数据变换为指定的分布。

# 导入相关的库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn import preprocessing
# 中文显示问题
import matplotlib
matplotlib.rcParams['axes.unicode_minus']=False
import seaborn as sns
sns.set(font="Kaiti",style="ticks",font_scale=1.4)

np.random.seed(12)
x = 1 + np.random.poisson(lam = 1.5,size = 5000) + np.random.rand(5000)
QTn = preprocessing.QuantileTransformer(output_distribution = "normal",random_state = 0)  # 定义将数据变换为正态分布的方法
QTnx = QTn.fit_transform(x.reshape(5000,1)) # 若要对x进行对数变换,x要转化为二维数组
plt.figure(figsize = (12,5))
plt.subplot(1,2,1)
plt.hist(x,bins = 50)
plt.title("原始数据分布")
plt.subplot(1,2,2)
plt.hist(QTnx,bins = 50)
plt.title("变换后的数据分布")
plt.show()

在这里插入图片描述
可以看到,原始数据转换成了标准的正态分布。

总结:特征变换的目的,就是为了满足建模时对数据的需求

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

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

相关文章

22.0:Codejock Suite Pro for ActiveX COM:Crack

从 Visual Basic 5.0 和 6.0 开始一直到当前版本的 Visual Studio 的大多数 ActiveX 容器。与 Visual Studio 无缝集成并包含我们所有 ActiveX COM 产品的评估版本。评估版不提供 OCX 文件的 Unicode 版本。 创建包含一整套高度可定制的用户界面组件的专业应用程序,…

Flink-FinkSQL基本操作(Table API、动态表、事件窗口、分组聚合开窗查询、联结查询)

11 Table API和SQL 11.1 快速上手 引入TableAPI的依赖 桥接器 <dependency><groupId>org.apache.flink</groupId> <artifactId>flink-table-api-java-bridge_${scala.binary.version}</artifactId><version>${flink.version}</vers…

12、常用插件

文章目录12、常用插件推荐1&#xff1a;Alibaba Java Coding Guidelines推荐2&#xff1a;jclasslib bytecode viewer推荐3&#xff1a;Translation推荐4&#xff1a;GenerateAllSetter推荐5&#xff1a;Rainbow Brackets推荐6&#xff1a;CodeGlance Pro推荐7&#xff1a;Stat…

7.bWAPP -- INSECURE DIRECT OBJECT REFERENCES

7.bWAPP – INSECURE DIRECT OBJECT REFERENCES 0x01、Insecure DOR (Change Secret) 同 XSS - Stored (Change Secret) Low 仔细观察页面, 发现隐藏一个input标签, 作用是输入用户名, 并且配合提交的修改密码, 完成修改用户密码的操作: 这里就可以利用该用户名input标签达…

如何带好一个团队?团队管理的要点有哪些?

想带好一个团队并不是这么容易&#xff0c;尤其是对于新晋升管理者来说更是难上加难。团队管理可以大大提高工作效率。那么&#xff0c;团队管理的要点是什么呢&#xff1f; 1、远景和目标 成员们先要有一个共同的目标&#xff0c;在此基础上还必须要有一个好的愿景&#xff0…

即时通讯系列---如何下手做技术方案设计

1. 引出主题 IM整体涉及的内容比较多, 做技术方案设计需要慎重, 可以先从功能列表以及核心case逐步的总结出技术方案 本文结构: 1. 查看功能列表 2. 核心case分析 3. 总结技术方案设计 2. 如何做技术方案设计 1. 查看功能列表 功能清单 一级分类 二级分类 三级分类…

TCP/UDP网络编程

目录 一、常见的客户端服务端模型 二、Socket套接字 1、概念 2、分类 a、流套接字 b、数据报套接字 c、原始套接字 三、UDP数据报套接字编程 四、TCP数据报套接字编程 一、常见的客户端服务端模型 客户端&#xff1a;用户使用的程序。 服务端&#xff1a;给用户提…

miracl编译及使用

文章目录Windows平台编译网址 https://miracl.com/https://github.com/miracl/MIRACL Windows平台编译 源码目录下新建文件夹ms32或ms64&#xff0c;把/lib/ms32doit.bat或ms64doit.bat分别拷进去。 把源码include和source目录所有文件拷贝进要编译的ms32或ms64&#xff0c…

【高阶数据结构】海量数据如何处理? (位图 布隆过滤器)

&#x1f308;欢迎来到高阶数据结构专栏~~位图 & 布隆过滤器 (꒪ꇴ꒪(꒪ꇴ꒪ )&#x1f423;,我是Scort目前状态&#xff1a;大三非科班啃C中&#x1f30d;博客主页&#xff1a;张小姐的猫~江湖背景快上车&#x1f698;&#xff0c;握好方向盘跟我有一起打天下嘞&#xff0…

模拟实现list / list迭代器

前言&#xff1a;学习C的STL&#xff0c;我们不仅仅要求自己能够熟练地使用各种接口&#xff0c;我们还必须要求自己了解一下其底层的实现方法&#xff0c;这样可以帮助我们写出比较高效的代码程序&#xff01; ⭐在本篇文章中&#xff0c;list的迭代器是重点&#xff0c;它不…

WSL2配置网络代理

注意&#xff1a;本文参考自文章&#xff1a;WSL2配置代理&#xff0c;是对原文的补充&#xff0c;使其适用于河对岸云服务代理。 1 开启Windows代理 1.1 开启代理软件的局域网访问权限 请注意&#xff1a;本文的WSL2代理配置&#xff0c;需要Windows的代理软件已经能够正常…

HTTPS详解及HTTPS实验

目录 HTTPS 一&#xff0c;https在参考模型中的位置 二&#xff0c;什么是HTTPS 三&#xff0c;什么是SSL 1&#xff0c;SSL 协议分为两层&#xff1a; 2&#xff0c;SSL 协议提供的服务&#xff1a; 四&#xff0c;HTTPS的加密方式 1&#xff0c;常见的加密算法 2&#xff0c;…

mysql知识点

目录 1.mysql聚合函数&#xff1a; 2.having&#xff08;用来过滤数据&#xff09;&#xff1a; HAVING 不能单独使用&#xff0c;必须要跟 GROUP BY 一起使用 WHERE 与 HAVING 的对比 3.升序和降序 4.等于 5.实战demo&#xff1a; 1.mysql聚合函数&#xff1a; 常用的聚…

codeforces签到题之div3

前言 第一次&#xff43;&#xff4f;&#xff44;&#xff45;&#xff46;&#xff4f;&#xff52;&#xff43;&#xff45;&#xff53;&#xff0c;发现几个问题&#xff1a; 1,不知道选&#xff4c;&#xff41;&#xff4e;&#xff47;&#xff55;&#xff41;&…

17正交距阵和Gram-Schmidt正交化

标准正交向量与正交矩阵 上一节介绍过的正交向量&#xff0c;通过一个式子进行回顾&#xff0c;设q是标准正交向量组中的任意向量&#xff0c;则 这很好地表现了标准正交向量组内各向量的性质&#xff1a; 不同向量之间相互垂直&#xff08;正交&#xff09;&#xff0c;向量…

Ribbon 负载均衡

介绍Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。Ribbon是Netflix发布的开源项目&#xff0c;主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时&#xff0c;重试等。简单的说&#xff0c;就…

屏幕录制软件推荐,分享这3款,简单好用

​网络上充斥着许多各种各样的屏幕录制软件&#xff0c;许多有选择困难的朋友可能会充满怀疑&#xff1a;哪个电脑屏幕录制软件很容易使用&#xff1f;屏幕录制软件推荐哪个比较好&#xff1f;别担心&#xff0c;今天&#xff0c;小编分享这这3个简单好用的屏幕录制软件&#x…

Day10 C++STL入门基础知识七——案例1【评委打分】

路漫漫其修远兮&#xff0c;吾将上下而求索 文章目录1. 承接上文1. 案例描述2. 实现思路3. 亿点点分析3.1 创建选手类3.1.1 具体思路3.1.2 代码展示3.2 创建5名选手并对其姓名、平均分进行初始化3.2.1 具体思路① 创建vector容器② 创建一个creatPlayer()函数a.调用函数b. 初始…

若依框架基于@PreAuthorize注解的权限控制

目录 一、Java注解&#xff08;Annotation&#xff09; 1. 概述 2. Annotation通用定义 &#xff08;1&#xff09;interface &#xff08;2&#xff09;Documented &#xff08;3&#xff09;Target(ElementType.TYPE) &#xff08;4&#xff09;Retention(Ret…

IDEA插件

Lombok用注解的方式&#xff0c;简化了 JavaBean 的编写。注解下面介绍一下常用的几个注解&#xff1a;Setter 注解在类或字段&#xff0c;注解在类时为所有字段生成setter方法&#xff0c;注解在字段上时只为该字段生成setter方法。Getter 使用方法同上&#xff0c;区别在于生…