【问题标题】:sklearn: Adding names to feature_importances_/coef_ when using ColumnTransformer and Pipelinesklearn:在使用 ColumnTransformer 和 Pipeline 时向 feature_importances_/coef_ 添加名称
【发布时间】:2021-11-14 01:28:46
【问题描述】:

我正在参与 Kaggl 保险定价竞赛 (https://www.kaggle.com/floser/french-motor-claims-datasets-fremtpl2freq)。数据如下所示:

   IDpol    ClaimNb Exposure    Area    VehPower    VehAge  DrivAge BonusMalus  VehBrand    VehGas  Density Region
0   1.0        1        0.10       D           5         0       55        50        B12    Regular 1217    R82
1   3.0        1        0.77       D           5         0       55        50        B12    Regular 1217    R82
2   5.0        1        0.75       B           6         2       52        50        B12    Diesel  54      R22
3   10.0       1        0.09       B           7         0       46        50        B12    Diesel  76      R72
4   11.0       1        0.84       B           7         0       46        50        B12    Diesel  76      R72

对于预处理等。我正在使用包含 ColumnTransformer 的管道:

pt_columns = ['BonusMalus', 'RBVAge']
log_columns = ['Density']
kbins_columns = ['VehAge','VehPower', 'DrivAge']
cat_columns = ['Area', 'Region', 'VehBrand', 'VehGas']

X_train['RBVAge'] = 0
X_train.loc[(X_train['VehGas'] == 'Regular') & (X_train['VehBrand'] == 'B12') & (X_train['VehAge'] == 0), 'RBVAge'] = 1

ct = ColumnTransformer([('pt', 'passthrough', pt_columns),
                        ('log', FunctionTransformer(np.log1p, validate=False), log_columns),
                        ('kbins', KBinsDiscretizer(), kbins_columns),
                       ('ohe', OneHotEncoder(), cat_columns)])
pipe_poisson_reg = Pipeline([('cf_trans', ct),
                      ('ssc', StandardScaler(with_mean = False)),
                      ('poisson_regressor', PoissonRegressor())])

一旦模型拟合好,我想显示特征重要性和特征名称,如下所示:

name feature_importances_
Area_A 0.25
Area_B 0.10
VehAge 0.30
... ...

我面临的问题是在使用 ColumnTransformer 时获取功能名称。尤其是从也使用 OneHot 编码的 KBinsDiscretizer 中获取功能名称并不容易。到目前为止,我尝试的是手动创建一个带有功能名称的 numpy 数组,但正如我所说,我无法设法从 KBinsDiscretizer 获取功能名称,而且这个解决方案似乎不是很优雅。

columnNames = np.append(pt_columns, pipe['cftrans'].transformers_[1][1].get_feature_names(cat_columns))

是否有一种简单的(甚至是内置的)方法来创建包含特征名称和特征重要性的 DataFrame?

好吧,既然我们已经在这里了(这可能有点跑题了): 有没有一种简单的方法来创建一个自定义 ColumnTransformer,它添加了我目前手动添加的新列 'RBVAge'?

提前致谢

【问题讨论】:

  • 你的最后一个问题应该是它自己的帖子。但我会研究一个FunctionTransformer,或者一个非常小的自定义转换器,它接收 3 个相关的输入列并返回新列。

标签: python scikit-learn


【解决方案1】:

在即将发布的 v1.0 中,这将变得更加容易(或者您可以获取当前的 github 代码),其中包括 PR18444,将 get_feature_names_out 添加到 KBinsDiscretizer 以及 Pipeline(以及其他)。

如果您坚持使用您的 sklearn 版本,您可以查看source code,它可以帮助您进行相同的修补;它本身似乎并没有做太多事情,只是调用内部_encoder 对象来完成工作,而OneHotEncoder 已经有一段时间了get_feature_names(很快就会被get_feature_names_out 取代)。

【讨论】:

  • 谢谢@BenReiniger。由于我从未使用过 github,您能否给我提示一下如何安装当前的 github 代码?
  • pypi 上现在有预发布,所以也许这是更好的途径;对于 pip,使用 --pre 标志。
猜你喜欢
  • 2021-06-17
  • 2019-07-05
  • 2021-09-26
  • 2020-09-16
  • 2022-09-23
  • 2020-09-25
  • 2020-01-31
  • 2020-06-30
  • 1970-01-01
相关资源
最近更新 更多