我的数据集中有某些列是“对象”类型的,所以首先我找到了它们,现在我想从分类数据转换为数值数据。如何使用 for 循环在多个列中执行此操作?我一直在努力解决它。我不想重复代码。
我一直在尝试这个,但它不起作用
for column in object_columns:
df.loc[:,column] = labelencoder.fit_transform(df.loc[:,column])
我的数据集中有某些列是“对象”类型的,所以首先我找到了它们,现在我想从分类数据转换为数值数据。如何使用 for 循环在多个列中执行此操作?我一直在努力解决它。我不想重复代码。
我一直在尝试这个,但它不起作用
for column in object_columns:
df.loc[:,column] = labelencoder.fit_transform(df.loc[:,column])
你应该避免使用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,但如果你仍然想这样做,至少要正确地做。
虽然@ggordon 和@Anan Srivastava 的两个答案都可以满足您的需求,但它们在实践中并没有太大价值。问题在于,如果不将拟合值绑定LabelEncoder到变量,您将失去从类别到数字的映射。如果您想预测未来的数据,您将不知道使用哪个数字对每个类别进行编码。
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)