详细详解OneHot编码-附代码
机器学习算法⽆法直接⽤于数据分类。数据分类必须转换为数字才能进⼀步进⾏。
在本教程中,你将发现如何将输⼊或输出的序列数据转换为⼀种热编码,以便于你在Python中深度学习的序列分类问题中使⽤。
本教程分为4部分:
1.什么是One-Hot编码?
2.⼿动编写One-Hot编码
3.One-Hot Encode with scikit-learn.
4.One-Hot Encode with Keras.
1.什么是One-Hot编码?
One-Hot编码,⼜称为⼀位有效编码,主要是采⽤N位状态寄存器来对N个状态进⾏编码,每个状态都由他独⽴的寄存器位,并且在任意时候只有⼀位有效。
One-Hot编码是分类变量作为⼆进制向量的表⽰。这⾸先要求将分类值映射到整数值。然后,每个整数值被表⽰为⼆进制向量,除了整数的索引之外,它都是零值,它被标记为1。2.One-Hot编码的⼯作⽰例
让我们⽤⼀个⼩例⼦来说明⼀下到底什么是One-Hot编码。假设我们有⼀个带有’red’和’green’值的标签序列。我们可以将’red’的整数值分配为0,’green’的整数值为1。只要我们总是将这些数字分配给这些标签,这称为整数编码。⼀致性是重要的,所以我们可以稍后反转编码,并从整数值获取标签。
接下来,我们可以创建⼀个⼆进制向量来表⽰每个整数值。对于2个可能的整数值,向量的长度为2。
编码为0的“红⾊”标签将⽤⼆进制向量[1,0]表⽰,其中第0个索引被标记为值1。然后,编码为1的“绿⾊”标签将⽤⼀个⼆进制向量[0,1],其中第⼀个索引被标记为1。
如果我们有序列:
‘red’,‘red’,‘green’。
我们可以⽤整数编码来表⽰它:
0,0,1
⽽One-Hot编码就为:
123
[1,0][1,0][0,1]
1.为什么要使⽤One-Hot编码?
One hot 编码进⾏数据的分类更准确,许多机器学习算法⽆法直接⽤于数据分类。数据的类别必须转换成数字,对于分类的输⼊和输出变量都是⼀样的。
我们可以直接使⽤整数编码,需要时重新调整。这可能适⽤于在类别之间存在⾃然关系的问题,例如温度“冷”(0)和”热“(1)的标签。
当没有关系时,可能会出现问题,⼀个例⼦可能是标签的“狗”和“猫”。
在这些情况下,我们想让⽹络更具表现⼒,为每个可能的标签值提供概率式数字。这有助于进⾏问题⽹络建模。当输出变量使⽤one-hot编码时,它可以提供⽐单个标签更准确的⼀组预测。
2.⼿动One Hot编码:
在这个例⼦中,我们将假设我们有⼀个字符串的例⼦,但是⽰例序列并不涵盖所有可能的例⼦。
我们将使⽤以下字符的输⼊序列:
Hello world。
我们将假设所有可能输⼊是⼩写字母和空格的完整字母表。因此,我们将以此展⽰如何滚动我们⾃⼰的one hot编码。
完整的⽰例如下所⽰。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26from numpy import argmax
# define input string
data ='hello world'
print(data)
# define universe of possible input values
alphabet ='abcdefghijklmnopqrstuvwxyz '
# define a mapping of chars to integers
char_to_int = dict((c, i)for i, c in enumerate(alphabet)) int_to_char = dict((i, c)for i, c in enumerate(alphabet)) # integer encode input data
integer_encoded =[char_to_int[char]for char in data] print(integer_encoded)
# one hot encode
onehot_encoded = list()
for value in integer_encoded:
letter =[0for _ in range(len(alphabet))]
letter[value]=1
onehot_encoded.append(letter)
print(onehot_encoded)
# invert encoding
inverted = int_to_char[argmax(onehot_encoded[0])] print(inverted)
运⾏⽰例⾸先打印输⼊字符串。运⾏结果:
u@u-VirtualBox:~$ python onehot.py
hello world
[7,4,11,11,14,26,22,14,17,11,3]
[[0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]]
h
[[0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]]
h
[[0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 h
[[0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0],[0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 h
[[0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 h
[[0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 h
[[0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 h
[[0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 h
[[0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 h
[[0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 h
[[0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0
所有可能的输⼊的映射都是从char值创建为整数值。然后使⽤该映射对输⼊字符串进⾏编码。我们可以看到输⼊’h’中的第⼀个字母被编码为7。然后将整数编码转换为one hot编码。⼀次
完成⼀个整数编码的字符。创建0个值的列表,以便字母表的长度可以表⽰任何预期的字符的长度。
接下来,特定字符的索引标记为1。我们可以看到,编码为7的第⼀个字母“h”整数由⼆进制向量表⽰,长度为27,第七个索引标记为1。
最后,我们反转第⼀个字母的编码并打印结果。我们通过使⽤NumPy argmax()函数定位具有最⼤值的⼆进制向量中的索引,然后使⽤字符值的反向查表中的整数进⾏整数。
3.One-Hot Encode with scikit-learn:
在这个例⼦中,我们假设你有⼀个输出序列如下3个标签:
1Cold,warm,hot
10个时间序列的⽰例顺序可以是:
1Cold,cold,warm,cold,hot,hot,warm,cold,warm,hot
这将⾸先需要⼀个整数编码,如1,2,3,然后是整数到one hot编码具有3个值的⼆进制向量,例如[1,0,0]。
这个情况下提供序列中每个可能值的⾄少⼀个⽰例。因此,我们可以使⽤⾃动⽅法来定义整数到⼆进制向量的映射。
在这个例⼦中,我们将使⽤scikit学习库的编码器。具体来说,LabelEncoder创建标签的整数编码,OneHotEncoder⽤于创建整数编码值的one hot编码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20from numpy import array
from numpy import argmax
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder
# define example
data =['cold','cold','warm','cold','hot','hot','warm','cold','warm','hot'] values = array(data)
print(values)
# integer encode
label_encoder =LabelEncoder()
integer_encoded = label_encoder.fit_transform(values)
print(integer_encoded)
# binary encode
onehot_encoder =OneHotEncoder(sparse=False)
integer_encoded = shape(len(integer_encoded),1) onehot_encoded = onehot_encoder.fit_transform(integer_encoded)
print(onehot_encoded)
# invert first example
inverted = label_encoder.inverse_transform([argmax(onehot_encoded[0,:])]) print(inverted)
运⾏⽰例⾸先打印标签序列。之后是标签的整数编码,最后是one hot编码。训练数据包含所有可能⽰例的集合,因此我们可以依靠整数和one hot编码变换来创建标签到编码的完整映射。
默认情况下,OneHotEncoder类将返回更⾼效的稀疏编码,这可能不适⽤于某些应⽤程序。例如使⽤Keras深度学习库。在这种情况下,我们通过设置sparse = False这个参数来禁⽤稀疏返回类型。
⾸先,我们可以使⽤argmax()NumPy函数来到具有最⼤值的列的索引。然后可以将其输⼊到LabelEncoder,以计算反向变换回⽂本标签。运⾏结果为:
['cold''cold''warm''cold''hot''hot''warm''cold''warm''hot']
[0020112021]
[[1.0.0.]
[1.0.0.]
[0.0.1.]
[1.0.0.]
[0.1.0.]
[0.1.0.]
[0.0.1.]
[1.0.0.]
[0.0.1.]
[0.1.0.]]
['cold']
在下⼀个例⼦中,我们来看⼀下如何直接对⼀个整数值进⾏one hot编码。
4.One Hot Encode with Keras:
您可能有⼀个已经是整数编码的序列。
经过处理后,您可以直接使⽤整数。或者,您可以直接对整数进⾏one hot 编码。这是⾮常重要的如果整数没有真正的顺序关系并且只是标签的占位符。Keras提供了⼀个名为to_categorical()的函数,它可以帮助你使⽤one hot编码整数数据。接下来我们看⼀个⼩例⼦:
在这个例⼦中,我们有4个整数值[0,1,2,3],我们有以下10个数字的输⼊序列:
Data = [1,3,2,0,3,2,2,1,0,1]
该序列具有已知了所有值,因此我们可以直接使⽤to_categorical()函数。以下列出了此功能的完整⽰例。
1 2 3 4 5 6 7 8 9 10 11 12 13from numpy import array
from numpy import argmax
from keras.utils import to_categorical # define example
data =[1,3,2,0,3,2,2,1,0,1] data = array(data)
print(data)
# one hot encode
encoded = to_categorical(data) print(encoded)
# invert encoding
inverted = argmax(encoded[0])
print(inverted)
运⾏⽰例并打印输⼊序列。
然后将整数编码为⼆进制向量并打印。我们可以看到,正如我们预期的那样,第⼀个整数值1被编码为[0,1,0,0]。然后,我们使⽤NumPy argmax()函数反转编码,该函数返回第⼀个整数的期望值1的序列中的第⼀个值。[1320322101]
[[0.1.0.0.]
numpy教程 pdf
[0.0.0.1.]
[0.0.1.0.]
[1.0.0.0.]
[0.0.0.1.]
[0.0.1.0.]
[0.0.1.0.]
[0.1.0.0.]
[1.0.0.0.]
[0.1.0.0.]
1
参考页⾯:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。