使用相同的Label Encoder来测试数据集?还是新的标签编码器?

时间:2015-06-30 08:25:34

标签: scikit-learn

我对scikit-learn完全是新手。

我想知道当我想在测试数据集上转换相同特征的分类数据时是否应该使用在训练数据集上使用的相同Label Encoder实例。而且,它意味着如下

from sklearn import preprocessing

# trainig data label encoding
le_blood_type = preprocessing.LabelEncoder()
df_training[ 'BLOOD_TYPE' ] = le_blood_type.fit_transform( df_training[ 'BLOOD_TYPE' ] )    # labeling from string
....
1. Using same label encoder
   df_test[ 'BLOOD_TYPE' ] = le_blood_type.fit_transform( df_test[ 'BLOOD_TYPE' ] )

2. Using different label encoder
   le_for_test_blood_type = preprocessing.LabelEncoder()
   df_test[ 'BLOOD_TYPE' ] = le_for_test_blood_type.fit_transform( df_test[ 'BLOOD_TYPE' ] )

哪一个是正确的代码? 或者,无论我选择上述代码,它都没有任何区别 因为训练数据集的分类数据和测试数据集的分类数据应该与结果相同。

2 个答案:

答案 0 :(得分:8)

问题在于你实际使用它的方式。

由于LabelEncoder将名义特征与数字增量相关联,因此您应该适合一次,并在对象适合后进行转换。不要忘记你需要在训练阶段拥有所有名义特征。

使用它的好方法可能是让你有名义特征,适合它,然后只使用变换方法。

>>> from sklearn import preprocessing
>>> le = preprocessing.LabelEncoder()
>>> le.fit([1, 2, 2, 6])
LabelEncoder()
>>> le.classes_
array([1, 2, 6])
>>> le.transform([1, 1, 2, 6]) 
array([0, 0, 1, 2]...)

来自official doc

答案 1 :(得分:3)

我认为RPresle已经给出了答案。只是想更直接地讨论问题中的情况:

通常,您只需要将LabelEncoder(具有训练集中的功能)拟合一次并转换测试集中的功能。但是,如果您的测试集具有不在训练集中的特征值,那么当您适合标签编码器时,将训练特征集和测试集的集合放入其中。