sklearn: Добавление имен в feature_importances_/coef_ при использовании ColumnTransformer и конвейера

#python #scikit-learn

Вопрос:

Я работаю над конкурсом страховых цен 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
 

Для предварительной обработки и т.д. Я использую конвейер, включающий преобразователь столбцов:

 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') amp; (X_train['VehBrand'] == 'B12') amp; (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())])
 

Как только модель будет установлена, я хотел бы отобразить значения функций и названия функций, как это:

Имя feature_importances_
Area_A 0.25
Area_B 0.10
Вехаж 0.30

Проблема, с которой я сталкиваюсь, заключается в том, чтобы получить имена функций при использовании преобразователя столбцов. Особенно нелегко получить имена функций из KBinsDiscretizer, который также использует кодировку OneHot. До сих пор я пытался создать массив numpy с именами функций вручную, но, как я уже сказал, мне не удается получить имена функций из KBinsDiscretizer, и это решение кажется не очень элегантным.

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

Существует ли простой (возможно, даже встроенный) способ создания фрейма данных, включающего как имена функций, так и значения функций?

Ну и поскольку мы уже здесь (это может быть немного не по теме): Есть ли простой способ создать пользовательский преобразователь столбцов, который добавляет новый столбец «RBVAge», который я в настоящее время добавляю вручную?

Заранее спасибо

Комментарии:

1. Ваш последний вопрос, вероятно, должен быть его собственным сообщением. Но я бы посмотрел на FunctionTransformer или очень маленький пользовательский трансформатор , который принимает 3 соответствующих входных столбца и возвращает новый столбец.

Ответ №1:

Это будет намного проще в предстоящей версии 1.0 (или вы можете получить текущий код github), который включает в себя PR18444, добавление a get_feature_names_out KBinsDiscretizer , а также Pipeline (и другие).

Если вы застряли на своей версии sklearn, вы можете взглянуть на исходный код, который делает это, чтобы помочь вам исправить то же самое; похоже, он не очень много делает сам по себе, просто вызывает внутренний _encoder объект для выполнения работы и OneHotEncoder get_feature_names некоторое время (скоро будет заменен get_feature_names_out ).

Комментарии:

1. Спасибо @BenReiniger. Поскольку я никогда не работал с github, не могли бы вы дать мне подсказку о том, как установить текущий код github?

2. Сейчас на pypi есть предварительные выпуски, так что, возможно, это лучший путь; с pip используйте --pre флаг.