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?
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?
我认为这里的文档是不言自明的。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。