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

时间:2019-03-26 14:10:24

标签: python scikit-learn

我正在尝试使用fit(range(0,2))创建仅包含两列标签的单一编码,即我只想对两组对象进行分类。在这种情况下,当我使用Tensorflow时,它仅返回一维数组,而不是2x1。很好,但是当我想在from sklearn import preprocessing lb = preprocessing.LabelBinarizer() lb.fit(range(0, 3)) 中使用它们时,形状实际上应该是(2,1)以保持尺寸一致性。请告知我该如何解决。

这是代码:

lb.transform([1, 0])

呼叫[[0 1 0] [1 0 0]] ,结果是:

lb.fit(range(0, 2))

而当我们将3更改为2,即[[1] [0]] 时,结果将是

[[0 1]
 [1 0]]

代替

n

这将在与C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\维数组保持一致的算法中产生问题。有什么办法解决这个问题?

2 个答案:

答案 0 :(得分:1)

正如已在评论中所述,这不是方法的问题。根据{{​​3}}:二进制目标转换为列向量。如果维数为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])

答案 1 :(得分:0)

labelBinarizer()根据documentation的目的是

  

以一对一的方式对标签进行二分类

     

scikit-learn中提供了几种回归和二进制分类算法。   将这些算法扩展到多类分类的一种简单方法是使用所谓的“一对多”方案。

如果数据只有两种类型的标签,则可以直接将其提供给二进制分类器。因此,一列足以以“一对多休息”的方式捕获两个类。

二进制目标转换为列向量

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

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

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()不能将2类数据转换为两列输出。