【发布时间】:2019-07-19 21:40:41
【问题描述】:
我有一个 pandas 数据框(在 python 中),我想标记编码两列,准备在其上训练机器学习模型。将其从分类数据转换为数字。 (我现在还不希望 OneHotEncode 数据)
我有一个与此类似的数据(一旦订购)的数据框:
Main_Category Sub_Category
Cat_0 Sub_1
Cat_1 Cub_1
Cat_1 Aub_2
Cat_2 Sub_3
数据遵循以下关系,其中一个主类别可以有许多独特的子类别。我想先按 Main_Category 排序数据帧,然后按 Sub_Category。这会将所有子类别按其主要类别组合在一起。
df = df.sort_values(['Main_Category', 'Sub_Category'], ascending=[True, True])
然后我想对数据进行编码,使其看起来像这样:
Main_Category Sub_Category
0 0
1 1
1 2
2 3
但是,当我对数据进行编码时,我得到的编码是这样的:
Main_Category Sub_Category
0 2
1 0
1 1
2 3
我相信编码库正在对数据本身进行排序,然后根据这些结果进行编码。我希望它根据我自己的排序进行编码。什么是理想的解决方案?
这是对列进行编码的代码:
from sklearn.preprocessing import LabelEncoder
labelencoder = LabelEncoder()
df['Main_Category'] = labelencoder.fit_transform(df['Main_Category'])
labelencoder = LabelEncoder()
df['Sub_Category'] = labelencoder.fit_transform(df['Sub_Category'])
编辑:我无法显示真实数据,这就是为什么我的问题有虚拟数据。 编辑:更新了 sub_category 名称以更好地显示错误
【问题讨论】:
-
不要对不同的列使用相同的
labelencoder。这将覆盖它之前学到的东西。实例化LabelEncoder的次数与您要编码的列一样多。 -
感谢您的意见,克里斯。我已经更新了我的问题以反映这一点。虽然这是我的代码中的错误,但结果仍然是不受欢迎的。我相信,当您为 sklearn 库提供要编码的数组时,它会自行对其进行排序(撤消我的排序),然后返回标签。
-
您的编辑版本仍然相同。您正在分配给同一个变量,覆盖以前的
LabelEncoder。试试le1, le2, ... -
至于真正的问题,我无法重现。你能用给定的示例数据重现它吗?
-
我已通过重命名子类别来更新问题。使用此数据和显示的相同代码,我仍然会得到不希望的结果。重命名标签编码器没有任何影响。
标签: python pandas encoding scikit-learn