使用 sklearn 进行 LabelEncoder 取回耦合的好方法是什么?

What is the the good way to proceed with LabelEncoder with sklearn to get back the coulples?

我有一个带有分类值的数据框,例如城市名称。

对于ML算法,我需要将数据编码成数值。

我是这样做的:

df[cat_columns] = df[cat_columns].apply(preprocessing.LabelEncoder().fit_transform)

我的问题是,如果我以后想知道编码值 2 对应于哪个城市。

2 可以是例如“巴黎”。

在编码之前,我这样做是为了取回信息:

encoders = {c: preprocessing.LabelEncoder().fit(df[c]) for c in cat_columns}

没用吗?你如何进行?谢谢

LabelEncoder 应该只用于编码您的标签,即您的目标 y.

要以相同的方式转换分类列,您应该使用 OrdinalEncoder (however, ordinal encoding might not always be desired - you should look up OneHotEncoder 并确定这是否更适合您的问题。

让我们使用示例数据集来探索正确的转换:

import pandas as pd

df = pd.DataFrame(
    {
        "country": ["France", "France", "Japan", "Netherlands"],
        "city": ["Paris", "Lyon", "Tokyo", "Amsterdam"],
        "population": [13024518, 2323221, 37468000, 2480394]
    }
)

直接将 OrdinalEncoder 应用于我们的完整数据集也会导致对数字列进行编码:

>>> from sklearn.preprocessing import OrdinalEncoder
>>> enc = OrdinalEncoder()
>>> enc.fit_transform(df)
array([[0., 2., 2.],
       [0., 1., 0.],
       [1., 3., 3.],
       [2., 0., 1.]])

执行此转换的预期方法是使用 ColumnTransformer 指定我们要对其执行转换的列:

>>> from sklearn.compose import ColumnTransformer
>>> from sklearn.preprocessing import OrdinalEncoder
>>> ct = ColumnTransformer(
...     [("enc", OrdinalEncoder(), ["country", "city"])],
...     remainder="passthrough"
... )
>>> ct.fit_transform(df)
array([[0.0000000e+00, 2.0000000e+00, 1.3024518e+07],
       [0.0000000e+00, 1.0000000e+00, 2.3232210e+06],
       [1.0000000e+00, 3.0000000e+00, 3.7468000e+07],
       [2.0000000e+00, 0.0000000e+00, 2.4803940e+06]])

我们可以像这样访问原始类别(注意以下数组中的索引):

>>> ct.named_transformers_["enc"].categories_                
[array(['France', 'Japan', 'Netherlands'], dtype=object), array(['Amsterdam', 'Lyon', 'Paris', 'Tokyo'], dtype=object)]