#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
флаг.