0

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

对于 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}

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

4

1 回答 1

0

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

要以您应该使用的相同方式转换分类列OrdinalEncoder(但是,可能并不总是需要序数编码 - 您应该查找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)]
于 2022-01-21T19:23:13.863 回答