深入解析onehot

一、onehot向量

1、onehot向量,也叫做one-of-k编码,将一个离散的类别变量映射为一个高维向量,具体来说就是将一个类别变量映射为一个只有一个元素为1,其他元素都为0的向量。

2、举个例子,假如现在有一个属性为{red, green, blue},那么它可以被映射为如下三个向量:[1, 0, 0], [0, 1, 0], [0, 0, 1]。

3、onehot向量常用于表示分类变量,如性别和学历等,方便模型计算。

二、one shot

1、与onehot向量类似的概念是one shot,它也是用来将类别变量映射成向量的方法。不同的是,onehot向量只有一个元素为1,其他为0,而one shot中,每个元素都可以是1或0。

2、继续以上面的颜色属性为例,one shot可以将红色映射为[1,0,0],浅红色映射为[1,1,0],黄色映射为[0,1,1]。

三、onehotencoder 用法

1、onehotencoder是sklearn里一个用来进行onehot编码的类。其用法如下:

from sklearn.preprocessing import OneHotEncoder

# 假设我们的数据长这样
x = [['青岛', 22], ['济南', 21], ['青岛', 23], ['烟台', 20]]

# 我们先对城市进行标签编码
from sklearn.preprocessing import LabelEncoder
city_encoder = LabelEncoder()
city_labels = city_encoder.fit_transform([row[0] for row in x])

# 再对城市进行onehot编码,要注意reshape一下
ohe = OneHotEncoder(categories='auto')
x_city = ohe.fit_transform(city_labels.reshape(-1, 1))

# 将年龄和城市合并为一个矩阵
x_age = np.array([row[1] for row in x]).reshape(-1, 1)
x1 = np.hstack((x_city.toarray(), x_age))

2、上面的代码中,我们先用LabelEncoder对青岛、济南、烟台进行了标签编码,将它们分别编码为0、1、2。接着我们用OneHotEncoder对城市进行了onehot编码,得到如下编码结果:

| 青岛 | 济南 | 烟台 |
| :—–: | :—–: | :—–: |
| 1 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 0 | 0 | 1 |

3、最后,我们把城市和年龄合并为一个矩阵,得到完整的样本:

| 青岛 | 济南 | 烟台 | 年龄 |
| :—: | :—: | :—: | :—: |
| 1 | 0 | 0 | 22 |
| 0 | 1 | 0 | 21 |
| 1 | 0 | 0 | 23 |
| 0 | 0 | 1 | 20 |

四、onehot code

1、实现一个简单的onehot编码的代码如下:

def one_hot_encoding(x):
    """
    :param x: 输入列表
    :return: onehot编码后的二维列表
    """
    unique_x = list(set(x))
    encoding_map = {unique_x[i]: [0] * i + [1] + [0] * (len(unique_x)-i-1) for i in range(len(unique_x))}
    return [encoding_map[e] for e in x]

2、此代码可以输入任意一个列表,返回它的onehot编码结果。大致思路是先找出列表里的所有唯一值,然后用一个字典生成式来生成每个唯一值的对应编码,最后把整个列表每个元素都进行编码。

五、onehot状态

1、在实际应用中,onehot编码可能会因为离散类别数量过多而导致维度过高,进而影响模型效果。

2、还有一种情况是,如果本应该被当做一个整体来考虑的类别变量被拆开编码之后,可能会失去一些本应有的信息。

3、因此,onehot编码需要根据具体情况来判断是否适用,以及在使用时需要注意类别数量和编码方式的选择,既要保证有效表示信息,也要尽量避免维度灾难的影响。

六、onehot可以转换string

1、在sklearn中,我们可以用LabelEncoder将离散类别映射成数字,然后使用OneHotEncoder将数字转换成onehot向量;而在tensorflow中,我们可以使用tf.feature_column.categorical_column_with_vocabulary_list将离散类别映射成onehot向量。

2、例:

import tensorflow as tf

# 假设我们有一个字符串向量
colors = tf.constant(['red', 'blue', 'green', 'green', 'yellow'])

# 我们使用categorical_column_with_vocabulary_list生成一个特征列
colors_column = tf.feature_column.categorical_column_with_vocabulary_list(key='colors', vocabulary_list=['red', 'blue', 'green', 'yellow'])

# 使用onehot_column将特征列转换成onehot向量
colors_onehot = tf.feature_column.indicator_column(colors_column)

# 将向量输入到神经网络中
net = tf.layers.dense(inputs=tf.feature_column.input_layer({'colors': colors}), units=10)

3、上面的代码中,我们使用了categorical_column_with_vocabulary_list将字符串向量映射成了onehot向量,得到的结果与前面LabelEncoder和OneHotEncoder所得到的结果相同。

总结

本文对onehot从多个方面进行了深入阐述,包括onehot向量、one shot、onehotencoder 用法、onehot code、onehot状态和onehot可以转换string等方面。其中,onehot向量和onehotencoder是常用的应用方式,而onehot状态需要根据具体情况进行选择和优化。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/249539.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-12 17:12
下一篇 2024-12-12 17:12

相关推荐

  • 深入解析Vue3 defineExpose

    Vue 3在开发过程中引入了新的API `defineExpose`。在以前的版本中,我们经常使用 `$attrs` 和` $listeners` 实现父组件与子组件之间的通信,但…

    编程 2025-04-25
  • 深入理解byte转int

    一、字节与比特 在讨论byte转int之前,我们需要了解字节和比特的概念。字节是计算机存储单位的一种,通常表示8个比特(bit),即1字节=8比特。比特是计算机中最小的数据单位,是…

    编程 2025-04-25
  • 深入理解Flutter StreamBuilder

    一、什么是Flutter StreamBuilder? Flutter StreamBuilder是Flutter框架中的一个内置小部件,它可以监测数据流(Stream)中数据的变…

    编程 2025-04-25
  • 深入探讨OpenCV版本

    OpenCV是一个用于计算机视觉应用程序的开源库。它是由英特尔公司创建的,现已由Willow Garage管理。OpenCV旨在提供一个易于使用的计算机视觉和机器学习基础架构,以实…

    编程 2025-04-25
  • 深入了解scala-maven-plugin

    一、简介 Scala-maven-plugin 是一个创造和管理 Scala 项目的maven插件,它可以自动生成基本项目结构、依赖配置、Scala文件等。使用它可以使我们专注于代…

    编程 2025-04-25
  • 深入了解LaTeX的脚注(latexfootnote)

    一、基本介绍 LaTeX作为一种排版软件,具有各种各样的功能,其中脚注(footnote)是一个十分重要的功能之一。在LaTeX中,脚注是用命令latexfootnote来实现的。…

    编程 2025-04-25
  • 深入剖析MapStruct未生成实现类问题

    一、MapStruct简介 MapStruct是一个Java bean映射器,它通过注解和代码生成来在Java bean之间转换成本类代码,实现类型安全,简单而不失灵活。 作为一个…

    编程 2025-04-25
  • 深入理解Python字符串r

    一、r字符串的基本概念 r字符串(raw字符串)是指在Python中,以字母r为前缀的字符串。r字符串中的反斜杠(\)不会被转义,而是被当作普通字符处理,这使得r字符串可以非常方便…

    编程 2025-04-25
  • 深入探讨冯诺依曼原理

    一、原理概述 冯诺依曼原理,又称“存储程序控制原理”,是指计算机的程序和数据都存储在同一个存储器中,并且通过一个统一的总线来传输数据。这个原理的提出,是计算机科学发展中的重大进展,…

    编程 2025-04-25
  • 深入了解Python包

    一、包的概念 Python中一个程序就是一个模块,而一个模块可以引入另一个模块,这样就形成了包。包就是有多个模块组成的一个大模块,也可以看做是一个文件夹。包可以有效地组织代码和数据…

    编程 2025-04-25

发表回复

登录后才能评论