如何处理Transformer计算需用但训练数据不应包含的列及相关报错?
解决自定义Transformer依赖列的处理问题
首先,你遇到的ValueError: A given column is not a column of the dataframe报错,本质是ColumnTransformer指定的列在X_train中不存在,先排查以下两点:
- 核对X_train的列名,确保包含所有在transformer中指定的列(比如
time_window、short_window等),注意拼写和大小写是否一致; - 确认这些列确实存在于你的训练数据集里,没有被提前误删除。
针对你核心需求——Transformer计算需要用到某些列,但这些列最终不能出现在传给分类器的特征中,可以通过以下两步解决:
1. 自定义Transformer仅输出新生成的特征
你的自定义Transformer必须继承sklearn.base.BaseEstimator和TransformerMixin,并且在transform方法中只返回计算得到的新特征,而不是原始输入列。这样ColumnTransformer只会把新特征拼接到最终特征集里,原始计算列不会被保留。
举个ProbabilityEstimator的正确实现示例:
from sklearn.base import BaseEstimator, TransformerMixin class ProbabilityEstimator(BaseEstimator, TransformerMixin): def fit(self, X, y=None): # 这里可以添加拟合逻辑(比如计算统计量) return self def transform(self, X): # 基于输入列计算新特征(示例:通过率) pass_rate = X['total_pass'] / (X['total_pass'] + X['total_fail']) # 返回二维数组(sklearn要求输出必须是2D格式) return pass_rate.values.reshape(-1, 1)
同理修改ContactSiteEstimator,确保transform方法仅输出你需要的新特征,而非原始输入列。
2. 利用ColumnTransformer的默认行为丢弃无关列
ColumnTransformer默认参数remainder='drop',所有未被指定在transformers列表中的列都会被自动丢弃。只要你的自定义Transformer只输出新特征,OneHotEncoder处理指定列后输出编码特征,最终传给LogisticRegression的特征就只会是这些新生成的特征,完全不会包含那些用于计算的原始列。
验证修改后的Pipeline
调整后的代码结构可以保持不变,只要确保Transformer的输出正确,X_train包含所需列,就能正常运行:
custom_transformers = ColumnTransformer([ ('probability_estimator', ProbabilityEstimator(), ['softbin_first_test', 'time_window', 'total_pass', 'total_fail']), ('contact_site_estimator', ContactSiteEstimator(), ['tester_id', 'site_number', 'short_window']), ('onehotencoder', OneHotEncoder(), ['softbin_first_test', 'bincode_type_last_retest'])]) classifier = LogisticRegression() pipeline = Pipeline(steps=[ ('custom_transformers', custom_transformers), ('classifier', classifier) ]) pipeline.fit(X_train, y_train)
内容的提问来源于stack exchange,提问作者Abir
相关产品推荐
相关产品推荐

