【问题标题】:Scikit-learn's LabelBinarizer vs. OneHotEncoderScikit-learn LabelBinarizer 与 OneHotEncoder
【发布时间】:2018-11-01 13:24:11
【问题描述】:

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

【问题讨论】:

  • 它与one-vs-all而不是one-vs-k编码有关吗?编码标签时,每个类都必须存在。编码变量时,最后一个(?)不应该被编码,因为它依赖于其他变量,并且大多数模型都需要独立变量。虽然,对于大量维度,这可能并不重要。
  • @AndrewLavers 即使​​在编码变量时,如果您希望该变量的新分类值出现在验证集/测试集/生产环境中,您应该对所有变量进行编码。否则,“最后一个值”和新的词汇表外值之间没有区别。

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


【解决方案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 的好链接是:Explain onehotencoder using python

这两者之间可能还有其他有效的差异,专家们或许可以解释一下。

【讨论】:

  • 您的评论中有小错误:According to the docs,OneHotEncoder 不需要需要整数编码数据来生成其稀疏矩阵。进一步研究,似乎区别在于 OneHotEncoder 默认生成 SciPy 备用矩阵,而 LabelBinarizer 默认生成密集 NumPy 数组。
  • @stevethecoder 是 dense Numpy array 基本上是开箱即用的数组类型?
  • 如果有的话,我们应该在哪种情况下使用LabelBinarizer
  • 我认为,LabelBinarizer 应该用于编码一维标签向量,而不是多列(二维)数据。您可以使用OneHotEncoder
【解决方案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)

【讨论】:

    【解决方案3】:

    Scikitlearn 建议将 OneHotEncoder 用于 X 矩阵,即您在模型中输入的特征,并使用 LabelBinarizer 作为 y 标签。

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

    即使您有一个多标签多类问题,您也可以将 MultiLabelBinarizer 用于您的 y 标签,而不是切换到 OneHotEncoder 进行多热编码。

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

    【讨论】:

      【解决方案4】:

      OneHotEncoder() 和 LabelBinarizer() 的结果几乎相似【默认输出类型可能存在差异。

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

      尽管目前我不确定为什么我们需要不同的编码器来完成类似的任务。任何指向这个方向的指针都将不胜感激。

      快速总结:

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

      OrdinalEncoder – 用于特征编码 1,2,3 ... [隐含顺序]

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

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

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

      【讨论】:

        猜你喜欢
        • 2016-12-28
        • 2020-01-25
        • 2020-02-01
        • 1970-01-01
        • 2018-03-21
        • 2018-08-02
        • 2020-11-02
        • 1970-01-01
        相关资源
        最近更新 更多