#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
и ручное склеивание других имен сработало бы.