独热编码(One-Hot Encoding)

news/2024/10/30 15:29:50/文章来源:https://www.cnblogs.com/arwen-xu/p/18515901

一、独热编码出现之前:针对无序离散的分类特征,机器学习算法的分类器并不能直接进行数据处理。因为,分类器通常处理的数据是连续且有序的。

但是我们可以对这些离散的特征数据建立映射表来让其有序并且连续起来。例如:针对一个人对象,我们可以假设其属性进行了如下映射。

性别特征:
["男","女"] => 0,1 =>二维
居住地特征:
["北京","上海,"深圳"] => 0,1,2 =>三维
职业特征:
["演员","老师","公务员","工程师","消防员"] => 0,1,2,3,4 => 五维

此时,针对样本A(女,北京,老师)=>(1,0,2)先进行特征映射,然后采用独热编码使其转化成有序且连续。

二、如何处理数据:

1. 什么是独热编码?

独热编码(One-Hot Encoding),又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候,其中只有一位有效。即,只有一位是1,其余都是零值。独热编码 是利用0和1表示一些参数,使用N位状态寄存器来对N个状态进行编码。

例如,对六个状态进行编码:
自然顺序码为 000,001,010,011,100,101
独热编码则是 000001,000010,000100,001000,010000,100000

回到一开始的例子,性别特征:["男","女"],按照N位状态寄存器来对N个状态进行编码的原理:

性别特征:["男","女"](这里N=2 二维数据)
男 => 10
女 => 01

地区特征:["北京","上海,"深圳"](这里N=3,三维数据):
北京 => 100
上海 => 010
深圳 => 001

工作特征:["演员","厨师","公务员","工程师","律师"](这里N=5,五维数据):
演员 => 10000
老师 => 01000
公务员 => 00100
工程师 => 00010
消防员 => 00001

所以,样本A的特征是["女","北京","工程师"]的时候,独热编码(One-Hot Encoding)的结果为:

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

2. 优点

在回归,分类,聚类等机器学习算法中,特征之间距离的计算或相似度的计算是非常重要的。而常用的距离或相似度的计算都是在欧式空间的相似度计算,计算余弦相似性,基于的就是欧式空间。
使用独热编码(One-Hot Encoding),将离散特征的取值扩展到了欧式空间,离散特征的某个取值就对应欧式空间的某个点。将离散型特征使用独热编码(One-Hot Encoding),会让特征之间的距离计算更加合理。

独热编码的优点为:

1.能够处理非连续型数值特征。
2.在一定程度上也扩充了特征。比如性别本身是一个特征,经过one hot编码以后,就变成了男或女两个特征。

特征类别较多时,数据经过独热编码可能会变得过于稀疏。

参考:独热编码(One-Hot Encoding)介绍及实现_天空下的斌的博客-CSDN博客_独热码表

数据处理——One-Hot Encoding_zhiyong_will的博客-CSDN博客

三、 sklearn Python 代码实现

from sklearn import preprocessing

encoder = preprocessing.OneHotEncoder()
# 4个特征:

#第一个特征(即为第一列)为[0,1,2,1],其中三类特征值[0,1,2],因此One-Hot Code可将[0,1,2]表示为:[100,010,001]
#第一个特征有三种值:采用三个编码:[100,010,001]
#同理第二个特征列可将两类特征值[2,3]表示为[10,01]
#第三个特征将4类特征值[1,2,4,5]表示为[1000,0100,0010,0001]
#第四个特征将2类特征值[3,12]表示为[10,01]

encoder.fit([
[0, 2, 1, 12],
[1, 3, 5, 3],
[2, 3, 2, 12],
[1, 2, 4, 3]
])
encoded_vector = encoder.transform([[2, 3, 5, 3]]).toarray()
print("\n Encoded vector =", encoded_vector)
#[[0. 0. 1. 0. 1. 0. 0. 0. 1. 1. 0.]]
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/yanghaoji/article/details/123734304

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

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

相关文章

Python工具箱系列(五十七)

图像分割与人脸识别 众所周知图像是由若干有意义的像素组成的,图像分割作为计算机视觉的基础,对具有现有目标和较精确边界的图像进行分割,实现在图像像素级别上的分类任务。图像分割可分为语义分割和实例分割两类,区别如下: 语义分割:将图像中每个像素赋予一个类别标签,…

Nuxt.js 应用中的 imports:dirs 事件钩子详解

title: Nuxt.js 应用中的 imports:dirs 事件钩子详解 date: 2024/10/30 updated: 2024/10/30 author: cmdragon excerpt: imports:dirs 是 Nuxt.js 中的一个生命周期钩子,用于扩展导入目录。通过这个钩子,开发者可以灵活地添加、修改或删除项目中的导入目录,从而提高模块…

OSI模型

Java 复习笔记 OSI模型 开放式系统互联通信参考模型(英语:Open System Interconnection Reference Model,缩写为 OSI) 1-7 物联网叔会使用 (资源子网) 应用层为应用程序提供交互服务 。域名系统DNS文件传输FTP支持万维网(www)应用的HTTP协议,支持电子邮件的SMTP协议 表…

12 编程基础:语句与函数

编程有自己的语法, if,then,end if while循环 for循环 将语言打包成函数, 有专门的函数库公开使用,还有声音、图像库

ubuntu安装smaba

1、更新软件包列表sudo apt update2、安装Sambasudo apt install samba3、一旦安装完成,您可以编辑Samba配置文件sudo nano /etc/samba/smb.conf4、在此文件中,您可以设置共享目录和权限。例如,添加一个简单的共享[share]comment = Samba on Ubuntupath = /media/usb/sharer…

刚刚买的域名被DNS劫持了怎么处理

在当今数字化的时代,域名作为网络世界的重要标识,对于个人和企业的在线业务都至关重要。然而,有时会遭遇令人头疼的问题,比如新买的域名被DNS劫持。这不仅会影响网站的正常访问,还可能导致用户信息泄露、业务受损等严重后果。那么,当我们面临这种情况时,应该如何妥善处理…

【笔记】【Android】Manifest中的intent-filter使用

【笔记】【Android】Manifest中的intent-filter使用笔记系列,内容是从网络搜索的结果,不一定是正确的理解。 如果存在谬误,欢迎大家指正。intent-filter是为了标明Activity,Service或者Braodcast Receiver可以相应的intent类型。 基本结构 <activity android:name="…

IIS禁用自动回收

主要设置了线程池里面的 1、启动模式: 由默认值改为AlwaysRunning2、 固定时间间隔:由默认1740 改为 03、将闲置空闲时间改为 0

grafana如何使用定义的变量

1.先看效果 2.定义变量 3.sql语句中使用变量

日志管理系统的系统目标是什么?

在网络安全、数据管理、故障排查等领域,日志都被广泛使用并需要进行有效的管理与分析。因此,日志管理系统的系统目标显得尤为重要,如以下几方面。 1、确保数据的安全性及完整性 在企业和组织的日常运营中,各类信息数据都会通过系统生成和传递,而这种数据往往是宝贵且敏感…

239. 滑动窗口最大值(难)

目录题目法一、暴力枚举法二、双端队列 题目给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回 滑动窗口中的最大值 。法一、暴力枚举遍历数组,获取每个窗口的子数…