У меня есть задача классификации с временными рядами в качестве входных данных, где каждый атрибут (n = 23) представляет определенный момент времени. Помимо абсолютного результата классификации, хотелось бы узнать, какие атрибуты / даты в какой степени влияют на результат. Поэтому я просто использую тот feature_importances_
, который мне подходит.
Однако я хотел бы знать, как они рассчитываются и какая мера / алгоритм используется. К сожалению, мне не удалось найти никакой документации по этой теме.
scikit-learn
random-forest
feature-selection
user2244670
источник
источник
Ответы:
На самом деле есть несколько способов добиться «важности» функций. Как правило, нет единого мнения о том, что означает это слово.
В scikit-learn мы реализуем важность, как описано в [1] (часто цитируется, но, к сожалению, редко читается ...). Иногда его называют «важность Джини» или «среднее уменьшение примесей» и определяют как общее уменьшение примесей в узле (взвешенное по вероятности достижения этого узла (которая аппроксимируется долей выборок, достигших этого узла)), усредненное по всем деревья ансамбля.
В литературе или в некоторых других пакетах вы также можете найти значения функций, реализованные как «среднее уменьшение точности». По сути, идея состоит в том, чтобы измерить снижение точности данных OOB, когда вы случайным образом переставляете значения для этой функции. Если снижение небольшое, то характеристика не важна, и наоборот.
(Обратите внимание, что оба алгоритма доступны в пакете randomForest R.)
[1]: Брейман, Фридман, «Деревья классификации и регрессии», 1984.
источник
tree_.compute_feature_importances(normalize=False)
.Обычный способ вычисления значений важности функции для одного дерева следующий:
вы инициализируете массив
feature_importances
всех нулей размеромn_features
.вы перемещаетесь по дереву: для каждого внутреннего узла, который разбивается на объект,
i
вы вычисляете уменьшение ошибок этого узла, умноженное на количество выборок, которые были направлены на узел, и добавляете это количество кfeature_importances[i]
.Уменьшение ошибки зависит от критерия примеси, который вы используете (например, Джини, Энтропия, MSE, ...). Это примесь набора примеров, который направляется на внутренний узел, за вычетом суммы примесей двух разделов, созданных в результате разделения.
Важно, чтобы эти значения относились к определенному набору данных (как уменьшение ошибок, так и количество выборок зависят от набора данных), поэтому эти значения нельзя сравнивать между разными наборами данных.
Насколько мне известно, существуют альтернативные способы вычисления значений важности функций в деревьях решений. Краткое описание вышеуказанного метода можно найти в «Элементах статистического обучения» Тревора Хасти, Роберта Тибширани и Джерома Фридмана.
источник
Это соотношение между количеством выборок, направленных на узел принятия решения, включающий эту функцию в любом из деревьев ансамбля, к общему количеству выборок в обучающем наборе.
Функции, которые задействованы в узлах верхнего уровня деревьев решений, имеют тенденцию видеть больше выборок, поэтому, вероятно, имеют большее значение.
Изменить : это описание верно только частично: ответы Жиля и Питера - правильный ответ.
источник
Как отметил @GillesLouppe выше, scikit-learn в настоящее время реализует метрику «среднего уменьшения примесей» для важности функций. Я лично считаю, что второй показатель немного более интересен, когда вы случайным образом переставляете значения для каждой из ваших функций одно за другим и видите, насколько хуже ваша производительность вне сумки.
Поскольку то, что вам нужно для важности функции, - это то, насколько каждая функция вносит вклад в прогнозирующую производительность вашей общей модели, вторая метрика фактически дает вам прямую оценку этого, тогда как «среднее уменьшение примесей» является просто хорошим показателем.
Если вам интересно, я написал небольшой пакет, который реализует метрику важности перестановки и может использоваться для вычисления значений из экземпляра класса случайного леса scikit-learn:
https://github.com/pjh2011/rf_perm_feat_import
Изменить: это работает для Python 2.7, а не 3
источник
Позвольте мне попытаться ответить на вопрос. код:
solution_tree plot:
введите описание изображения здесь
Мы можем получить compute_feature_importance: [0. , 0.01333333,0.06405596,0.92261071]
Проверить исходный код:
Попробуйте рассчитать важность функции:
Получаем feature_importance: np.array ([0,1.332,6.418,92.30]).
После нормализации мы можем получить массив ([0., 0.01331334, 0.06414793, 0.92253873]), это то же самое, что
clf.feature_importances_
.Будьте осторожны, все классы должны иметь вес один.
источник
Для тех, кто ищет ссылку на документацию scikit-learn по этой теме или ссылку на ответ @GillesLouppe:
В RandomForestClassifier
estimators_
атрибутом является список DecisionTreeClassifier (как указано в документации ). Чтобы вычислитьfeature_importances_
для RandomForestClassifier, в исходном коде scikit-learn , он усредняет по всем оценкам (всем DecisionTreeClassifer)feature_importances_
атрибутам в ансамбле.В документации DecisionTreeClassifer упоминается, что «Важность функции вычисляется как (нормализованное) общее сокращение критерия, создаваемого этой функцией. Это также известно как важность Джини [1]».
Вот прямая ссылка для получения дополнительной информации о переменной и важности Джини, как указано в ссылке scikit-learn ниже.
[1] Л. Брейман и А. Катлер, «Случайные леса», http://www.stat.berkeley.edu/~breiman/RandomForests/cc_home.htm
источник