特征工程中的OneHotEncoder与DictVectorizer

OneHotEncoder理解

作用

OneHotEncoder是一个常用的 数据预处理方法,它可以 将离散型变量转换为连续型变量,使之更适于机器学习模型的应用。通常我们会使用Pandas处理数据读入之后,使用OneHotEncoder对离散数据进行转换。

应用场景

OneHotEncoder可以处理多种类型的数据集,其中最具代表性的应用场景是:当我们使用线性回归、逻辑回归等模型时,我们需要对离散型变量进行编码,将其转换为连续型变量。

案例

先看代码

import numpy as np
from sklearn.preprocessing import OneHotEncoderenc = OneHotEncoder(handle_unknown='ignore')
X = [['Male', 1], ['Female', 3], ['Female', 2]]
#将所有的列都当成object类型进行处理,比如第2列的1,2,3,或者浮点数等等
enc.fit(X)# 打印数组
# array([[0., 1., 1., 0., 0.],
#        [1., 0., 0., 0., 1.],
#        [1., 0., 0., 1., 0.]])
print(enc.transform(X).toarray())# 打印稀疏矩阵
#  (0, 1)    1.0
#  (0, 2)    1.0
#  (1, 0)    1.0
#  (1, 4)    1.0
#  (2, 0)    1.0
#  (2, 3)    1.0
print(enc.transform(X))

one-hot值

为什么结果会是这样呢?先看数组形式

该数据一共有两个特征

  • 第一个特征有两个值 ['Male', 'Female'],那么 one-hot应该有两个二进制位表示,按照字典序,Female在前,为(1,0),那么 Male 应当为 (0,1)也即是:

    • Female:(1, 0)
    • Male: (0, 1)
  • 第二个特征值有三个值[1,3,2],同理,对应以下三个 one-hot值:

    • 1: (1, 0, 0)
    • 2: (0, 1, 0)
    • 3: (0, 0, 1)

数组形式

根据上面的分析,第一行为 ['Male', 1],对应的 one-hot值为 (0, 1)以及 (1, 0, 0),拼接后就是 (0, 1, 1, 0, 0),同理可以得到第二行为 (1, 0, 0, 0, 1),第三行为 (1, 0, 0, 1, 0),最终拼接后的结果就是

[[0., 1., 1., 0., 0.],[1., 0., 0., 0., 1.],1., 0., 0., 1., 0.]]

稀疏矩阵形式

OneHotEncoder默认是使用 稀疏矩阵作为结果返回的,下面介绍一下稀疏矩阵与数组返回如何转换

po_bhbcaffjabifha

如果希望返回数组,可以使用以下方式

# 获取稀疏矩阵转化为 array 
enc = OneHotEncoder(handle_unknown='ignore')
enc.transform(X).toarray()# 或者定义 OneHotEncoder 时指定参数 sparse_output为 False(默认为True)
# 老版本这个参数为 sparse,keras1.2 以后变为 sparse_output
enc = OneHotEncoder(handle_unknown='ignore', sparse_output=False)
enc.transform(X)

DictVectorizer理解

作用

将特征与值的映射字典组成的列表转换成向量

案例

from sklearn.feature_extraction import DictVectorizer# 设置sparse=False获得numpy ndarray形式的结果
v = DictVectorizer(sparse=False)
D = [{"foo": 1, "bar": 2}, {"foo": 3, "baz": 1}]# 对字典列表D进行转换,转换成特征矩阵
X = v.fit_transform(D)
# 特征矩阵的行代表数据,列代表特征,0表示该数据没有该特征
# [[2. 0. 1.]
# [0. 1. 3.]]
print(X)# 获取特征列名
# ['bar', 'baz', 'foo']
print(v.get_feature_names())# inverse_transform可以将特征矩阵还原成原始数据
# True
print(v.inverse_transform(X) == D)# 直接进行转换,不先进行拟合的话,无法识别新的特征
# [[0. 0. 4.]]
print(v.transform([{"foo": 4, "unseen_feature": 3}]))

说明

解释一下 fit_transform后为什么会是

[[2. 0. 1.][0. 1. 3.]
]

观察列表中所有的字典,一共有三个 key,因此结果应当有三列

三个key分别为 foo、bar以及baz,按照字典序,对应的索引为别为:

  • bar: 0
  • baz: 1
  • foo: 2

看看第一个字典,foo为1,那么索引值为2的地方的值为1,bar为2,那么索引为0的地方的值应当为2,因此第一行对应的值为 [2, 0, 1]

同理,第二行对应的值为 [0, 1, 3]

再看一个案例

当特征的值是字符串时,这个转换器将进行一个二进制One-hot编码。

One-hot编码是将特征所有可能的字符串值构造成布尔型值。例如: 特征f有一个值ham,一个值spam,转换后会变成两个特征f=ham和f=spam。

注意:

转换器只会将字符串形式的特征值转换成One-hot编码,数值型的不会转换。

一个字典中样本没有的特征在结果矩阵中的值是0。

#1)实例化一个转换器类 2)调用fir_transform()方法
from sklearn.feature_extraction import  DictVectorizer#导包
#下面的data是数据
data=[{'city':'北京','tempreature':100},{'city':'上海','tempreature':60},{'city':'深圳','tempreature':30},]# 实例化一个转换器类
transfer=DictVectorizer(sparse=False)
# 调用一fit_transform()方法
data_new=transfer.fit_transform(data)# [[ 0. 1. 0. 100.]
#  [ 1. 0. 0. 60.]
#  [ 0. 0. 1. 30.]]
print("看一下转换的结果data_new:\n",data_new)# 这里 city对应的值是字符串,该转换器将会对 city 进行二进制One-hot编码
# 排序为 字符串的 ord 字典序
# ['city=上海', 'city=北京', 'city=深圳', 'tempreature']
print("看一下特征的名字:\n",transfer.get_feature_names())

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

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

相关文章

2024 Studio One6.5:音乐制作的新里程碑

Studio One6.5:音乐制作的新里程碑 随着数字音乐制作技术的不断发展,Studio One6.5作为一款功能强大的音乐制作软件,凭借其出色的性能和丰富的功能,成为了众多音乐制作人的首选工具。本文将从Studio One6.5的特点、优势以及适用人…

百度语音识别

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、建号—获取试用KEY二、测试代码三、运行四、运行结果五、验证五、总结 一、建号—获取试用KEY https://console.bce.baidu.com/ai/#/ai/speech/overview/index…

vivado 高级编程功能1

适用于 7 系列、 UltraScale 和 UltraScale FPGA 和 MPSoC 的回读和验证 为 7 系列器件生成已加密文件和已经过身份验证的文件 注释 : 如需获取其它信息 , 请参阅《使用加密确保 7 系列 FPGA 比特流的安全》 ( XAPP1239 ) 。 要生成加密比特流…

onnxruntime 中的 Gather 算子

上一篇文章中介绍了 Division by Invariant Integers using Multiplication 的原理,很多框架均才用该算法优化除法运算。onnxruntime 是已知实现中最为简洁的,因此本文结合 onnxruntime 的 Gather 实现进行介绍。 Gather 算子是一个索引类算子&#xff0…

汽车贴膜改色小程序源码 汽车配色小程序源码 车身改色app源码 带后台 带数据

汽车贴膜改色小程序源码 车身改色app源码 汽车配色小程序源码 带后台 带数据 整站源码,包含完整前端小程序,后台源码,数据库数据。 直接部署,就能使用,源码素材远程开发,可以定制开发。 全开源,…

【测试篇】接口测试

接口测试,可以用可视化工具 postman。 如何做接口测试?? 我们可以先在浏览器中随机进入一个网页,打开开发者工具(F12)。 随便找一个接口Copy–>Copy as cURL(bash) 打开postman 复制地址 进行发送。 …

关系(二)利用python绘制热图

关系(二)利用python绘制热图 热图 (Heatmap)简介 热图适用于显示多个变量之间的差异,通过颜色判断彼此之间是否存在相关性。 快速绘制 基于seaborn import seaborn as sns import pandas as pd import numpy as np i…

Windows系统下载安装SQLServer

Windows系统下载安装SQLServer Microsoft SQL Server 是一个全面的数据库平台,使用集成的商业智能 (BI)工具提供了企业级的数据管理。Microsoft SQL Server 数据库引擎为关系型数据和结构化数据提供了更安全可靠的存储功能,使您可以构建和管理用于业务的…

如何从只会 C++ 语法的水平到达完成项目编写软件的水平?

初学者在学习C的过程中,通常首先接触的是基本语法和结构。然而,仅停留在“会用语法”的阶段并不能胜任实际项目的编写工作。要真正具备独立完成项目的能力,需要对C有更深入的理解和实践积累,这包括但不限于面向对象设计、数据结构…

Python学习:面相对象

面向对象 面向对象技术简介 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。方法:类中定义的函数。类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实…

k8s calico由IPIP模式切换为BGP模式

按照官网calico.yaml部署后,默认是IPIP模式 查看route -n , 看到是tunl0口进行转发 怎么切换到BGP模式呢? kubectl edit ippool 将ipipMode由Always修改为Never ,修改后保存文件即可。无需做任何操作,自动就切换为BG…

基于深度学习的端到端自动驾驶的最新进展:调研综述

基于深度学习的端到端自动驾驶的最新进展:调研综述 附赠自动驾驶学习资料和量产经验:链接 论文链接:https://arxiv.org/pdf/2307.04370.pdf 调研链接:https://github.com/Pranav-chib/ 摘要 本文介绍了基于深度学习的端到端自…