一种使用sklearn预处理标签Binariz的热编码

2024-04-25 00:09:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用sklearn.preprocessing.LabelBinarizer()来创建一个只有两列标签的热编码,也就是说,我只想对两组对象进行分类。在本例中,当我使用fit(range(0,2))时,它只返回一个一维数组,而不是2x1。这很好,但是当我想在Tensorflow中使用它们时,形状实际上应该是(2,1)以保持维度的一致性。请告诉我怎么解决它。在

代码如下:

from sklearn import preprocessing
lb = preprocessing.LabelBinarizer()
lb.fit(range(0, 3))

调用lb.transform([1, 0]),结果是:

^{pr2}$

而当我们将3改为2时,即lb.fit(range(0, 2)),结果是

[[1]
 [0]]

而不是

[[0 1]
 [1 0]]

这将在与n维数组一致工作的算法中产生问题。有办法解决这个问题吗?在


Tags: 对象编码tensorflow分类range标签数组sklearn
2条回答

正如已经说过的,这不是方法的问题。根据documentation:二进制目标转换为列向量。在维数为2的情况下,可以从列向量结果生成所需的数组。

一种直接而简单的方法是:

from sklearn import preprocessing
lb = preprocessing.LabelBinarizer()
lb.fit(range(2)  # range(0, 2) is the same as range(2)
a = lb.transform([1, 0])
result_2d = np.array([[item[0], 0 if item[0] else 1] for item in a])

labelBinarizer()根据documentation的目的是

Binarize labels in a one-vs-all fashion

Several regression and binary classification algorithms are available in scikit-learn. A simple way to extend these algorithms to the multi-class classification case is to use > the so-called one-vs-all scheme.

如果您的数据只有两种类型的标签,那么您可以直接将其提供给二进制分类器。因此,一个列足以以一种Vs Rest的方式捕获两个类。

二进制目标转换为列向量

>>> lb = preprocessing.LabelBinarizer()
>>> lb.fit_transform(['yes', 'no', 'no', 'yes'])
array([[1],
       [0],
       [0],
       [1]])

如果您的目的只是创建一个热编码,请使用以下方法。

^{pr2}$

希望这能澄清您的问题:为什么SklearnlabelBinarizer()没有将2类数据转换为两列输出。

相关问题 更多 >