使用sklearn的ColumnTransformer时应遵循的正确列指定规范是什么
错误原因
ColumnTransformer的transformers参数第三个位置要求传入列名列表、列索引、布尔掩码,你当前传入的是完整的DataFrame/Series对象,不符合参数要求触发报错。ColumnTransformer.fit_transform()仅返回特征转换后的结果,不会同步返回标签Y,你用两个变量接收返回值会额外触发解包错误。- 你在定义完所有特征处理逻辑后才将标签
Survived从原数据中弹出,会导致标签列被误加入特征处理流程。
修正方案
按如下步骤调整代码:
- 先拆分特征和标签,避免标签被误处理
- 给
ColumnTransformer传入正确的列名标识,而非具体数据集 - 调整返回值接收逻辑,仅用一个变量接收转换后的特征
修正后可运行代码片段
# 第一步先拆分特征和标签 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
相关产品推荐
相关产品推荐

