【发布时间】: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