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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 09:42:23