Есть ли способ получить имена функций, обработанных с помощью MaxAbsScaler и OneHotEncoder для построения значений Shapley?

Я пытаюсь использовать Shapley summary_plot для проверки первых двадцати функций в моем классификаторе случайного леса. Сначала я предварительно обработал свои данные с помощью MaxAbsScaler и OneHotEncoder, используя make_pipeline и ColumnTransformer. Когда я рисую значения Шепли, я вижу, что все имена функций являются числами, и я не могу понять, как правильно идентифицировать имена функций. Я сослался на: Конвейер Sklearn: получение имен функций после OneHotEncode в ColumnTransformer, но я вижу сообщение об ошибке ниже.

Сначала я пробую сюжет Шепли:

explainer = shap.TreeExplainer(rf)
shap_values = explainer.shap_values(X_test_scaled)

#convert X_test_scaled to DF so can call column names
X_test_scaled = pd.DataFrame(X_test_scaled)
X_test_scaled.head()
shap.summary_plot(shap_values, features=X_test_scaled, feature_names = X_test_scaled.columns)

производит: Сводный график Шепли с пронумерованными элементами

Затем, чтобы получить имена, я попытался из сообщения:

preprocess['maxabsscaler'].transformers_[1][1]['onehotencoder']\
                   .get_feature_names(categorical_features)

который выводит:

TypeError Traceback (последний вызов последним) в 2 # .get_feature_names (категориальные_функции 3 ---- ›4 препроцессора ['maxabsscaler']. Transformers_ 1 ['onehotencoder']
5 .get_feature_names (категориальные_функции)

TypeError: объект ColumnTransformer не подлежит подписке


person schwartz1662    schedule 22.04.2021    source источник
comment
Можете ли вы немного упростить этот пример и добавить минимально воспроизводимый пример? MaxAbsScaler не должен изменять количество функций, но OneHotEncoder представит новую функцию для каждого уникального значения в столбце: у вас есть способ назвать их? (например, blood_pressure_category_1, blood_pressure_category2 и т. д.)   -  person Alexander L. Hayes    schedule 22.04.2021