使用相同的标签编码器对测试数据集进行处理?还是使用新的标签编码器?

5

我完全是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' ] )

哪一个是正确的代码呢? 但无论我选择上面的哪个代码都没有关系,因为训练数据集中的分类数据和测试数据集中的分类数据应该是相同的。


如果你想在一个程序中执行 fit_transform() ,并在另一个程序中执行 transform() ,请参考此答案 https://dev59.com/al4b5IYBdhLWcg3wzUja#55895639。 - Shady Mohamed Sherif
2个回答

9
问题实际上是你使用它的方式。
由于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]...)

from official doc


谢谢您的回答。那么,您的意思是LabelEncoder只应该使用一次来拟合训练数据集的分类特征,并且它应该具有所有名义特征。如果是这样,那么在此之后,它可以用于测试数据集吗? - mac475
一旦您的标签Encore配备了所有名义特征,您就可以将其与transform方法一起用于您想要的每个数据集。 - RPresle
好的,已经清楚理解了。谢谢您友善而迅速的回答。 - mac475
如果我有两个不同的数据框用于测试和训练数据怎么办?我有两个不同的CSV文件,已经加载到两个不同的数据框中。这是否意味着我必须合并然后执行标签编码,然后再进行一些拆分操作? - Invictus

6

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

通常,你只需要使用LabelEncoder(包含训练集的特征)进行一次拟合,并转换测试集中的特征。但是,如果你的测试集中有特征值不在训练集中,那么在拟合标签编码器时,请将训练特征集和测试集的并集放入其中。


4
我会尽力回答这个问题。我只是稍微编辑了一下,@Mayur。 - Undecided

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接