Python一键式编码–使用Sklearn实现

时间:2020-02-23 14:42:22  来源:igfitidea点击:

一键编码是一种以二进制矢量形式表示分类数据的技术。
在执行分类之前,这是处理顺序数据的常用步骤。

一键编码还提供了一种实现单词嵌入的方法。
单词嵌入是指将单词转换为数字以便机器能够理解的过程。

通常先在语料库中嵌入单词,然后再将其输入LSTM模型。
从语料库中嵌入单词使计算机更容易找到单词之间的关系和模式。

在本教程中,我们将了解什么是一键编码,然后使用Sklearn来实现它。

使用Python进行一键编码的工作

考虑以下单词序列。

['Python', 'Java', 'Python', 'Python', 'C++', 'C++', 'Java', 'Python', 'C++', 'Java' ]

这是具有三个类别的顺序数据。

上面数据中的类别如下:

  • Python
  • Java
  • C++

让我们尝试了解一键编码背后的工作原理。

一站式取心具有两个步骤。

  • 将类别转换为整数
  • 整数到二进制向量的转换

1.将类别转换为整数

让我们将示例中的三个类别转换为整数。

C++0
Java1
Python2

现在,我们可以使用这些整数表示原始数据,如下所示:

[2 1 2 2 0 0 1 2 0 1]

您可以使用上面的转换表读取此数据。

现在转到第二步。

2.将整数转换为二进制向量

这不是通常的整数到二进制的转换。
而是在此转换中,我们仅将与整数相对应的值索引设置为1,而在向量中将所有其他条目设置为零。

让我们看看这是什么意思:

C++0[1, 0, 0]
Java1[0, 1, 0]
Python2[0, 0, 1]

我们可以在示例中将数据表示为:

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

现在,我们的原始序列数据为2-D矩阵形式。
这使机器更容易理解它。

使用Sklearn实现一键编码的Python代码

让我们转到"一键编码"的实现部分。
我们将使用Sklearn来实现相同的功能。

在实施的同时,我们将遵循相同的两步方法。

步骤如下:

  • 使用LabelEncoder将类别转换为整数。

  • 使用OneHotEncoder将整数转换为One-Hot向量(二进制向量)。

在继续之前,让我们在示例中编写代码以声明数据数组。

import numpy as np 
data = ['Python', 'Java', 'Python', 'Python', 'C++', 'C++', 'Java', 'Python', 'C++', 'Java' ]
vals = np.array(data)

1.使用LabelEncoder将Categories转换为Integer

我们将首先在数据上使用LabelEncoder。
让我们从Sklearn导入它,然后在数据上使用它。

相同的代码如下:

from sklearn.preprocessing import LabelEncoder
label_encoder = LabelEncoder()
integer_encoded = label_encoder.fit_transform(vals)
print(integer_encoded)

输出:

输出结果为:

[2 1 2 2 0 0 1 2 0 1]

2.使用OneHotEncoder将整数编码转换为一键编码

现在,让我们将整数编码转换为一次性编码。

OneHotEncoder仅适用于列格式的数据。
要使用LabelEncoder中的整数编码,我们必须在将输出提供为OneHotEncoder的输入之前对其进行整形。

可以使用以下代码行完成此操作:

integer_encoded_reshape = integer_encoded.reshape(len(integer_encoded), 1)
print(integer_encoded_reshape)

输出:

[[2]
 [1]
 [2]
 [2]
 [0]
 [0]
 [1]
 [2]
 [0]
 [1]]

现在,我们可以使用这些数据来生成"一键通"向量。

from sklearn.preprocessing import OneHotEncoder
onehot_encoder = OneHotEncoder(sparse=False)
onehot_encoded = onehot_encoder.fit_transform(integer_encoded_reshape)
print(onehot_encoded)

输出:

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

完整的代码

这是本教程的完整代码:

import numpy as np
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder

# data
data = ['Python', 'Java', 'Python', 'Python', 'C++', 'C++', 'Java', 'Python', 'C++', 'Java' ]
vals = np.array(data)

# Integer Encoding
label_encoder = LabelEncoder()
integer_encoded = label_encoder.fit_transform(vals)
print(integer_encoded)

#reshaping for OneHotEncoder
integer_encoded_reshape = integer_encoded.reshape(len(integer_encoded), 1)

# One-Hot Encoding
onehot_encoder = OneHotEncoder(sparse=False)
onehot_encoded = onehot_encoder.fit_transform(integer_encoded_reshape)
print(onehot_encoded)