There is one behavior of labelbinarizer
import numpy as np from sklearn import preprocessing lb = preprocessing.LabelBinarizer() lb.fit(np.array([[0, 1, 1], [1, 0, 0]])) lb.classes_ The output is array([0, 1, 2]). Why there is a 2 there?
There is one behavior of labelbinarizer
import numpy as np from sklearn import preprocessing lb = preprocessing.LabelBinarizer() lb.fit(np.array([[0, 1, 1], [1, 0, 0]])) lb.classes_ The output is array([0, 1, 2]). Why there is a 2 there?
I think the documentation is kind of self-explanatory here. Fit takes in array of size n_samples in which each element is the class of the datum or if the data point belongs to multiple classes, the input would be obviously of size n_samples x n_classes. That is what you gave in as input in your example. Each point can belong to any of the three classes. That is why you have [0, 1, 2] as number of classes. So as mentioned in the documentation if you try
>> lb.transform([0, 1, 2, 0]) [[1 0 0] [0 1 0] [0 0 1] [1 0 0]] and if you try a class that is non-existent after fit like
>> lb.transform([0, 1, 2, 1000]) [[1 0 0] [0 1 0] [0 0 1] [0 0 0]] No class named 1000 exists, so multi-targeted conversion for 1000 class case is plainly [0, 0, 0]. Hope this helps.
Because in lb.fit you feed in a 2-by-3 array, which means 2 samples and each sample could have at most 3 classes. Therefore, you got 0, 1, 2 here. See:
class0 class1 class2 sample1 0 1 1 sample2 1 0 0 However, I think LabelBinarizer encoder has one character very unlike other encoders. Note that usually we put the raw form of lables into encoder.fit() function; for example:
>>> from sklearn import preprocessing >>> le = preprocessing.LabelEncoder() >>> le.fit([1, 2, 2, 6]) LabelEncoder() >>> le.classes_ array([1, 2, 6]) and we expect encoder.transform() yield the required format for new raw labels, i.e.,
>>> le.transform([1, 1, 2, 6]) array([0, 0, 1, 2]...) But for LabelBinarizer, I think what we put into lb.fit() is actually the required coding format, and the true raw label codes should be like [[1,2], 0], which seems not to be format can be handled by sklearn since the dimension varies. Here is the paradox, in the python document, we see such an example:
>>> lb.transform([0, 1, 2, 1]) array([[1, 0, 0], [0, 1, 0], [0, 0, 1], [0, 1, 0]]) all samples in [0,1,2,1] are uniquely labeled, and if you tried to use lb.transform([[1,2],2]) to indicate that the first sample is multiple-labeled, you get error. That is, your raw labels have to in the exactly same format as after being transformed by lb.