labelbinarizer 的 2D 矩阵

数据挖掘 特征工程
2021-10-05 13:25:56

labelbinarizer有一种行为

import numpy as np
from sklearn import preprocessing
lb = preprocessing.LabelBinarizer()
lb.fit(np.array([[0, 1, 1], [1, 0, 0]]))
lb.classes_

输出是array([0, 1, 2])为什么那里有一个2?

2个回答

我认为这里的文档是不言自明的。Fit 接受大小数组,n_samples其中每个元素都是数据的类,或者如果数据点属于多个类,则输入显然是 size n_samples x n_classes这就是您在示例中输入的内容。每个点都可以属于三个类别中的任何一个。这就是为什么你有[0, 1, 2]尽可能多的课程。如文档中所述,如果您尝试

>> lb.transform([0, 1, 2, 0])
[[1 0 0]
 [0 1 0]
 [0 0 1]
 [1 0 0]]

如果你尝试一个在 fit 之后不存在的类,比如

>> lb.transform([0, 1, 2, 1000])
[[1 0 0]
 [0 1 0]
 [0 0 1]
 [0 0 0]]

不存在名为的类1000,因此类 case 的多目标转换1000显然是[0, 0, 0]. 希望这可以帮助。

因为lb.fit你输入一个 2×3 数组,这意味着 2 个样本,每个样本最多可以有 3 个类。因此,你来到了0, 1, 2这里。看:

           class0     class1     class2
sample1      0           1            1
sample2      1           0            0

但是,我认为LabelBinarizer编码器有一个与其他编码器非常不同的字符。请注意,通常我们将标签的原始形式放入encoder.fit()函数中;例如:

>>> from sklearn import preprocessing
>>> le = preprocessing.LabelEncoder()
>>> le.fit([1, 2, 2, 6])
LabelEncoder()
>>> le.classes_
array([1, 2, 6])

我们期望encoder.transform()产生新的原始标签所需的格式,即

>>> le.transform([1, 1, 2, 6]) 
array([0, 0, 1, 2]...)

但是对于LabelBinarizer,我认为我们输入lb.fit()的其实是需要的编码格式,真正的原始标签编码应该是,由于尺寸不同[[1,2], 0],似乎不是可以处理的格式。sklearn这里是悖论,在python文档中,我们看到了这样一个例子:

>>> lb.transform([0, 1, 2, 1])
array([[1, 0, 0],
       [0, 1, 0],
       [0, 0, 1],
       [0, 1, 0]])

中的所有样本[0,1,2,1]都被唯一标记,如果您尝试使用lb.transform([[1,2],2])指示第一个样本是多标记的,则会出错。也就是说,您的原始标签必须采用与 . 转换后完全相同的格式lb