Форматирование номера графика в XGBoost plot_importance () - PullRequest
1 голос
/ 09 мая 2019

Я обучил модель XGBoost и использовал plot_importance () для построения графика, какие функции являются наиболее важными в обучаемой модели.Хотя числа на графике имеют несколько десятичных значений, которые заполняют график и не вписываются в график.

Я искал варианты форматирования графика, но я только нашел, как отформатировать ось (пробовал форматировать ось X внадеюсь, что он также отформатирует соответствующие оси)

Я работаю в Jupyter Noteboook (если это что-то меняет).Код выглядит следующим образом:

xg_reg = xgb.XGBClassifier(
                objective = 'binary:logistic',
                colsample_bytree = 0.4,
                learning_rate = 0.01,
                max_depth = 15, 
                alpha = 0.1, 
                n_estimators = 5,
                subsample = 0.5,
                scale_pos_weight = 4
                )
xg_reg.fit(X_train, y_train) 
preds = xg_reg.predict(X_test)

ax = xgb.plot_importance(xg_reg, max_num_features=3, importance_type='gain', show_values=True) 

fig = ax.figure
fig.set_size_inches(10, 3)

Есть что-то, что я пропускаю?Есть ли какие-либо функции форматирования или параметры для передачи?

Я хотел бы иметь возможность отформатировать оценки важности функций или хотя бы отбросить десятичную часть (например, «25» вместо «25.66521»).Прикрепленный текущий график ниже.

xgboost_feature_importance_scores

Ответы [ 2 ]

1 голос
/ 09 июля 2019

Отредактируйте код plotting.py в пакете xgboost с помощью:

86 ylocs = np.arange(len(values))
87 values=tuple([round(x,4) for x in values])
88 ax.barh(ylocs, values, align='center', height=height, **kwargs)

enter image description here

0 голосов
/ 19 мая 2019

У меня возникла та же проблема, которую я только что решил.

Это происходит только потому, что для «усиления» или «покрытия» числа содержат слишком много плавающих чисел, противоположных опции «вес». К сожалению, насколько я знаю, нет возможности указать количество цифр. Таким образом, я изменил функции самостоятельно, чтобы указать максимально допустимое количество цифр. Вот изменения, которые нужно выполнить в файле plotting.py пакета xgboost. Если вы работаете с консолью паука, вы можете найти и открыть файл, просто указав неправильную опцию (я ленивый парень), например:

xgb.plot_importance(xg_reg, potato=False)

А затем нажмите на файл с ошибкой в ​​консоли. Следующим шагом является изменение самой функции, как показано ниже:

def plot_importance(booster, ax=None, height=0.2,
                    xlim=None, ylim=None, title='Feature importance',
                    xlabel='F score', ylabel='Features',
                    importance_type='weight', max_num_features=None,
                    grid=True, show_values=True, max_digits=3, **kwargs): 

и затем вы должны также добавить перед условиями show_values:

if max_digits is not None:
    t = values
    lst = list(t)
    if len(str(lst[0]).split('.')[-1])>max_digits:
        values_displayed = tuple([('{:.'+str(max_digits)+'f}').format(x) for x in lst])
    else:
        values_displayed = values

if show_values is True:
    for x, x2, y in zip(values, values_displayed, ylocs):
        ax.text(x + 1, y, x2, va='center')

Я выполнил условие, чтобы форматировать только число, если оно больше указанного числа цифр. Это позволяет избежать, например, опции priority_type = 'weight' для создания нежелательных цифр.

Обратите внимание, что для 'cover' и 'gain' текст также плохо позиционируется для меня, поэтому я также изменил сдвиг и заменил 1 здесь:

if show_values is True:
    for x, x2, y in zip(values, values_displayed, ylocs):
         dx = np.max(values)/100
         ax.text(x + dx, y, x2, va='center')

Надеюсь, это поможет вам!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...