在本教程中,我们将学习将我们的输入或输出序列数据转换为一个热门编码,用于序列分类。
一个热编码是机器学习的一个有用特性,因为很少有机器学习算法不能直接处理分类数据。在处理数据集时,我们遇到了没有特定偏好顺序的列。
如果我们正在处理序列分类类型问题,分类数据必须转换成数字。当我们使用深度学习方法时,例如长短期记忆递归神经网络,也可以使用这种技术。
首先,我们将讨论分类数据。
什么是分类数据?
分类数据是具有标签值而不是数值的变量类型。这些类型的变量也被称为名义变量。让我们看看下面分类数据的例子。
- 一辆“车”可变配值:“马鲁蒂”和“捷豹”。
- 值为“ Veg ”和“非 Veg ”的“食品”变量。
- 一个“”放置”变量的值为:“第一个”、“第二个”和“第三个”。
正如我们在上面的代码中看到的,一些类别可能有自然的关系,比如自然排序。在第三个示例中,“place”变量具有自然的值顺序。
分类数据的问题
一些机器学习算法能够直接处理分类数据。少数算法不能直接对标签数据进行操作,因为它们要求所有的数据变量和输出变量都是数字。
因此,我们必须将分层数据转换为数字形式。假设分类变量是输出变量。在这种情况下,您可能还希望通过模型将预测更改回分类形式,以表示它们或在某些应用中使用它们。
如何将分类数据转换为数字数据
有两种方法用于将分类数据转换为数字数据。
- 整数编码
- 一次性编码
在下一节中,我们将讨论一热编码。
什么是热门编码?
单一热编码用于将分类变量转换为数值。在进行进一步的数据分析之前,分类值被映射为整数值。每列包含“0”或“1”,对应于它被放置的列。在这个过程中,每个整数值都表示为二进制向量,除了用 1 标记的整数索引之外,该向量都为零。
一个热编码的例子
让我们通过下面这个简单的例子来理解它。
假设我们有一系列带有“黄色”和“红色”值的标签。为了将它们转换为数值,我们为“黄色”指定一个整数值 1,对应于列中的类别数,为“红色”指定 0。当我们遇到这些标签时,我们将分配相同的整数值。它被称为整数编码。
让我们看另一个例子——假设有一个类别叫做动物,它有四个值——猫、狗、牛和骆驼。考虑由动物及其相应分类值组成的下表。
输入表-
| 动物 | 动物的分类价值 | | 猫 | five | | 狗 | Ten | | 母牛 | Fifteen | | 骆驼 | Eleven |
经过一次热编码后,输出如下所示。
| 猫 | 狗 | 母牛 | 骆驼 | | one | Zero | Zero | Zero | | Zero | one | Zero | Zero | | Zero | Zero | one | Zero | | Zero | Zero | Zero | one |
如果我们以向量的形式表示上面的输出,那么它将如下所示。
Cat - > [1,0,0,0]
狗- > [0,1,0,0]
奶牛- > [0,0,1,0]
Camel - > [0,0,0,1]
为什么使用一个热编码?
One Hot 编码的一个最大优点是,它代表分类数据,更具表现力。正如我们前面讨论的,许多机器学习算法不能直接处理分类数据,因此需要将其转换为整数。
我们可以直接或在需要的地方使用整数值。它可以解决自然序数在类别之间有关系的问题。例如-我们可以将整数值赋给“天气”标签,如‘冬季’、‘夏季’和‘季风’。
但是如果找不到序数关系,可能会有问题。如果我们允许表象倾斜或任何这样的关系,它可能会损害解决问题的学习。
手动一次热编码
在下面的示例中,我们将考虑一个将被转换为整数值的字母字符串示例。
hello world
现在,我们将对上面给定的字符串值实现一个热编码。让我们看看下面的例子。
示例-
from numpy import argmax
# Here we are define input string
str_data = 'hello python'
print(str_data)
# Here we are defining possible input values of english alphabate
eng_alphabet = 'abcdefghijklmnopqrstuvwxyz '
# define a mapping of chars to integers
char_to_int = dict((c, i) for i, c in enumerate(eng_alphabet))
int_to_char = dict((i, c) for i, c in enumerate(eng_alphabet))
# input data is encoding in integer
int_encoded = [char_to_int[char] for char in data]
print(int_encoded)
# one hot encode
onehot_encoded = list()
for value in int_encoded:
letter = [0 for _ in range(len(eng_alphabet))]
letter[value] = 1
onehot_encoded.append(letter)
print(onehot_encoded)
# invert encoding
inverted = int_to_char[argmax(onehot_encoded[0])]
print(inverted)
输出:
hello python
[7, 4, 11, 11, 14, 26, 15, 24, 19, 7, 14, 13]
[[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, 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, 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, 0, 0, 0, 0, 0, 1],
[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, 0, 0, 1, 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, 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, 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]]
说明:
在上面的代码中,我们已经声明并打印了输入字符串。接下来,我们定义了可能输入值的宇宙。然后,创建从字符值到整数值的所有可能输入的映射。我们使用这个映射来编码输入字符串。
我们可以在上面的输出中看到,第一个字母 h 编码为 7。然后,这个整数编码被转换成一个热编码。一次一个整数编码字符。
每个字符都有特定的索引值;我们将特定字符的索引标记为 1。第一个字符在二进制向量 27 中表示为 7。我们将第 7指数标记为 1 表示 h
现在,我们将学习使用 scikit-learn 库实现一个热编码。
一个使用 Scikit-learn 的热编码
在本例中,让我们假设以下 3 个标签的输出序列。
"apple"
"mango"
"banana"
10 个时间步长示例序列可以是。
apple, apple, mango, apple, banana, banana, mango, apple.
我们用整数值对上面的标签进行编码,比如 1,2,3。在热编码中,我们将使用具有 3 个值的二进制向量,例如[1,0,0]。该序列包括序列中一个可能值的至少一个例子。
我们将使用 scikit-learn 库。我们将使用其中的标签编码器模块来创建标签的整数编码,使用 OneHotEncoder 来创建整数编码值的 one hot 编码。
让我们理解下面的例子。
示例-
from numpy import array
from numpy import argmax
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder
# defining sequence example
data_1 = ['apple', 'apple', 'mango', 'apple', 'banana', 'banana', 'mango', 'apple']
values_of_seq = array(data_1)
print(values_of_seq)
# first appling integer encode
label_encoder = LabelEncoder()
integer_encoded = label_encoder.fit_transform(values_of_seq)
print(integer_encoded)
# Now doing binary encode
onehot_encoder = OneHotEncoder(sparse=False)
integer_encoded = integer_encoded.reshape(len(integer_encoded), 1)
onehot_encoded = onehot_encoder.fit_transform(integer_encoded)
print(onehot_encoded)
输出:
['apple' 'apple' 'mango' 'apple' 'banana' 'banana' 'mango' 'apple']
[0 0 2 0 1 1 2 0]
[[1\. 0\. 0.]
[1\. 0\. 0.]
[0\. 0\. 1.]
[1\. 0\. 0.]
[0\. 1\. 0.]
[0\. 1\. 0.]
[0\. 0\. 1.]
[1\. 0\. 0.]]
解释-
在上面的代码中,首先,我们打印了标签序列。然后,我们执行整数编码,最后是热编码。OneHotEncoder 类返回组织良好的稀疏编码。但是这对于某些应用来说并不有效,例如使用 keras 库。
一种带有 Keras 的热编码
假设我们有一个已经被整数编码的序列。我们可以直接使用整数编码,或者将整数编码映射到标签值上。我们可以使用to _ classic()函数对整数数据进行热编码。
在这个例子中,我们有五个整数值[0,1,2,3,4],我们有一个由以下 15 个数字组成的输入序列。
data_1 = [1, 4, 3, 3, 0, 3, 2, 2, 4, 0, 1, 2, 1, 4, 3]
让我们理解下面的例子。
示例-
from numpy import array
from numpy import argmax
from keras.utils import to_categorical
# define example
data_1 = [1, 4, 3, 3, 0, 3, 2, 2, 4, 0, 1, 2, 1, 4, 3]
data = array(data_1)
print(data)
# one hot encoding using the to_categorical() method
encoded = to_categorical(data)
print(encoded)
# invert encoding
inverted = argmax(encoded[0])
print(inverted)
输出:
[1 4 3 3 0 3 2 2 4 0 1 2 1 4 3]
[[0\. 1\. 0\. 0\. 0.]
[0\. 0\. 0\. 0\. 1.]
[0\. 0\. 0\. 1\. 0.]
[0\. 0\. 0\. 1\. 0.]
[1\. 0\. 0\. 0\. 0.]
[0\. 0\. 0\. 1\. 0.]
[0\. 0\. 1\. 0\. 0.]
[0\. 0\. 1\. 0\. 0.]
[0\. 0\. 0\. 0\. 1.]
[1\. 0\. 0\. 0\. 0.]
[0\. 1\. 0\. 0\. 0.]
[0\. 0\. 1\. 0\. 0.]
[0\. 1\. 0\. 0\. 0.]
[0\. 0\. 0\. 0\. 1.]
[0\. 0\. 0\. 1\. 0.]]
1
解释-
在上面的代码中,我们已经将整数编码为二进制向量并打印出来。然后,我们使用 Numpy argmax() 函数来反转序列中第一个值的编码。