Другой способ думать о важности функции - PullRequest
0 голосов
/ 11 сентября 2018

В «Приближении жадных функций» Фридмана в «Летописи статистики», 2001 , относительная важность входных переменных описана в разделе 8.1.Уравнение 44 (из Breiman, Friedman, Olshen & Stone, 1983) показывает, что относительная важность объекта в дереве - это общее (т. Е. Сумма) улучшение квадратичной ошибки по всем узлам, разделяющимся на этот объект - не нормированным или пропорциональным - с помощью уравнения 45вычисление относительной важности функции для GBM путем взятия среднего по всем деревьям суммы (опять же, не среднего по пропорциям).

Эта сумма находится в коде здесь

Я почти уверен, что функция, которая используется редко, но когда она используется, важно, чтобы в этом методе не было высокого ранга.Текущее определение - что-то вроде общей полезности, но я думаю, что хочу среднее.Это сняло бы вопрос о том, сколько раз оно использовалось.Например, если была двоичная функция, которая отличалась от нуля только 1 на миллион строк, но когда это было, это оказало огромное влияние на прогноз.Изменение суммы в приведенной выше строке кода на среднее значение выделит такие функции.

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

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

1 Ответ

0 голосов
/ 14 сентября 2018

Как объяснено здесь важность функции, определяемая посредством дерева, не является большой метрикой. Если вы можете позволить себе время вычислений, вам лучше использовать важность перестановки.

ELI5 имеет реализацию этого. Для сравнения вы можете запустить следующий код, чтобы проверить вашу обученную модель clf.

from eli5.sklearn import PermutationImportance
iterations = 5

#http://scikit-learn.org/stable/modules/model_evaluation.html#common-cases-predefined-values
eval_metric = 'r2'
#eval_metric = 'neg_mean_absolute_error' 
#eval_metric = 'neg_mean_squared_error'
#eval_metric = 'explained_variance'


perm_train = PermutationImportance(clf,scoring = eval_metric, n_iter=iterations).fit(X_train, y_train)
feature_importance_train = perm_train.feature_importances_
feature_importance_train_error = perm_train.feature_importances_std_/np.sqrt(iterations)

perm_test = PermutationImportance(clf,scoring = eval_metric, n_iter=iterations).fit(X_test, y_test)
feature_importance_test = perm_test.feature_importances_
feature_importance_test_error = perm_test.feature_importances_std_/np.sqrt(iterations)

# make model importances relative to max importance
feature_importance_model = clf.feature_importances_
feature_importance_model = feature_importance_train.max() * (feature_importance_model / feature_importance_model.max())

sorted_idx = np.argsort(feature_importance_model)
pos = np.arange(sorted_idx.shape[0]) + .5

featfig = plt.figure(figsize=(6, 15))
featfig.suptitle('Feature Importance')
featax = featfig.add_subplot(1, 1, 1)

featax.errorbar(x=feature_importance_train[sorted_idx], y=pos, xerr = feature_importance_train_error[sorted_idx], linestyle='none', marker='.', label = 'Train')
featax.errorbar(x=feature_importance_test[sorted_idx], y=pos, xerr = feature_importance_test_error[sorted_idx],linestyle='none', marker='.', label = 'Test')
featax.errorbar(x=feature_importance_model[sorted_idx], y=pos, linestyle='none', marker='.', label = 'Model')

featax.set_yticks(pos)
featax.set_yticklabels(np.array(features)[sorted_idx], fontsize=8)
featax.set_xlabel(eval_metric + ' change')
featlgd = featax.legend(loc=0)  

Поскольку вы можете выбрать свою метрику оценки, вы можете выбрать ту, которая более или менее чувствительна к выбросам.

...