详解one-hot独热编码

1. one-hot 独热

独热,是机器学习中初学者经常听到的一个词。

从字面意义看,独表示唯独,一家独大,独占鳌头,独热表示只有1个热,其他都是凉的。

事实也是如此。

我们来看一个独热编码的例子:

[0, 1, 0, 0, 0]

可以看到,上面只有一个1,其他都是凉凉的0,这就是独热。

假设,我们有5种状态:金、木、水、火、土。我们给这5个状态留了5个空,它们都有专门的位置。

数字位置编号
0
1
2
3
4

自从有了这个规则以后,但凡是老金出现,都是以这种状态示人:[1, 0, 0, 0, 0],我有5个兄弟,我表示第一个。老土出现那就是:[0, 0, 0, 0, 1]

如果两个一起出现,是这样式的:[[1, 0, 0, 0, 0],[0, 0, 0, 0, 1]].

这就是独热的表示。

2. 为什么要用独热?

为什么会用这种奇怪的方式表示呢?老金直接是0,老土直接是4不就完了?

其实这么做是有目的的。

独热是为了体现公平。每次出现都携带者团队成员的数量,避免了招摇撞骗,说房子是自己的,其实自己只占几份之一。另外,每个成员只能是1,只是用来标记是不是你,无法夸大你的比重,比如展示成[99, 0, 0, 0, 0],这样就不是独热的标准。

通过独热的编码标准,使得计算时,公平公正。大家的值都是1,避免了你是1我是2,出现谁大谁小从而干扰计算。

如果,你的基础学科比较好的话,其实我上面说那么多,都是下面的通俗化:

大部分算法是基于向量空间中的度量来进行计算的,为了使非偏序关系的变量取值不具备偏序性,而且到圆点是等距的。使用one-hot编码,将离散特征的取值扩展到了欧式空间,离散特征的某个取值就对应欧式空间的某个点。将离散型特征使用one-hot编码,会让特征之间的距离计算更加合理。

3. 独热的局限

虽然,独热编码有优势。但是,它也是有局限性的。

独热适合表示少量的,无关联的数据。

  • 首先说它不适合大量的数据。如果总共有5条数据,那其中一条是这么表示[1, 0, 0, 0, 0],如果是10条,这么表示[1, 0, 0, 0, 0, 0, 0, 0, 0, 0]。如果是5000条,那就是1个1,4999个0。这种情况,术语上叫过于稀疏,反而不利于计算。

  • 另外,也是因为独热很公正公平,所以导致成员间没有个人关系。有时候,尤其当自然语言处理时,我们很希望能表示出每个词语间的相关性。

比如,我们要表示心情好坏程度,有如下几种心情:悲伤、郁闷、无聊、微笑、大笑、爆笑。那么,我们假设以0为中心点,负面的情绪定义为负数,正面的情绪定义为正数。上面几种状态可以这么表示:

心情表示
悲伤-3
郁闷-2
无聊-1
微笑1
大笑2
爆笑3

这样,我们就可以了解他们之间的关系了:爆笑(3)程度要大于微笑(1)。大笑(2)和郁闷(-2)是完全相反的状态。

这种带成员关系的数据,就不合适用独热来表示了。

4. 独热的应用场景

一般的分类问题,比如手写数字识别,OCR识别,花朵种类识别。

TensorFlow提供了一个将数值转换为独热编码的方法:

import tensorflow as tf
labels = [1,2,3]
ys = tf.keras.utils.to_categorical(labels, 5)
print(ys)

最终输出的结果:

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

此方法很有用,因为一般训练集标记的不是独热编码,比如手写识别结果存储都是具体的:3、6、2,我们可以使用to_categorical来转化为独热编码。

好的,独热编码是一种常用的数据处理方式,主要用于深度学习中的分类任务。它将每个类别都转换为一个向量,向量的长度为类别总数,向量中只有对应类别的位置上是1,其余位置都是0。这样的处理方式可以让模型更好地理解类别之间的关系,提高模型的分类精度。 下面是python实现独热编码的代码: ```python import numpy as np def one_hot_encoding(labels, num_classes): """ :param labels: 标签列表 :param num_classes: 类别总数 :return: 独热编码矩阵 """ one_hot = np.zeros((len(labels), num_classes)) for i, label in enumerate(labels): one_hot[i][label] = 1 return one_hot ``` 这个函数接收两个参数:标签列表和类别总数。它首先创建一个全零矩阵,矩阵的行数等于标签列表的长度,列数等于类别总数。然后遍历标签列表,将矩阵中对应位置设置为1。最后返回独热编码矩阵。 使用这个函数很简单,只需要将标签列表和类别总数传入即可。例如,假设我们有一个包含10个样本的数据集,共有3个类别,标签分别为0、1、2。那么可以这样调用函数: ```python labels = [0, 1, 2, 0, 1, 2, 0, 1, 2, 0] num_classes = 3 one_hot = one_hot_encoding(labels, num_classes) print(one_hot) ``` 输出结果为: ``` [[1. 0. 0.] [0. 1. 0.] [0. 0. 1.] [1. 0. 0.] [0. 1. 0.] [0. 0. 1.] [1. 0. 0.] [0. 1. 0.] [0. 0. 1.] [1. 0. 0.]] ``` 可以看到,函数成功地将标签列表转换成了独热编码矩阵。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值