Python Scikit学习';s LabelBinarizer vs.OneHotEncoder

Python Scikit学习';s LabelBinarizer vs.OneHotEncoder,python,encoding,scikit-learn,data-science,categorical-data,Python,Encoding,Scikit Learn,Data Science,Categorical Data,这两者的区别是什么?似乎这两种方法都会创建新列,它们的数量等于功能中唯一类别的数量。然后根据数据点所属的类别,将0和1分配给数据点 下面是一个使用LabelEncoder、OneHotEncoder和LabelBinarizer对数组进行编码的简单示例 我看到OneHotEncoder首先需要整数编码形式的数据转换为其各自的编码,这在LabelBinarizer的情况下是不需要的 from numpy import array from sklearn.preprocessing import

这两者的区别是什么?似乎这两种方法都会创建新列,它们的数量等于功能中唯一类别的数量。然后根据数据点所属的类别,将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的另一个好链接是:


这两者之间可能还有其他专家可以解释的有效差异。

不同之处在于,您可以对多列数据使用
OneHotEncoder
,而不是
LabelBinarizer
LabelEncoder

来自sklearn.preprocessing导入LabelBinarizer、LabelEncoder、OneHotEncoder
X=[“美国”、“英国”、“M”]、[“英国”、“M”]、[“法国”、“法国”]]
OneHotEncoder().fit_transform(X).toarray()
#数组([[0,0,1,0,1.],
#        [0., 1., 0., 0., 1.],
#        [1., 0., 0., 1., 0.]])
LabelBinarizer().fit_变换(X)
#ValueError:标签二值化不支持多输出目标数据
LabelEncoder().fit_变换(X)
#ValueError:输入形状不正确(3,2)

Scikitlearn建议对X矩阵使用OneHotEncoder,即在模型中输入的功能,并对y标签使用LabelBinarizer

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

即使存在多标签多类问题,也可以对y标签使用MultiLabelBinarizer,而不是切换到OneHotEncoder进行多热编码


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

但是,据我所知,LabelBinarizer()理想情况下应该用于响应变量,OneHotEncoder()应该用于功能变量

虽然,目前,我不知道为什么我们需要不同的编码器来完成类似的任务。任何指向这个方向的指针都将不胜感激

快速总结:

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

OrdinalCoder–用于功能编码1,2,3…[暗示顺序]

标签二值化器–对于响应变量,编码0和1[创建多个虚拟列]

OneHotEncoder-对于特征变量,编码0和1[创建多个虚拟列]


可以找到一个简单的例子。

这与一对多编码而不是一对k编码有关吗?编码标签时,每个类都必须存在。编码变量时,最后一个(?)不应进行编码,因为它依赖于其他变量,并且大多数模型都需要自变量。虽然,对于大量维度,这可能没有多大关系。@AndrewLavers即使在编码变量时,如果您希望此变量的新分类值出现在验证集/测试集/生产环境中因此,您应该对所有变量进行编码。否则,“最后一个值”之间将没有差异还有一个新的词汇表外值。您的备注中有一个小错误:,OneHotEncoder不需要整数编码的数据来生成其稀疏矩阵。进一步研究,不同之处在于OneHotEncoder默认生成SciPy备用矩阵,而LabelBinarizer默认生成密集NumPy数组。@stevethecoder is
dens基本上是开箱即用的数组类型?在哪种情况下我们应该使用
LabelBinarizer
,如果有的话?我认为,
LabelBinarizer
应该用于编码一维标签向量,而不是多列(二维)数据。对于这种情况,您应该使用
OneHotEncoder