You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用sklearn的ColumnTransformer时应遵循的正确列指定规范是什么

错误原因

  1. ColumnTransformer的transformers参数第三个位置要求传入列名列表、列索引、布尔掩码,你当前传入的是完整的DataFrame/Series对象,不符合参数要求触发报错。
  2. ColumnTransformer.fit_transform()仅返回特征转换后的结果,不会同步返回标签Y,你用两个变量接收返回值会额外触发解包错误。
  3. 你在定义完所有特征处理逻辑后才将标签Survived从原数据中弹出,会导致标签列被误加入特征处理流程。

修正方案

按如下步骤调整代码:

  1. 先拆分特征和标签,避免标签被误处理
  2. 给ColumnTransformer传入正确的列名标识,而非具体数据集
  3. 调整返回值接收逻辑,仅用一个变量接收转换后的特征

修正后可运行代码片段

# 第一步先拆分特征和标签
Y = file1_train.pop("Survived")
X = file1_train.drop(columns = ["PassengerId","Name"])

# 拆分特征类型
objs = X.select_dtypes(["object"])
num  = X.select_dtypes(["number"])

# 定义各类型特征的处理流水线
numerical_pipeline = Pipeline(
    steps=[
            ("imputer", SimpleImputer(strategy = 'mean')),
            ("scaler", StandardScaler())
    ]
)

binary_pipeline = Pipeline(
    steps=[
        ("binary", LabelBinarizer())
    ]
)

catergorical_pipeline = Pipeline(
    steps=[
            ("imputer", SimpleImputer(strategy = 'most_frequent')),
            ("ordinal_encoder", OrdinalEncoder()),
            ("scaler", StandardScaler())
    ]
)

# ColumnTransformer传入列名而非数据集
data_preprocessor = ColumnTransformer(
    transformers = [
        ('numerical', numerical_pipeline, num.columns.tolist()),
        ('binary', binary_pipeline, "Sex"),
        ('categorical', catergorical_pipeline, ["Ticket", "Cabin", "Embarked"])
    ])

# 仅接收转换后的特征,Y不需要从这里获取
X_transform = data_preprocessor.fit_transform(X,y=Y)

内容的提问来源于stack exchange,提问作者EnlightenedFunky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.22 02:27:04