某些列上的标签编码器和 Inverse_Transform
Label Encoder and Inverse_Transform on SOME Columns
假设我有一个如下所示的数据框
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
这显然是不对的,但我不确定我还能如何做到这一点?
如有任何建议,我们将不胜感激!
正如您在输出中看到的那样,当您尝试 inverse_transfom
时,代码似乎只使用了他为最后一列“name”获得的信息。您可以看到,因为现在,列的所有行都具有与名称相关的值。每列应该有一个 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()
。
假设我有一个如下所示的数据框
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 |
这显然是不对的,但我不确定我还能如何做到这一点?
如有任何建议,我们将不胜感激!
正如您在输出中看到的那样,当您尝试 inverse_transfom
时,代码似乎只使用了他为最后一列“name”获得的信息。您可以看到,因为现在,列的所有行都具有与名称相关的值。每列应该有一个 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()
。