如何在sklearn Pipeline中使用FunctionTransformer构造交叉特征
使用sklearn Pipeline结合FunctionTransformer实现跨列特征构造
通过自定义函数封装特征计算逻辑,配合FunctionTransformer即可嵌入预处理流水线,实现过程中注意保留DataFrame结构避免列名丢失即可,完整实现如下:
代码实现
首先导入依赖:
import pandas as pd from sklearn.preprocessing import FunctionTransformer from sklearn.pipeline import Pipeline
编写特征计算的自定义函数,注意要复制输入数据避免污染原始数据集:
def build_derived_features(X: pd.DataFrame) -> pd.DataFrame: X = X.copy() # 计算feature_1与feature_2的差值作为新特征feature_3 X["feature_3"] = X["feature_1"] - X["feature_2"] return X
将自定义逻辑封装为可接入Pipeline的预处理组件,注意关闭validate参数避免输入被强制转换为numpy数组丢失列信息:
# 封装特征构造转换器 feature_builder = FunctionTransformer( build_derived_features, validate=False ) # 构建完整预处理器,后续可直接追加其他预处理步骤(标准化、编码等) preprocessor = Pipeline( steps=[ ("derive_features", feature_builder), # 示例:后续可追加其他预处理节点 # ("std_scaler", StandardScaler()), ] )
效果验证
用提供的示例DataFrame测试:
# 构造测试数据 df = pd.DataFrame({ "feature_1": [2, 3], "feature_2": [1, 2] }) # 执行预处理 result = preprocessor.fit_transform(df) print(result)
运行后输出结果如下,新特征已经在预处理流程中自动生成:
feature_1 feature_2 feature_3 0 2 1 1 1 3 2 1
关键注意点
- 自定义特征计算函数中必须对输入的X做
.copy()操作,否则会直接修改原始输入DataFrame,造成原始数据被意外篡改。 - 如果后续流水线中存在只接受numpy数组输入的组件,可以在特征构造步骤后增加格式转换逻辑,优先保证全流水线输入输出格式统一。
- 需要新增其他衍生特征时,直接在
build_derived_features函数中追加计算逻辑即可,不需要新增额外的转换器节点。
内容的提问来源于stack exchange,提问作者Lucas Dresl
相关产品推荐
相关产品推荐

