如何使用 ColumnTransformer 和 OrdinalEncder 进行转换?

How to transform with ColumnTransformer and OrdinalEncder?

我正在尝试使用 ColumnTransformer 预处理数据,但没有管道。这是代码:

object_pre = Pipeline(steps=[
    ("imputer", SimpleImputer(strategy="most_frequent")),
    ("ordencoder", OrdinalEncoder(mapping=mapping)),
    ("onehot", OneHotEncoder(cols=ord_cols))
])
num_pre = SimpleImputer()

object_cols = [col for col in X.columns if X[col].dtype == "object"]
num_cols = list(set(X.columns) - set(object_cols))

preprocessor = ColumnTransformer(transformers=[
    ("num_pre", num_pre, num_cols),
    ("object_pre", object_pre, object_cols)
])
X_temp = pd.DataFrame(preprocessor.fit_transform(X))

但是,当我 运行 它时,我在最后一行收到以下错误:

KeyError: 'Education'

我确信问题与映射变量有关,它是使用以下代码创建的:

mapping = [
    {
        "col": "Education",
        "mapping": {
            "Not Graduate": 0,
            "Graduate": 1
        }
    },
    {
        "col": "Dependents",
        "mapping": {
            "0": 0,
            "1": 1,
            "2": 2,
            "3+": 3,
        }        
    },
]

ord_cols = ["Gender"]
for i in list(set(X.columns) - set(ord_cols)):
    mapping.append({
        "col": i,
        "mapping": {
            "No": 0,
            "Yes": 1
        }
    })

你能告诉我我做错了什么吗? 提前致谢 ;)

管道的 SimpleImputer 第一步将数据转换为 numpy 数组,因此列名称不适用于 OrdinalEncoder 中的 mapping(来自 category_encoder包)第二步。 OrdinalEncoder 有一个参数 handle_missing 和一个选项 return_nan,所以我认为你可以交换前两步的顺序并获得相同的效果。

OrdinalEncoder 的 sklearn 版本会传递缺失值,从 v1.0 开始,所以你可能会恢复到那个状态,但是你会得到数组 categories 而不是dict mapping,所以你会再次失去功能名称功能。)