对训练和测试数据帧使用相同的标签编码器
Posted
技术标签:
【中文标题】对训练和测试数据帧使用相同的标签编码器【英文标题】:Use same Label Encoder for train and test dataframes 【发布时间】:2020-11-21 05:11:24 【问题描述】:我有 2 个不同的 csv,其中包含训练数据和测试数据。我从这些 train_features_df 和 test_features_df 创建了两个不同的数据框。请注意,测试和训练数据有多个分类列,因此我需要在它们上应用 labelEncoder,因为它适用于我的数据集。所以我在训练和测试数据上分别应用了标签编码器。当我打印训练数据集和测试数据集的新编码值时,我看到对于相同特征的相同分类值,新编码数据的输出是不同的。这是否意味着我必须合并训练和测试数据。然后应用标签编码,然后再次将它们分开?
from sklearn.preprocessing import LabelEncoder
target=train_features_df['y']
train_features_df=train_features_df.drop(['y'], axis=1)
train_features_df.head()
y = target.values
print("printing feature column of train datasets: \n")
print(train_features_df.values)
le=LabelEncoder()
X_train_label_encoded=train_features_df.apply(le.fit_transform)
print("\n printing feature column of train datasets after label encoder: \n")
print(X_train_label_encoded.head())
print("printing test feature datasets: \n")
print(test_features_df)
X_test_label_encoded=test_features_df.apply(le.fit_transform)
print("printing test feature encoded datasets: \n")
print(X_test_label_encoded)
上面的输出如下:-
printing feature column of train datasets:
[['k' 'v' 'at' ... 0 0 0]
['k' 't' 'av' ... 0 0 0]
['az' 'w' 'n' ... 0 0 0]
X0 X1 X2 X3 X4 X5 X6 X8 X10 X12 ... X375 X376 X377 X378 \
0 32 23 17 0 3 24 9 14 0 0 ... 0 0 1 0
1 32 21 19 4 3 28 11 14 0 0 ... 1 0 0 0
2 20 24 34 2 3 27 9 23 0 0 ... 0 0 0 0
printing test feature datasets:
X0 X1 X2 X3 X4 X5 X6 X8 X10 X12 ... X375 X376 X377 X378 X379 \
0 az v n f d t a w 0 0 ... 0 0 0 1 0
1 t b ai a d b g y 0 0 ... 0 0 1 0 0
2 az v as f d a j j 0 0 ... 0 0 0 1 0
X0 X1 X2 X3 X4 X5 X6 X8 X10 X12 ... X375 X376 X377 X378 \
0 21 23 34 5 3 26 0 22 0 0 ... 0 0 0 1
1 42 3 8 0 3 9 6 24 0 0 ... 0 0 1 0
2 21 23 17 5 3 0 9 9 0 0 ... 0 0 0 1
3 21 13 34 5 3 31 11 13 0 0 ... 0 0 0 1
4 45 20 17 2 3 30 8 12 0 0 ... 1 0 0 0
如果我们在训练数据帧中看到 lebel 编码第一列中的 az
值后转换为值 20,而在测试数据帧中 lebel 编码第一列中的 az
值后转换为值 21。
【问题讨论】:
答案有帮助吗?不要忘记您可以投票并接受答案。见What should I do when someone answers my question?,谢谢! 【参考方案1】:训练集和测试集中出现的唯一值可能不同。在这种情况下,编码也会有所不同。
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
le.fit_transform([1,2,3,4,5])
# array([0, 1, 2, 3, 4], dtype=int64)
le.fit_transform([2,3,4,5])
# array([0, 1, 2, 3], dtype=int64)
您应该拟合训练数据,然后在测试数据上transform
以获得相同的编码:
l_train = [1,2,3,4,5]
le.fit(l_train)
le.transform(l_train)
# array([0, 1, 2, 3, 4], dtype=int64)
le.transform([2,3,4,5])
#array([1, 2, 3, 4], dtype=int64)
请注意,您不应该为分类特征使用标签编码器。请参阅LabelEncoder for categorical features? 了解原因。 LabelEncoder
只能用在标签上。例如,您应该查看OneHotEncoder
。
【讨论】:
在这种情况下,我如何以及在哪里看到所有列都具有最终编码值的最终数据帧?我尝试在下面做,得到错误 y should be a 1d array,得到一个形状数组 (4209, 364)。它不需要整个数据框吗? le=LabelEncoder() le.fit(train_features_df) le.transform(train_features_df) 它需要一个一维数组,因为正如我告诉你的那样,这是为标签列考虑的,即单列,而不是多个特征@invictus 如果测试子样本包含一个没有出现在训练子样本中的标签怎么办?例如:l_train = [1,2,3,4,5] 和 l_test=[2,3,4,5,6]。上面的方法会抛出错误,因为 6 不在 train 子样本中。你是怎么解决的?以上是关于对训练和测试数据帧使用相同的标签编码器的主要内容,如果未能解决你的问题,请参考以下文章
我是不是必须对训练和测试数据集分别进行一次热编码? [关闭]
R语言使用caret包的predict函数对模型在测试集上的表现进行推理和预测predict函数对测试数据集进行数据预处理(和训练集的初始方式保持一致):缺失值填充数值变量最小最大缩放独热编码
如何在不拆分数据帧的情况下传递不同的数据集进行训练和测试。 (Python)?
如何使用新(测试)数据重新创建相同的 DocumentTermMatrix
R语言使用caret包的predict函数对测试数据集进行数据预处理(和训练集的处理方式保持一致):缺失值填充数值变量最小最大缩放因子变量独热编码等