Hug*_*uga 6 encoding machine-learning random-forest scikit-learn
我的数据由50列组成,其中大多数是字符串.我有一个单一的多类变量,我必须预测.我尝试在scikit中使用LabelEncoder学习将特征(而不是类)转换为整数并将它们作为输入提供给我正在使用的RandomForest模型.我使用RandomForest进行分类.
现在,当新的测试数据出现时(新数据流),对于每一列,我如何知道每个字符串的标签是什么,因为现在使用LabelEncoder会给我一个独立于我之前生成的标签的新标签.我在做错了吗?还有什么我应该用于一致的编码吗?
LabelEncoder 类有两个方法来处理这种区别:拟合和变换。通常,您首先调用 fit 将某些数据映射到一组整数:
>>> le = LabelEncoder()
>>> le.fit(['a', 'e', 'b', 'z'])
>>> le.classes_
array(['a', 'b', 'e', 'z'], dtype='U1')
Run Code Online (Sandbox Code Playgroud)
安装编码器后,您可以将任何数据转换到标签空间,而无需更改现有映射:
>>> le.transform(['a', 'e', 'a', 'z', 'a', 'b'])
[0, 2, 0, 3, 0, 1]
>>> le.transform(['e', 'e', 'e'])
[2, 2, 2]
Run Code Online (Sandbox Code Playgroud)
使用此编码器基本上假设您事先知道所有数据中的所有标签是什么。如果您有稍后可能显示的标签(例如,在在线学习场景中),您需要决定如何处理编码器之外的标签。
您可以保存映射: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}
Run Code Online (Sandbox Code Playgroud)
当测试数据到来时,您可以使用这些映射对测试数据中的相应列进行编码。您不必在测试数据中再次使用编码器。