Scikit-learn的LabelBinarizer与OneHotEncoder

时间:2018-05-22 17:25:10

标签: python encoding scikit-learn data-science categorical-data

两者有什么区别?似乎两者都创建了新列,其数量等于要素中唯一类别的数量。然后,他们根据数据点的类别为数据点分配0和1。

4 个答案:

答案 0 :(得分:15)

使用LabelEncoder,OneHotEncoder,LabelBinarizer对数组进行编码的简单示例如下所示。

我看到OneHotEncoder首先需要整数编码形式的数据转换成各自的编码,而不需要LabelBinarizer。

from numpy import array
from numpy import argmax
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder
# 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)

enter image description here

另一个解释OneHotEncoder的好链接是:Explain onehotencoder using python

专家们可能会解释两者之间可能存在其他有效差异。

答案 1 :(得分:2)

区别在于您可以将OneHotEncoder用于多列数据,而不能用于LabelBinarizerLabelEncoder

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)

答案 2 :(得分:1)

Scikitlearn建议将OneHotEncoder用于X矩阵,即您在模型中提供的功能,并使用LabelBinarizer用于y标签。

它们非常相似,只不过OneHotEncoder可以返回一个稀疏矩阵以节省大量内存,而您在y标签中并不需要它。

即使您遇到多标签多类问题,也可以对y标签使用MultiLabelBinarizer,而不必切换到OneHotEncoder进行多热编码。

https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html

答案 3 :(得分:1)

OneHotEncoder()和LabelBinarizer()的结果几乎相似[默认输出类型可能有所不同。

但是,据我所知,理想情况下,LabelBinarizer()应该用于响应变量,而OneHotEncoder()应该用于特征变量。

尽管目前,我不确定为什么我们需要不同的编码器来完成相似的任务。任何朝这个方向的指针都会受到赞赏。

快速摘要:

LabelEncoder –用于标签(响应变量)编码1,2,3…[隐含顺序]

OrdinalEncode r –用于编码1,2,3的功能…[隐含顺序]

标签Binarizer –用于响应变量,编码0和1 [创建多个虚拟列]

OneHotEncoder -用于功能变量,编码0和1 [创建多个虚拟列]

可以找到一个简单的示例here