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

sklearn使用ColumnTransformer与Pipeline时获取特征重要性对应名称及自定义转换方法

问题1:获取ColumnTransformer生成的完整特征名

只要你使用的scikit-learn版本≥1.0,ColumnTransformer以及所有内置转换器都已经支持get_feature_names_out()接口,可以直接调用获取所有转换后的特征名,无需手动拼接。
注意需要先完成pipeline拟合后再调用该方法,示例代码如下:

# 先完成模型拟合
pipe_poisson_reg.fit(X_train, y_train)

# 直接从ColumnTransformer获取所有转换后的特征名
feature_names = pipe_poisson_reg.named_steps['cf_trans'].get_feature_names_out()

# 结合模型系数/特征重要性生成目标DataFrame
import pandas as pd
result_df = pd.DataFrame({
    'name': feature_names,
    'feature_importances_/coef_': pipe_poisson_reg.named_steps['poisson_regressor'].coef_
})
# 如果你使用的是树类模型,替换为对应模型的feature_importances_属性即可

默认输出的特征名会自动携带对应转换器的前缀,比如KBinsDiscretizer分箱后生成的特征会命名为kbins__VehAge_0、kbins__VehPower_1这类格式,如果不需要前缀可以自行做字符串裁剪即可。

问题2:自动生成衍生列RBVAge

不需要手动给数据集加列,可以把衍生逻辑封装成转换器整合到ColumnTransformer中,实现端到端处理,示例代码如下:

# 定义衍生列计算函数
def cal_rbvage(X):
    X = X.copy()
    X['RBVAge'] = 0
    X.loc[(X['VehGas'] == 'Regular') & (X['VehBrand'] == 'B12') & (X['VehAge'] == 0), 'RBVAge'] = 1
    return X[['RBVAge']] # 仅返回衍生列,避免特征重复

# 改写ColumnTransformer,新增衍生列处理步骤
ct = ColumnTransformer([
    ('rbv_age', FunctionTransformer(cal_rbvage), ['VehGas', 'VehBrand', 'VehAge']),
    ('pt', 'passthrough', ['BonusMalus']), # 原pt_columns去掉RBVAge即可
    ('log', FunctionTransformer(np.log1p, validate=False), log_columns),
    ('kbins', KBinsDiscretizer(), kbins_columns),
    ('ohe', OneHotEncoder(), cat_columns)
])

改造后整个预处理逻辑完全包含在Pipeline内,预测时不需要手动给测试集添加衍生列,直接调用pipe_poisson_reg.predict(X_test)即可,也避免了手动处理带来的数据泄露风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 06:45:01