将字符串编码为数字以便在 scikit-learn 中使用它

Encoding String to numbers so as to use it in scikit-learn

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

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

您可以保存映射: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}

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

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

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

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

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

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