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

#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')