如何使用 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
,所以你会再次失去功能名称功能。)
我正在尝试使用 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
,所以你会再次失去功能名称功能。)