【问题标题】:Label Encoder and Inverse_Transform on SOME Columns在某些列上标注编码器和 Inverse_Transform
【发布时间】:2021-07-22 08:37:32
【问题描述】:

假设我有一个如下所示的数据框

df = pd.DataFrame({'animal':  ['Dog',   'Bird',  'Dog',   'Cat'],
                   'color':   ['Black', 'Blue',  'Brown', 'Black'],
                   'age':     [1,        10,       3,      6],
                   'pet':     [1,         0,       1,      1],
                   'sex':     ['m',      'm',     'f',    'f'],
                   'name':    ['Rex',    'Gizmo', 'Suzy', 'Boo']})

我想使用标签编码器对“动物”、“颜色”、“性别”和“名称”进行编码,但我不需要对其他两列进行编码。我还希望能够在之后对列进行 inverse_transform。

我尝试了以下方法,尽管编码按我的预期工作,但反转却不行。

to_encode = ["animal", "color", "sex", "name"]
le = LabelEncoder()
for col in to_encode:
     df[col] = fit_transform(df[col])


## to inverse:
for col in to_encode:
    df[col] = inverse_transform(df[col])

inverse_transform 函数产生以下数据帧:

animal color age pet sex name
Rex Boo 1 1 Gizmo Rex
Boo Gizmo 10 0 Gizmo Gizmo
Rex Rex 3 1 Boo Suzy
Gizmo Boo 6 1 Boo Boo

这显然不对,但我不确定我还能如何做到这一点?

任何建议将不胜感激!

【问题讨论】:

标签: python pandas scikit-learn label-encoding


【解决方案1】:

正如您在输出中看到的那样,当您尝试inverse_transfom 时,似乎代码仅使用他为最后一列“名称”获得的信息。您可以看到,因为现在,您的列的所有行都有与名称相关的值。每列应该有一个LabelEncoder()

这里的关键是为每个不同的列安装一个LabelEncoder。为此,我建议您将它们保存在字典中:

to_encode = ["animal", "color", "sex", "name"]
d={}
for col in to_encode:
    d[col]=preprocessing.LabelEncoder().fit(df[col]) #For each column, we create one instance in the dictionary. Take care we are only fitting now.

如果我们现在打印字典,我们会得到这样的结果:

{'animal': LabelEncoder(),
 'color': LabelEncoder(),
 'sex': LabelEncoder(),
 'name': LabelEncoder()}

如我们所见,对于我们要转换的每一列,我们都有他的LabelEncoder() 信息。这意味着,例如,对于动物 LabelEncoder,它保存了 0 等于鸟,1 等于猫,......每列都相同。

一旦我们安装好每一列,我们就可以进行转换,然后,如果我们想inverse_transform。唯一需要注意的是,每个transform/inverse_transform都必须使用本专栏对应的LabelEncoder

我们在这里变换:

for col in to_encode:
    df[col] = d[col].transform(df[col]) #Be aware we are using the dictionary

df

animal  color   age pet sex name
0   2   0   1   1   1   2
1   0   1   10  0   1   1
2   2   2   3   1   0   3
3   1   0   6   1   0   0

而且,一旦 df 被转换,我们可以inverse_transform:

for col in to_encode:
    df[col] = d[col].inverse_transform(df[col])

df

animal  color   age pet sex name
0   Dog Black   1   1   m   Rex
1   Bird Blue   10  0   m   Gizmo
2   Dog Brown   3   1   f   Suzy
3   Cat Black   6   1   f   Boo

一个有趣的想法可能是使用ColumnTransformer,但不幸的是,它不支持inverse_transform()

【讨论】:

    猜你喜欢
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多