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

使用Scikit-learn Pipeline转换测试集时触发ValueError问题排查

问题原因及解决方案

核心问题原因

1. 特征列定义与实际输入不匹配

你从包含Action列的原始data中提取numeric_features和categorical_features,但实际训练/测试用的X_train/X_test是去掉Action列的特征集。若Action为数值型列,numeric_features会包含它,导致ColumnTransformer期望输入有11列(含Action),但X_test只有10列(无Action),直接触发特征数不匹配的错误。

2. 列重复处理导致配置混乱

pkts_received属于数值型列,会被num转换器处理,同时你又用pkt_received_scaling单独处理该列;另外要删除的Bytes Received、Bytes、Packets也可能属于numeric_features,这些重复/冲突的列配置进一步加剧了输入列与预期列的不匹配问题。

3. 测试Pipeline的冗余与错误使用

你不需要单独构建test_pipe_transform,且后续用final_pipe.predict(X_test_transformed)逻辑错误——final_pipe本身已包含预处理+PCA+分类器,把预处理后的结果再传入预测,相当于对数据做了两次预处理+PCA。

修复步骤

步骤1:基于正确的特征集提取列

将特征列的提取源从data改为X(去掉Action后的特征集):

# 原代码
# categorical_features = get_categorical_columns(data)
# numeric_features     = get_numerical_columns(data)

# 修改后
categorical_features = get_categorical_columns(X)
numeric_features     = get_numerical_columns(X)

步骤2:修正ColumnTransformer的列配置,避免重复处理

从numeric_features中排除要删除和单独处理的列,确保每列仅被处理一次:

# 定义要删除和单独处理的列
drop_cols = ["Bytes Received", "Bytes", "Packets"]
special_num_cols = ["pkts_received"]

# 过滤出仅需通用数值预处理的列
filtered_num_features = [col for col in numeric_features if col not in drop_cols + special_num_cols]

# 重构预处理模块
preprocessor = ColumnTransformer(
    transformers = [
        ("drop_cols"                    , "drop"             , drop_cols           ),
        ("num"                          , numeric_inputer    , filtered_num_features),
        ("pkt_received_scaling"         , pipe_pkt_received  , special_num_cols    ),
        #("cat"                         , categorical_inputer, categorical_features),
    ],
    remainder = 'passthrough',
)

步骤3:简化测试数据处理

直接用训练好的final_pipe处理测试集,无需额外构建测试Pipeline:

# 原错误代码
# test_pipe_transform = Pipeline(
#     steps = [
#         ('preprocessor', final_pipe.named_steps['preprocessor']),
#         ('scaler'      , final_pipe.named_steps['PCA']),
#     ])
# X_test_transformed = test_pipe_transform.transform(X_test)
# y_pred = final_pipe.predict(X_test_transformed)

# 修改后
# 直接用完整Pipeline预测测试集
y_pred = final_pipe.predict(X_test)

# 若需获取预处理+PCA后的特征,用Pipeline切片取前两步
X_test_transformed = final_pipe[:-1].transform(X_test)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 22:57:05