我的数据由 50 列组成,其中大部分是字符串。我有一个必须预测的多类变量。我尝试在scikit-learn中使用LabelEncoder将特征(而不是类)转换为整数,并将它们作为输入提供给我正在使用的RandomForest模型。我正在使用随机森林进行分类。
现在,当新的测试数据(新数据流)出现时,对于每一列,我如何知道每个字符串的标签是什么,因为现在使用 LabelEncoder 将为我提供一个独立于我之前生成的标签的新标签。我,我做错了?还有什么我应该用于一致的编码吗?
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]
使用此编码器基本上假定您事先知道所有数据中的所有标签是什么。如果你的标签可能会在以后显示(例如,在联机学习方案中),则需要决定如何处理编码器外部的标签。
您可以将映射: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}
当测试数据出现时,您可以使用这些映射对测试数据中的相应列进行编码。在测试数据时不必再次使用编码器。