【问题标题】:Encoding String to numbers so as to use it in scikit-learn将字符串编码为数字以便在 scikit-learn 中使用
【发布时间】:2015-09-01 09:04:16
【问题描述】:

我的数据由 50 列组成,其中大部分是字符串。我有一个必须预测的多类变量。我尝试在 scikit-learn 中使用 LabelEncoder 将特征(不是类)转换为整数并将它们作为输入提供给我正在使用的 RandomForest 模型。我正在使用 RandomForest 进行分类。

现在,当新的测试数据(新数据流)到来时,对于每一列,我怎么知道每个字符串的标签是什么,因为现在使用 LabelEncoder 会给我一个独立于我之前生成的标签的新标签.难道,我做错了吗?还有什么我应该使用的一致编码吗?

【问题讨论】:

标签: encoding machine-learning scikit-learn random-forest


【解决方案1】:

您可以在每列的训练数据中保存映射:string -> label

>>> from sklearn import preprocessing
>>> le = preprocessing.LabelEncoder()
>>> col_1 = ["paris", "paris", "tokyo", "amsterdam"]
>>> set_col_1 = list(set(col_1))
>>> le.fit(col_1)
>>> dict(zip(set_col_1, le.transform(set_col_1)))
{'amsterdam': 0, 'paris': 1, 'tokyo': 2}

当测试数据到来时,您可以使用这些映射对测试数据中的相应列进行编码。您不必在测试数据时再次使用编码器。

【讨论】:

    【解决方案2】:

    LabelEncoder 类有两种方法来处理这种区别:fit 和 transform。通常,您首先调用 fit 将一些数据映射到一组整数:

    >>> le = LabelEncoder()
    >>> le.fit(['a', 'e', 'b', 'z'])
    >>> le.classes_
    array(['a', 'b', 'e', 'z'], dtype='U1')
    

    安装好编码器后,您可以将任何数据转换到标签空间,而无需更改现有映射:

    >>> le.transform(['a', 'e', 'a', 'z', 'a', 'b'])
    [0, 2, 0, 3, 0, 1]
    >>> le.transform(['e', 'e', 'e'])
    [2, 2, 2]
    

    使用此编码器基本上假设您事先知道所有数据中的所有标签。如果您有稍后可能会出现的标签(例如,在在线学习场景中),您需要决定如何处理编码器之外的标签。

    【讨论】:

      猜你喜欢
      • 2012-06-12
      • 1970-01-01
      • 2014-12-11
      • 1970-01-01
      • 2016-11-19
      • 2020-03-11
      • 1970-01-01
      • 1970-01-01
      • 2017-08-29
      相关资源
      最近更新 更多