使用sklearn预处理标签二值化进行独热编码

3
我正在尝试使用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]) 时,结果如下:

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

如果我们将3变为2,即lb.fit(range(0, 2)),结果将会是

[[1]
 [0]]

代替
[[0 1]
 [1 0]]

这将会在那些一直使用n维数组的算法中产生问题。有没有什么方法可以解决这个问题呢?


你能解释一下调用哪个方法来获得结果吗?lb.fit()不返回任何内容。 - Eskapp
1
抱歉之前漏掉了。这是代码:print(lb.transform([1, 0])) - HamidReza Mirkhani
首先,这不是方法的问题。根据文档:二进制目标转换为列向量(https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.LabelBinarizer.html),您可以从列向量结果构建所需的数组,在二维情况下。如果模糊不清,我会尝试写出答案。 - Eskapp
谢谢,我不认为这是方法的问题,但对我来说,更好的实现应该允许开发人员控制输出类型以使它们保持一致。正如你所强调的,例如当n=2时,我必须编写另一个自定义方法。 - HamidReza Mirkhani
2个回答

2
的目的是按照文档中所述,以一对全方式将标签二值化。scikit-learn提供了多个回归和二元分类算法。将这些算法简单地扩展到多类分类情况的一种方法是使用所谓的一对全方案。
如果您的数据只有两种类型的标签,则可以直接将其馈送给二元分类器。 因此,在一对休息的方式下,一个列足以捕获两个类。 二进制目标转换为列向量
>>> lb = preprocessing.LabelBinarizer()
>>> lb.fit_transform(['yes', 'no', 'no', 'yes'])
array([[1],
       [0],
       [0],
       [1]])

如果你只是想创建一个one-hot编码,使用以下方法:

如果您的意图只是创建一种one-hot编码,请使用以下方法。

from sklearn.preprocessing import OneHotEncoder
>>> enc = OneHotEncoder()
>>> enc.fit_transform([['yes'], ['no'], ['no'], ['yes']]).toarray()
array([[0., 1.],
      [1., 0.],
      [1., 0.],
      [0., 1.]])

希望这能澄清你的疑问,为什么Sklearn的labelBinarizer()函数不能将两类数据转换成两列输出。"最初的回答"。

1

如已评论所述,这不是方法的问题。根据文档:二进制目标会转换为列向量。您可以从列向量结果构建所需的数组(如果维度为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])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接