one-hot 独热编码tf.one_hot()

独热编码即 One-Hot 编码,又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候,其中只有一位有效。

一、问题由来

在机器学习算法中,我们经常会遇到分类特征,例如:人的性别有男女,祖国有中国,美国,法国等。
这些特征值并不是连续的,而是离散的,无序的。通常我们需要对其进行特征数字化。

那什么是特征数字化呢?例子如下:

  • 性别特征:["男","女"]

  • 祖国特征:["中国","美国,"法国"]

  • 运动特征:["足球","篮球","羽毛球","乒乓球"]

假如某个样本(某个人),他的特征是这样的["男","中国","乒乓球"],我们可以用 [0,0,4] 来表示,但是这样的特征处理并不能直接放入机器学习算法中。因为类别之间是无序的(运动数据就是任意排序的)。

二、举例

就拿上面的例子来说吧,性别特征:["男","女"],按照N位状态寄存器来对N个状态进行编码的原理,咱们处理后应该是这样的(这里只有两个特征,所以N=2):

男  =>  10

女  =>  01

祖国特征:["中国","美国,"法国"](这里N=3):

中国  =>  100

美国  =>  010

法国  =>  001

运动特征:["足球","篮球","羽毛球","乒乓球"](这里N=4):

足球  =>  1000

篮球  =>  0100

羽毛球  =>  0010

乒乓球  =>  0001

所以,当一个样本为["男","中国","乒乓球"]的时候,完整的特征数字化的结果为:

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

下图可能会更好理解:

https://img.mukewang.com/5b20f1b90001cc2202550045.jpg

三、程序中如何实现

在tensorflow中有tf.one_hot(),这个函数是将input转化为one-hot类型数据输出,相当于将多个数值联合放在一起作为多个相同类型的向量,可用于表示各自的概率分布,通常用于分类任务中作为最后的FC层的输出。函数原型如下

one_hot(indices, depth, on_value=None, off_value=None, axis=None, dtype=None, name=None)
    Returns a one-hot tensor.

indices表示输入的多个数值,通常是矩阵形式;depth表示输出的尺寸。 
由于one-hot类型数据长度为depth位,其中只用一位数字表示原输入数据,这里的on_value就是这个数字,默认值为1,one-hot数据的其他位用off_value表示,默认值为0

import tensorflow as tf
classes = 5 #特征的维度为5,比如周一到周五
labels = [4,1,2] # 现在有3个样本,第一个样本表示周4,第二个样本表示周1,第3个样本表示周2
output = tf.one_hot(labels,classes)#将这3个样本进行独热编码:


sess = tf.Session()
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    output = sess.run(output)
    print("output of one-hot is : ",output)

# output of one-hot is :  [[0. 0. 0. 0. 1.]
#  [0. 1. 0. 0. 0.]
#  [0. 0. 1. 0. 0.]]

猜你喜欢

转载自blog.csdn.net/weixin_38145317/article/details/88683889