这两种方法有什么不同?它们似乎都会创建新的列,其数量等于特征中唯一类别的数量。然后根据数据点所在的类别分配0和1。
这两种方法有什么不同?它们似乎都会创建新的列,其数量等于特征中唯一类别的数量。然后根据数据点所在的类别分配0和1。
下面展示了使用LabelEncoder、OneHotEncoder、LabelBinarizer对数组进行编码的简单示例。
我注意到,OneHotEncoder需要先将数据转换为整数编码形式,然后才能将其转换为相应的编码形式,而在LabelBinarizer的情况下不需要。
from numpy import array
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder
from sklearn.preprocessing import LabelBinarizer
# define example
data = ['cold', 'cold', 'warm', 'cold', 'hot', 'hot', 'warm', 'cold',
'warm', 'hot']
values = array(data)
print "Data: ", values
# integer encode
label_encoder = LabelEncoder()
integer_encoded = label_encoder.fit_transform(values)
print "Label Encoder:" ,integer_encoded
# onehot encode
onehot_encoder = OneHotEncoder(sparse=False)
integer_encoded = integer_encoded.reshape(len(integer_encoded), 1)
onehot_encoded = onehot_encoder.fit_transform(integer_encoded)
print "OneHot Encoder:", onehot_encoded
#Binary encode
lb = LabelBinarizer()
print "Label Binarizer:", lb.fit_transform(values)
另一个很好的链接,可以解释OneHotEncoder:使用Python解释OneHotEncoder
也许还有其他合理的差异,专家们可能会解释。
LabelBinarizer
,在什么情况下应该使用它呢? - Supratim HaldarLabelBinarizer
应该用于编码一维标签向量,而不是多列(二维)数据。对于这种情况,您应该使用OneHotEncoder
。 - Soren不同之处在于,对于多列数据,您可以使用OneHotEncoder
,而无法使用LabelBinarizer
和LabelEncoder
。
from sklearn.preprocessing import LabelBinarizer, LabelEncoder, OneHotEncoder
X = [["US", "M"], ["UK", "M"], ["FR", "F"]]
OneHotEncoder().fit_transform(X).toarray()
# array([[0., 0., 1., 0., 1.],
# [0., 1., 0., 0., 1.],
# [1., 0., 0., 1., 0.]])
LabelBinarizer().fit_transform(X)
# ValueError: Multioutput target data is not supported with label binarization
LabelEncoder().fit_transform(X)
# ValueError: bad input shape (3, 2)
Scikitlearn建议使用OneHotEncoder对X矩阵进行编码,即你将要用于模型的特征,并使用LabelBinarizer来处理y标签。
它们非常相似,唯一的区别在于OneHotEncoder可能会返回一个稀疏矩阵,可以节省很多内存,在y标签中实际上并不需要这个。
即使你有一个多标签多类问题,你也可以使用MultiLabelBinarizer来处理y标签,而不是切换到OneHotEncoder进行多热编码。
https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html
关于此的另一个注意事项...
如果输入数据只有两个类别,则 LabelBinarizer
的输出只有一列,因为这已足以进行二进制表示:
> data = np.array([['b'], ['a']])
array([[0., 1.],
[1., 0.]])
> LabelBinarizer().fit_transform(data)
array([[1],
[0]])
与之比较:
> data = np.array([['b'], ['a'], ['c']])
array([[0., 1., 0.],
[1., 0., 0.],
[0., 0., 1.]])
> LabelBinarizer().fit_transform(data)
array([[0, 1, 0],
[1, 0, 0],
[0, 0, 1]])