Важность сюжета с использованием xgb, а также рейнджер Лучший способ сравнить - PullRequest
0 голосов
/ 14 января 2020

Я работаю над сценарием, который обучает как случайный лес рейнджеров, так и регрессию xgb. В зависимости от того, какая из них работает лучше всего на основе rmse, одна или другая используется для проверки данных удержания.

Я также хотел бы сопоставить важность функции для обоих сопоставимым образом.

С В библиотеке xgboost я могу получить свою таблицу важности объектов и построить график так:

> xgb.importance(model = regression_model)
                 Feature        Gain       Cover  Frequency
1:              spend_7d 0.981006272 0.982513621 0.79219969
2:                   IOS 0.006824499 0.011105014 0.08112324
3:  is_publisher_organic 0.006379284 0.002917203 0.06770671
4: is_publisher_facebook 0.005789945 0.003464162 0.05897036

Затем я могу построить ее так:

> xgb.importance(model = regression_model) %>% xgb.plot.importance()

enter image description here

Это использовало библиотеку xgboost и их функции. С помощью ранжирования случайных форрестов, если я подгоняю регрессионную модель, я могу получить важность функции, если при подгонке модели добавлю importance = 'impurity'. Тогда:

regression_model$variable.importance
             spend_7d        d7_utility_sum  recent_utility_ratio                   IOS  is_publisher_organic is_publisher_facebook 
         437951687132                     0                     0             775177421             600401959            1306174807 

Я мог бы просто создать ggplot. Но шкалы совершенно различны между тем, что рейнджер возвращает в этой таблице, и тем, что xgb показывает на графике.

Существует ли готовая библиотека или решение, где я могу изобразить важность функции xgb или рейнджера модель в сопоставимом виде?

1 Ответ

1 голос
/ 15 января 2020

Как столбец «Усиление» XGboost, так и значения рейнджера с параметром «примесь» строятся по общему уменьшению примеси (следовательно, усилению) расщеплений данной переменной.

Единственная разница заключается в том, что, хотя XGboost автоматически делает значения в процентах, рейнджер сохраняет их как исходные значения, то есть сумму квадратов, что не очень удобно для построения графика. Поэтому вы можете преобразовать значения значений рейнджера, разделив их на общую сумму, чтобы у вас был эквивалентный процент, как в Xgboost.

Поскольку использование уменьшения количества примесей может иногда вводить в заблуждение, я предлагаю вам рассчитать (для обеих моделей) значения переменных с помощью перестановки. Это позволяет легко получить значения, которые сопоставимы для разных моделей, и является более стабильным.

Я предлагаю этот невероятно полезный пост

Вот значение перестановки, как определено там (извините, это Python, а не R):

def permutation_importances(rf, X_train, y_train, metric):
  baseline = metric(rf, X_train, y_train)
  imp = []
  for col in X_train.columns:
    save = X_train[col].copy()
    X_train[col] = np.random.permutation(X_train[col])
    m = metric(rf, X_train, y_train)
    X_train[col] = save
    imp.append(baseline - m)
return np.array(imp)

Однако, рейнджер также позволяет вычислять значения перестановок с помощью importance="permutation", и xgboost может делать то же самое.

...