Важность функции с помощью scikit-learn Random Forest показывает очень высокое стандартное отклонение

13

Я использую scikit-learn Random Forest Classifier и хочу показать важность функции, как в этом примере .

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

особенность важности

Возможно ли иметь такое поведение, или я делаю какие-то ошибки при подготовке этого?

Мой код следующий:

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestClassifier

clf = RandomForestClassifier()
clf.fit(predictors.values, outcome.values.ravel())

importance = clf.feature_importances_
importance = pd.DataFrame(importance, index=predictors.columns, 
                          columns=["Importance"])

importance["Std"] = np.std([tree.feature_importances_
                            for tree in clf.estimators_], axis=0)

x = range(importance.shape[0])
y = importance.ix[:, 0]
yerr = importance.ix[:, 1]

plt.bar(x, y, yerr=yerr, align="center")

plt.show()
GC5
источник
IIUC, predictorsвозвращает объект, на numpy arrayкоторый вы ссылаетесь, по pandas Dataframeстолбцам, что неверно, так как numpy arraysне имеет атрибута columns.
Никил Мавели
Извините, это была опечатка в коде. предикторы и результат два pandas DataFrameс формой m x nи m x 1. Это должно быть ясно сейчас.
gc5
2
Я сталкивался с такими же выводами некоторое время назад. Возможно, это связано с тем, что ряд функций важен, но поскольку функции могут быть высокими или низкими в дереве решений (поскольку при выполнении разбиения предлагается только случайное подмножество), их важность сильно варьируется от дерева к дерево, что приводит к высокому стандартному отклонению.
Арчи
Отличный пост, я столкнулся с такой же проблемой, как вы можете видеть на картинке. Существует пакет, tsfreshкоторый помог мне определить соответствующие функции и сократить мои функции с 600+ до 400. ! [Мои лучшие 35 функций ] ( i.stack.imgur.com/0MROZ.png ) Даже при этом алгоритм работает хорошо для меня. У меня есть бинарная классификация, успех / неудача. У меня практически нет ложных успехов, но я пропускаю значительный процент успеха. Все приведенные выше предположения кажутся разумными. Это может быть тот случай, когда должен быть больший набор для обучения и тестирования. У меня меньше
супергерой

Ответы:

3

Вы используете RandomForest с количеством деревьев по умолчанию, равным 10. Для 30 функций это слишком мало. Поэтому стандартное отклонение велико. Попробуйте хотя бы 100 или даже 1000 деревьев, как

clf = RandomForestClassifier(n_estimators=1000)

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

lanenok
источник
Извините, ланенок, количество деревьев не по умолчанию. Я поместил пример кода (и это верно для всех параметров, например min_samples_split), потому что я не могу раскрыть данные, над которыми я работаю. Однако это связано с количеством деревьев и другими параметрами, или я здесь ошибаюсь?
gc5
2

Ваш результат не так уж странен. Как утверждает lanenok , вы должны на первом шаге увеличить количество деревьев, чтобы убедиться, что вы получите «статистический» результат, касающийся важности объектов.

Тем не менее, как эта статья Genuer et al. (2010) показывает, что вы можете использовать стандартные отклонения для устранения особенностей. Процитирую: « Мы можем видеть, что стандартное отклонение истинных переменных велико по сравнению с шумовым переменным, близким к нулю ».

Арчи
источник
Использование стандартного отклонения в этом примере для устранения особенностей исключит все функции. xD
Хорхе Лейтао
Ха-ха, я не совсем уверен, я думаю, вы могли бы безопасно отказаться от функций в дальнем правом углу? В любом случае, главное, что я пытаюсь сделать, это то, что высокие стандартные отклонения не так уж странны, и что вы действительно можете использовать их в своей стратегии для устранения особенностей.
Арчи
1

Попробуй clf = RandomForestClassifier(max_features=None). Значение по max_featuresумолчанию для 'auto'которого эквивалентно sqrt(n_features). max_featuresописывается как «Количество функций, которые следует учитывать при поиске лучшего разделения». Только просмотр небольшого количества объектов в любой точке дерева решений означает, что важность одного объекта может сильно различаться для разных деревьев. Итак, не смотрите на случайное подмножество, просто посмотрите на все функции на каждом уровне дерева.

Jamis
источник
1
Обратите внимание, что это эквивалентно деревьям в простых мешках. «Случайный» в случайных лесах означает рассмотрение случайного подмножества объектов при каждом разделении, обычно sqrt(n_features)или log2(n_features). max_features=Noneбольше не рассматривает случайное подмножество функций. Я не уверен, влияет ли это на решение, предложенное выше. Одна из возможностей заключается в том, что многие функции просто имеют большое значение и поэтому сильно различаются по ансамблю деревьев. Или, может быть, не хватает сэмплов, поэтому к моменту попадания в лист учитывается не каждая особенность.
Джеймис
1

Общая причина этого заключается в том, что параметры, которые вы указали (или по умолчанию) RandomForestClassifier, не подходят для вашего набора данных.

Распространенным способом решения этой проблемы является поиск в гиперпараметре с использованием, например GridSearchCV:

from sklearn.model_selection import GridSearchCV
from sklearn.metrics import accuracy_score, make_scorer

param_grid = {'n_estimators': [10, 100, 1000], 'max_features': [5, 10, 20, 30]}
clf = GridSearchCV(RandomForestClassifier(), param_grid, cv=5, scoring=make_scorer(accuracy_score))

param_gridЗдесь представлены параметры, в которых вы хотите искать, и make_scorer(accuracy_score)мера, которую вы хотите оптимизировать.

Обратите внимание, что accuracy_scoreподходит для сбалансированных наборов, но не для несбалансированных наборов. Выберите подходящий показатель для вашей конкретной цели.

Хорхе Лейтао
источник
0

Там может быть несколько причин. Количество деревьев и глубина могут изменить ваши результаты. Если ваша модель не работает должным образом после выбора параметров (перекрестная проверка и т. Д.), Возможно, это связано с тем, что ваши функции не очень предсказуемы, поэтому они выбираются почти «случайным образом», что приводит к высоким стандартным отклонениям от дерева к дереву. Но есть и другие возможности, например, возможно, ваши функции сильно коррелированы. Немного больше информации будет полезно.

oW_
источник