【问题标题】:Working of labelEncoder in sklearnsklearn中labelEncoder的工作
【发布时间】:2017-06-06 00:55:38
【问题描述】:

假设我有以下输入功能:

hotel_id = [1, 2, 3, 2, 3]

这是一个带有数值的分类特征。如果我把它按原样交给模型,模型会将其视为连续变量,即 2 > 1。

如果我申请sklearn.labelEncoder() 那么我会得到:

hotel_id = [0, 1, 2, 1, 2] 

所以这个编码特征被认为是连续的还是分类的? 如果它被视为连续的,那么 labelEncoder() 有什么用。

附:我知道一种热编码。但是大约有 100 个hotel_id,所以不想使用它。 谢谢

【问题讨论】:

    标签: python machine-learning scikit-learn categorical-data


    【解决方案1】:

    LabelEncoder 是一种编码类级别的方法。除了您包含的整数示例之外,请考虑以下示例:

    >>> from sklearn.preprocessing import LabelEncoder
    >>> le = LabelEncoder()
    >>>
    >>> train = ["paris", "paris", "tokyo", "amsterdam"]
    >>> test = ["tokyo", "tokyo", "paris"]
    >>> le.fit(train).transform(test)
    array([2, 2, 1]...)
    

    然后,LabelEncoder 允许我们为分类数据分配序数级别。 但是,您注意到的是正确的:即 [2, 2, 1] 被视为数字数据。这是将OneHotEncoder 用于虚拟变量(我知道您说过您希望不使用)的好候选。

    请注意,LabelEncoder 必须在 one-hot 编码之前使用,因为 OneHotEncoder 无法处理分类数据。因此,它经常被用作 one-hot 编码的前导。

    或者,它可以将您的目标编码为可用的数组。例如,如果 train 是您的分类目标,则需要 LabelEncoder 将其用作 y 变量。

    【讨论】:

    • 很好的答案。我想知道是否有一个组合的 LabelEncoder 和 OneHotEncoder?
    • 在 sklearn 最新版本的 OneHotEncoder 中,您不再需要在运行 OneHotEncoder 之前运行 LabelEncoder 步骤,即使是分类数据。您现在可以这样做,一步到位,因为 OneHotEncoder 将首先将分类变量转换为数字。
    【解决方案2】:

    如果您正在运行分类模型,则标签将被视为类并忽略顺序。你不需要onehot。

    【讨论】:

    • #simon “标签”是什么意思? labelEncoder() 的输出?是的,我正在运行多类分类模型。我检查了,labelEncoder() 的输出是 np.array() 类型,单个元素是整数。
    • 是的。目标变量是标签。分类器会将它们视为未排序的类别。
    • 谢谢。如果是这种情况,那么事情就很容易了。但是,为什么我们需要 get_dummies() 或 OneHotEncoding()?由于这两个函数做同样的事情,但增加了维度,如果它按照您所说的方式工作,我们总是可以使用 labelEncoder() 代替。
    • "分类器会将它们视为未排序的类别。"一般来说,你不能做出这样的声明。这取决于分类器和分类器的实现。例如,scikit-learn DecisionTree 分类器绝对会将这些视为数字,而不是分类。
    • Getdummies 和 onehot 通常用于特征而非标签。
    【解决方案3】:

    解决此问题的一种方法是将您的数字更改为带有包装inflect

    的标签

    所以我一直在访问所有数量的酒店 ID,并将它们更改为单词,例如 1 -> 'one' 和 2 -> 'two' ... 99 -> '99'

    import inflect
    p = inflect.engine()
    
    def toNominal(df,column):
    for index, row in df.iterrows():
        df.loc[index, column] =  p.number_to_words(df.loc[index, column])
    
    toNominal(df, 'hotel_id')
    

    【讨论】:

      猜你喜欢
      • 2017-07-26
      • 2016-11-20
      • 2023-02-21
      • 2017-10-12
      • 2023-04-02
      • 2018-12-20
      • 2017-01-23
      • 2016-11-19
      • 2018-09-10
      相关资源
      最近更新 更多