LabelEncoding 使用 for 循环在 Dataframe 中选择的列

数据挖掘 Python
2022-02-21 07:45:25

我的数据集中有某些列是“对象”类型的,所以首先我找到了它们,现在我想从分类数据转换为数值数据。如何使用 for 循环在多个列中执行此操作?我一直在努力解决它。我不想重复代码。

我一直在尝试这个,但它不起作用

for column in object_columns:
    df.loc[:,column] = labelencoder.fit_transform(df.loc[:,column]) 
4个回答

LabelEncoding 您的功能是一种不好的做法

你应该避免使用LabelEncoder来编码你的输入特征!不相信我?这是 scikit-learn 的官方文档LabelEncoder所说的:

这个转换器应该用于编码目标值,即y,而不是输入X

这就是为什么它被称为标签编码。

为什么你不应该使用LabelEncoder来编码特征。

该编码器只是将特征的唯一值映射到整数。例如,假设我们要编码一个名为shirt color的特征,它表示某人所穿衬衫的颜色。此功能具有价值['red', 'green', 'blue', ...]如果您将这些编码为整数,即[1, 2, 3, ...],您可能会混淆您的模型,因为您现在已经给出了与现实世界中不存在red < greed < blue的这些值的关系,例如或red + green = blue这种类型的特征称为名义特征,最好应该是one-hot 编码的

但是,有些功能您可能希望将它们的值映射到整数。这些被称为ordinal例如,特征rating,它具有 values ['bad', 'good', 'excellent', ...]通过将这些映射到整数,您实际上保留了这些值在现实世界中所持有的关系,例如bad < good < excellent. 但是有一个问题,为了执行上述操作,您需要将每个值映射到一个特定的整数(例如,我们不能 map 'good' -> 1, 'bad' -> 2, 'excellent' -> 3,因为这不会保留这些值的真实关系)。但是,计算机不知道将哪个数字映射到每个值,因此,即使您LabelEncoder在序数变量上使用,它很可能也不会生成正确的编码。

如何正确编码序数特征

编码有序变量的更合适的方法是手动选择映射这需要更多的工作,并且不像对所有值进行编码的单线那样优雅,但它是唯一正确的方法让我们看看我们如何在 pandas 中做到这一点。

custom_mapping = {'bad': 1, 'good': 2, 'excellent': 3}


df['rating'] = df['rating'].map(custom_mapping)

显然,这需要对每个序数特征进行。


在这一点上,我认为很明显我强烈建议不要使用LabelEncoder,但如果你仍然想这样做,至少要正确地做。

如果您仍想使用 LabelEncoding

虽然@ggordon 和@Anan Srivastava 的两个答案都可以满足您的需求,但它们在实践中并没有太大价值。问题在于,如果不将拟合值绑定LabelEncoder到变量,您将失去从类别到数字的映射。如果您想预测未来的数据,您将不知道使用哪个数字对每个类别进行编码。

扩展@ggordon的回答

columns_to_be_encoded = [...]  # list of column names you want encoded

# Instantiate the encoders
encoders = {column: LabelEncoder() for column in columns_to_be_encoded}

for column in columns_to_be_encoded:
    df[column] = encoders[column].fit_transform(df[column])

这样,您就有了一个合适的编码器字典,以便您可以根据需要重用相同的编码。

你可以试试

for column in object_columns:
    df[column] = LabelEncoder().fit_transform(df[column])
df.apply(LabelEncoder().fit_transform)

这将对所有列进行标签编码

+1 到@Djib2011:LabelEncoder用于目标/标签,不适用于其他数据列。另外,我同意通常你不想要序数编码,因为 one-hot 更忠实于原始数据。

但是,如果您确实想进行序数编码,有一个更好的方法:OrdinalEncoder. 如果您希望它仅适用于某些列,您可以使用ColumnTransformer,例如

encoder = ColumnTransformer(
              transformers=[('ord_enc', OrdinalEncoder(), object_columns)],
              remainder='passthrough'
              )
df_enc = encoder.fit_transform(df)