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
相关产品推荐
相关产品推荐

