Как получить значения функций с именами столбцов после рандомизированного поиска и одной горячей закодированной информации?

#python #pandas #scikit-learn #one-hot-encoding

Вопрос:

Я написал следующий блок кода. После того, как я нашел лучшую оценку, я хочу узнать, насколько важна модель. Но я не мог понять, как это правильно сделать с именами столбцов.

 scaler = StandardScaler()
ohe = OneHotEncoder(categories=unique_list, sparse=False)

col_transformers = ColumnTransformer([
                          ("scaler_onestep", scaler, numerical_columns),
                          ("ohe_onestep", ohe, categorical_columns)])


param_grid = {
        'XGB__estimator__max_depth': [3, 5, 7, 10],
        'XGB__estimator__learning_rate': [0.01, 0.1],
        'XGB__estimator__n_estimators': [100]}

model = MultiOutputClassifier(xgb.XGBClassifier(objective="binary:logistic"))

#Define a pipeline
pipeline = Pipeline([("preprocessing", col_transformers), ("XGB", model)])

rs_clf = RandomizedSearchCV(pipeline, param_grid, n_iter=3,
                            n_jobs=-1, verbose=2, cv=2, scoring="accuracy", refit=True, random_state=42)

rs_clf.fit(X, y)
 

Это дает мне результат значений функций для первой метки.

 rs_clf.best_estimator_.named_steps["XGB"].estimators_[0].feature_importances_
 

Это дает мне катагории.

 rs_clf.best_estimator_.named_steps["preprocessing"].transformers[1][1].categories
 

результат содержит 389 столбцов, X содержит 279 столбцов, поэтому я не могу написать его напрямую, как я могу сделать это для одной горячей кодировки данных?
Как я могу найти имена этих 389 столбцов?

Ответ №1:

Этот get_feature_names метод будет здесь очень полезен. На данный момент StandardScaler это не поддерживается; поскольку xgboost полностью не зависит от масштабирования функций, я бы предложил удалить его и заменить числовую часть ColumnTransformer на "passthrough" . Затем rs_clf.best_estimator_.named_steps["preprocessing"].get_feature_names() следует указать функции в том порядке, в каком они поступают на XGB.

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

1. Я не думаю get_feature_names , что вернет какие-либо функции, которые не используются одним горячим кодировщиком. Таким образом, любые столбцы, в которые они не входят categorical_columns , не будут возвращены и должны быть добавлены позже.

2. @Шайдо, ColumnTransformer.get_feature_names метод действительно включает имена из проходов и остатка (по крайней мере, в последней версии).

3. … но он сломался бы , если бы у кого-либо из трансформаторов не было своего get_feature_names , поэтому было предложено отказаться от масштабирования. В противном случае, да, использование OneHotEncoder.get_feature_names и ручное склеивание других имен сработало бы.