#python #pandas #xgboost #catboost
#python #pandas #xgboost #catboost
Вопрос:
Итак, я запускал модель Catboost с использованием Python, которая была довольно простой, в основном:
from catboost import CatBoostClassifier, Pool, cv
catboost_model = CatBoostClassifier(
cat_features=["categorical_variable_1", "categorical_variable_2"],
loss_function="Logloss",
eval_metric="AUC",
iterations=200,
)
Итак, я хотел получить значение функции. С помощью классификатора XGBoost я мог бы подготовить фрейм данных с важностью функции, делая что-то вроде:
importances = xgb_model.get_fscore()
feat_list = []
date = datetime.today()
for feature, importance in importances.items():
dummy_list.append([date, feature, importance])
feat_df = pd.DataFrame(feat_list, columns=['date', 'feature', 'importance'])
Теперь я хотел сделать то же самое с функциями CatBoost. Я начал с выполнения:
catboost_model.get_feature_importance(
Pool(X_train, y_train, cat_features=["categorical_variable_1", "categorical_variable_2"]))
Но я не знаю, как двигаться дальше от этого (что должно быть очень просто, но я заблудился). Кто-нибудь может мне помочь?
Комментарии:
1. Можете ли вы опубликовать результат, полученный из последней строки кода
catboost_model.get_feature_importance()
2. Это просто массив, например: array([0.4, 0.2, …, 0.5])
Ответ №1:
Короче говоря, вы можете сделать что-то вроде
pd.DataFrame({'feature_importance': model.get_feature_importance(train_pool),
'feature_names': x_val.columns}).sort_values(by=['feature_importance'],
ascending=False)
вы также можете создать функцию, подобную (я нашел объяснение на Analyseup.com здесь
def plot_feature_importance(importance,names,model_type):
#Create arrays from feature importance and feature names
feature_importance = np.array(importance)
feature_names = np.array(names)
#Create a DataFrame using a Dictionary
data={'feature_names':feature_names,'feature_importance':feature_importance}
fi_df = pd.DataFrame(data)
#Sort the DataFrame in order decreasing feature importance
fi_df.sort_values(by=['feature_importance'], ascending=False,inplace=True))
#Define size of bar plot
plt.figure(figsize=(10,8))
#Plot Searborn bar chart
sns.barplot(x=fi_df['feature_importance'], y=fi_df['feature_names'])
#Add chart labels
plt.title(model_type 'FEATURE IMPORTANCE')
plt.xlabel('FEATURE IMPORTANCE')
plt.ylabel('FEATURE NAMES')
и постройте график важности функции из другого алгоритма повышения
#plot the xgboost result
plot_feature_importance(xgb_model.feature_importances_,train.columns,'XG BOOST')
#plot the catboost result
plot_feature_importance(cb_model.get_feature_importance(),train.columns,'CATBOOST')
Комментарии:
1. Это генерирует для меня множество графиков. Создает ли это графики важности функций для каждого дерева, которое было установлено?
Ответ №2:
Теперь у вас уже есть фрейм данных:
data = pd.DataFrame({'feature_importance': model.get_feature_importance(train_pool),
'feature_names': x_val.columns}).sort_values(by=['feature_importance'],
ascending=False)
Мне было проще строить график с помощью встроенного инструмента pandas, например, для 20 лучших функций:
data[:20].sort_values(by=['feature_importance'], ascending=True).plot.barh(x='feature_names', y='feature_importance')