离散数据编码方式总结(OneHotEncoder、LabelEncoder、OrdinalEncoder、get_dummies、DictVector

news2025/2/23 2:59:45

写在前面

在机器学习的特征选择的时候,往往有一些离散的特征不好计算,此时需要对这些特征进行编码,但是编码方式有很多,不同的包也会有不同的编码方式。(明白OneHotEncoder、LabelEncoder、OrdinalEncoder、get_dummies、DictVectorizer的区别吗?)

通过在Titanic预测的学习, 在这里对不同包的编码方式进行一个小总结。 至少以后使用的时候,不那么的乱用了。

先记住对离散数据进行编码的总原则:

  • 离散特征的取值之间没有大小的意义,比如color:[red,blue], 性别的男女等,那么就使用OneHot编码
  • 离散特征的取值有大小的意义,比如size:[X,XL,XXL],身高的高,中,低等,那么就使用数值的映射(数字){X:1,XL:2,XXL:3}进行编码

列出不同的包可以实现上面功能的函数

  • 进行OneHot编码
  1. pd.get_dummies()
  2. sklearn.preprocessing.OneHotEncoder()
  3. sklearn.feature_extraction.DictVectorizer()
  • 进行数字编码
  1. map函数映射
  2. sklearn.preprocessing.LabelEncoder()
  3. sklearn.preprocessing.OrdinalEncoder()

下面就分别梳理一下不同的包里面一些不同的函数进行编码时使用方法,这里以Titanic中的数值处理的例子展开:

Titanic数据的原始形式长这个样子:

在这里面,可以发现,Sex列的这一个特征有’male’和’female’两个取值,而这两个值相互之间没有大小的意义,所以需要对Sex列进行独热编码。

而Pclass列的取值“3”,“2”, “1” 表示的船票的等级,有大小的意义,我们对其进行数字编码(因为这个3, 2, 1本身是数字,后面我为了更好的解释数字编码,提取数据的时候,把3, 2, 1转换成“high”, “medium”, “low”,这样带有等级意义的字符串)

所以下面,我单独提取这两列数据进行操作,任务就是把Sex列进行Onehot编码, 对Pclass列进行数字编码。我提取处理后的数据长这样:

任务一:OneHot编码

方法一:pd.get_dummies

这是pandas自带的将数据转成独热编码的方式,简单,并且好用,可以当做首选,尤其是表格数据的时候。详情可以参考官方文档,也可以简单的参考一下这篇笔记pandas.get_dummies 的用法。

这里,我只想通过上面的任务看看应该怎么使用。

再看一遍数据的样子:

看上面的data数据,如果我直接对整个data进行编码的话

d = pd.get_dummies(data)
print(d)

结果如下:

当然这里,我们只需要对Sex列进行独热编码

data1 = pd.get_dummies(data['Sex'], columns=np.unique(data['Sex'].values)) 
data1

结果如下:

注意: get_dummies转独热编码,是针对离散的字符串的数据,整数的话我发现仍然保留原来的样子。

方法二:OneHotEncoder()

输入是字符串或者整数。

但是要注意,OneHotEncoder的fit_transform()函数接收是二维数组的形式,所以如果是pandas表格的某一列,也需要到时候转换一下,直接看操作把。输出也是二维数组的形式。下面我又DataFrame了一下

from sklearn.preprocessing import OneHotEncoder 

ohe = OneHotEncoder(sparse=False)# 非稀疏 
data2 = ohe.fit_transform(data['Sex'].values.reshape(-1,1))# 转成二维数组
ohe.get_feature_names_out() 
data2 = pd.DataFrame(data2, columns=['female','male']) 
data2

结果长这样:

方法三:DictVectorizer

实现了 “one-of-K” 或 “one-hot” 编码,用于分类(也称为标称,离散)特征。分类功能是 “属性值” 对,其中该值被限制为不排序的可能性的离散列表(例如主题标识符,对象类型,标签,名称…)。

这个fit_transform里面接收的要是一个字典的形式,输出是二维数组。

from sklearn.feature_extraction import DictVectorizer 

dvec = DictVectorizer(sparse=False) 
data3 = dvec.fit_transform(data.to_dict(orient='record')) 
data3

这里我先用了整个data看看效果,会发现那两列字符串都转成了OneHot的形式

如果是只需要转换Sex列,需要下面这样:

temp = pd.DataFrame(data['Sex'], columns=['Sex'])
dvec = DictVectorizer(sparse=False) 
data3 = dvec.fit_transform(temp.to_dict(orient='record')) 
data3

把Sex列单独拿出来处理。

方法四: 附加一个keras.utils.to_categorical

这个也是实现的one-hot编码,不过一般是用于类别,也就是标签的时候,是把类别标签转换为onehot编码(categorical就是类别标签的意思,表示现实世界中你分类的各类别),如果特征想要编码成one-hot,还是不要用这个了吧。原型如下:

to_categorical(y, num_classes=None, dtype=‘float32’)

将整型的类别标签转为onehot编码。y为int数组,num_classes为标签类别总数,大于max(y)(标签从0开始的)。

返回:如果num_classes=None,返回len(y) * [max(y)+1](维度,m*n表示m行n列矩阵,下同),否则为len(y) * num_classes。

下面看个例子:

import keras 

ohl=keras.utils.to_categorical([1,3]) 
# ohl=keras.utils.to_categorical([[1],[3]]) 
print(ohl) 
""" 
[[0. 1. 0. 0.] 
 [0. 0. 0. 1.]] 
""" 

ohl=keras.utils.to_categorical([1,3],num_classes=5) 
print(ohl) 
""" 
[[0. 1. 0. 0. 0.] 
 [0. 0. 0. 1. 0.]] 
"""

任务二:数字映射编码

方法一:map()函数映射

这是一种很方便,很快的方式。使用map()函数。

pclass_map ={label:idx for idx, label in enumerate(set(data['Pclass']))} 
# 也可以pclass_map = {"low":0, "medium":1, "high":2} 
d1 = data['Pclass'].map(pclass_map) 
d1

上面可以发现,如果是用for循环的这种map函数, 编码形式虽然是0,1,2这种数字形式,但是含义已经掩盖掉了。 也就是说0,1,2已经不能说明什么意义了,只是分别代表high,medium,low这三个字符串。所以如果类别少的话,我们最好是自己自定义进行映射,比如上面我注释掉的那个,那个的0,1,2还分别代表低,中,高,顺序意义还在。

为什么说这点呢? 接下往下看。

方法二:LabelEncoder()

这个看官方文档,一般是用于类别标签的,如果用于特征的话,默认并不是按照低、中、高这样的顺序进行编码的,也就是说,这个和上面那种for循环定义映射的那个一样,虽然成功的改成了数字,但是意义不在了。

from sklearn.preprocessing import LabelEncoder 

le = LabelEncoder() 
d2 = le.fit_transform(data['Pclass']) 
d2

所以人家官方文档才把这个函数的作用说成:

使用0到n_classes-1之间的值对目标标签进行编码。该转换器应用于编码目标值,即 y,而不是输入X。

所以这个函数,别乱用到特征的编码。

方法三:OrdinalEncoder()

将分类特征编码为整数数组。

该转换器的输入应为整数或字符串之类的数组,表示分类(离散)特征所采用的值。要素将转换为序数整数。这将导致每个要素的一列整数(0到n_categories-1)。

所以,这个才是真正的用到分类特征上的映射数字编码,并且还会保留原来的顺序。

from sklearn.preprocessing import OrdinalEncoder 

oe = OrdinalEncoder() 
d3 = oe.fit_transform(data['Pclass'].values.reshape(-1,1)) 
d3

看这个函数,把低,中,高分别编码成了0, 1, 2. 保留了原来的顺序。

所以这个函数编码中也是很好用的。

总结一下

根据上面的使用简单的总结一下:

1、独热编码用于离散的特征且数据无大小意义的数据

  • get_dummies,输入可以是pandas, 输出的时候会多出转换后的几列,这个好用一点。数值内容会被遍历当作表头。
  • OneHotEnCoder的fit_transform,输入是二维数组(字符串或者整数),把每一行当作一个样本,每一列当作一个特征,输出的形式也是二维数组。数值内容会被遍历当作表头。
  • DictVectorizer的fit_transform,输入是字典形式,输出的形式也是二维数组。数值内容会保留。

2、数字映射编码

  • map()映射灵活性很强,就看自己怎么写了。
  • LableEncoder是用于类别标签的,不会保留大小意义,数值内容会保留。
  • OrdinalEncoder是用于特征的,可以保留大小意义,输入为整数或字符串之类的数组,数值内容会保留。

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

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

相关文章

网络基础之重中之重

目录 IP协议 ​编辑 基本概念: 协议头格式: ​编辑 网段划分 DHCP : CIDR: 特殊的IP地址: IP地址的数量限制: 私有IP和公网IP 路由 路由的过程: 数据链路层 认识以太网&#x…

【JAVA】类和对象,继承

❤️ Author: 老九 ☕️ 个人博客:老九的CSDN博客 🙏 个人名言:不可控之事 乐观面对 😍 系列专栏: 文章目录 什么是类,对象类和类的实例化字段的初始化类中实现方法static 静态关键字 封装priva…

HarmonyOS/OpenHarmony(Stage模型)应用开发单一手势(二)

三、拖动手势(PanGesture) .PanGestureOptions(value?:{ fingers?:number; direction?:PanDirection; distance?:number}) 拖动手势用于触发拖动手势事件,滑动达到最小滑动距离(默认值为5vp)时拖动手势识别成功&am…

IP初学习

1.IP报文 首部长度指的是报头长度,用于分离报头和有效载荷 2.网段划分 IP地址 目标网络 目标主机 3.例子 4.特殊的IP地址 5.真正的网络环境 6.调制解调器 “猫”,学名叫宽带无线猫 7.NAT 源IP在内网环境不断被替换 8.私有IP不能出现在公网上 因…

Python学习之三 变量与数据类型深度学习

本部分内容参考自以下书。 在学习之二中说道,所有的数据类型都是类,那么变量以及对应的值都是对象。为了后续更容易理解,我们先来看一下内置函数id的帮助文档。 它用于返回对象的标识。此标识在生命周期内必须是唯一且恒定的。 在Python中,变量只是名称,赋值操作并不会复…

做西班牙语翻译好不好?西班牙语薪酬如何?

众所周知,西班牙语作为全球应用广泛的“小语种”,市场对它的翻译需求极为庞大。西班牙语翻译是你寻求优秀事业的新赛道!那么,西班牙语翻译薪酬如何,北京西语翻译哪家好? 美国的调查数据告诉你,西…

Linux下的系统编程——进程(七)

前言: 程序是指储存在外部存储(如硬盘)的一个可执行文件, 而进程是指处于执行期间的程序, 进程包括 代码段(text section) 和 数据段(data section), 除了代码段和数据段外, 进程一般还包含打开的文件, 要处理的信号和CPU上下文等等.下面让我们开始对Linux进程的学…

spring6详细讲解

Spring6 1、概述 1.1、Spring是什么? Spring 是一款主流的 Java EE 轻量级开源框架 ,Spring 由“Spring 之父”Rod Johnson 提出并创立,其目的是用于简化 Java 企业级应用的开发难度和开发周期。Spring的用途不仅限于服务器端的开发。从简单…

粉丝经验分享:13:00 开始的面试,13:06 就结束了,问题真是变态

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

hdfs滚动升级(rollingUpgrade )

最近对hdfs的升级过程很感兴趣,所以准备研究下其升级的过程,本篇文章是依据官网文档进行的升级过程(地址:Apache Hadoop 2.10.2 – HDFS Rolling Upgrade),该文章中还有关于降低的介绍,感兴趣的…

【快手小玩法-弹幕游戏】开发者功能测试报告提交模板

背景 快手有明确的要求,准入和准出更加严格,要求有明确的测试报告。格式如下: *本文参考字节wiki:CP侧测试报告模板(复制填写轻雀文档) 其他文章推荐:【抖音小玩法-弹幕游戏】开发者功能测试报告提交模板 一、前言…

Lesson03---类与对象(中篇)

lesson5: 一、类的6个默认成员函数(2:29:10) 1.什么是空类?(2:29:40) a.空类中真的什么都没有吗?(2:29:50)…

学习MATLAB

今日,在大学慕课上找了一门关于MATLAB学习的网课,MATLAB对于我们这种自动化的学生应该是很重要的,之前也是在大三的寒假做自控的课程设计时候用到过,画一些奈奎斯特图,根轨迹图以及伯德图,但那之后也就没怎…

网络协议三要素

计算机语言作为程序员控制一台计算机工作的协议,具备了协议的三要素。 语法,就是这一段内容要符合一定的规则和格式。例如,括号要成对,结束要使用分号等。语义,就是这一段内容要代表某种意义。例如数字减去数字是有意…

单目标追踪——【Transformer】Autoregressive Visual Tracking

目录 文章侧重点网络结构Encoder(特征提取与融合得到Vision Features)Decoder(Vision FeatureMotion Feature 特征融合与输出)运动特征生成特征融合与输出 消融实验N与VocabularyBins 论文链接:https://paperswithcode…

CocosCreator3.8研究笔记(三)CocosCreator 项目结构说明及编辑器的简单使用

我们通过Dashboard 创建一个2d项目,来演示CocosCreator 的项目结构。 等待创建完成后,会得到以下项目工程: 一、assets文件夹 assets文件夹:为资源目录,用来存储所有的本地资源,如各种图片,脚本…

一文快速了解代理https和sock5协议的区别

一、什么是https协议 HTTPS 协议全称:HyperText Transfer Protocol Secure(超文本传输安全协议),是一种通过计算机网络进行安全通信的传输协议。 作用于应用层(application layer)中。 HTTPS 是在HTTP 的…

[C++]学习中的一个问题

#include<iostream> #include<string> #include<cstring> using namespace std;int main(){char str[31];cout << "----" << sizeof(str) << endl;// 给了memset(str, 0, sizeof(str));for (size_t i 0; i < 31; i){cout &l…

打造高权重店铺的秘密,详解Shopee平台权重评估机制(测评补单)

很多虾皮卖家经常提到的"权重"是指商品或店铺在Shopee平台上的重要性程度。权重评估了商品或店铺是否符合用户需求&#xff0c;并且能否促进订单转化率&#xff0c;为平台带来收益。说白了权重就是给商品和店铺打分的机制&#xff0c;得分越高&#xff0c;权重越高&a…

C语言——函数的使用

无参无返回值 语法格式如下&#xff1a; // 函数定义 void 函数名() {函数体 }// 函数调用 函数名();函数名是标识符的一种&#xff0c;需要遵循规则函数只需要定义一次&#xff0c;反复调用只定义函数, 不调用函数, 函数永远不会被执行案例需求&#xff1a; 编写一个函数&am…