Я использую 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()
predictors
возвращает объект, наnumpy array
который вы ссылаетесь, поpandas Dataframe
столбцам, что неверно, так какnumpy arrays
не имеет атрибутаcolumns
.pandas DataFrame
с формойm x n
иm x 1
. Это должно быть ясно сейчас.tsfresh
который помог мне определить соответствующие функции и сократить мои функции с 600+ до 400. ! [Мои лучшие 35 функций ] ( i.stack.imgur.com/0MROZ.png ) Даже при этом алгоритм работает хорошо для меня. У меня есть бинарная классификация, успех / неудача. У меня практически нет ложных успехов, но я пропускаю значительный процент успеха. Все приведенные выше предположения кажутся разумными. Это может быть тот случай, когда должен быть больший набор для обучения и тестирования. У меня меньшеОтветы:
Вы используете RandomForest с количеством деревьев по умолчанию, равным 10. Для 30 функций это слишком мало. Поэтому стандартное отклонение велико. Попробуйте хотя бы 100 или даже 1000 деревьев, как
Для более точного анализа вы также можете проверить, насколько велика корреляция между вашими функциями.
источник
min_samples_split
), потому что я не могу раскрыть данные, над которыми я работаю. Однако это связано с количеством деревьев и другими параметрами, или я здесь ошибаюсь?Ваш результат не так уж странен. Как утверждает lanenok , вы должны на первом шаге увеличить количество деревьев, чтобы убедиться, что вы получите «статистический» результат, касающийся важности объектов.
Тем не менее, как эта статья Genuer et al. (2010) показывает, что вы можете использовать стандартные отклонения для устранения особенностей. Процитирую: « Мы можем видеть, что стандартное отклонение истинных переменных велико по сравнению с шумовым переменным, близким к нулю ».
источник
Попробуй
clf = RandomForestClassifier(max_features=None)
. Значение поmax_features
умолчанию для'auto'
которого эквивалентноsqrt(n_features)
.max_features
описывается как «Количество функций, которые следует учитывать при поиске лучшего разделения». Только просмотр небольшого количества объектов в любой точке дерева решений означает, что важность одного объекта может сильно различаться для разных деревьев. Итак, не смотрите на случайное подмножество, просто посмотрите на все функции на каждом уровне дерева.источник
sqrt(n_features)
илиlog2(n_features)
.max_features=None
больше не рассматривает случайное подмножество функций. Я не уверен, влияет ли это на решение, предложенное выше. Одна из возможностей заключается в том, что многие функции просто имеют большое значение и поэтому сильно различаются по ансамблю деревьев. Или, может быть, не хватает сэмплов, поэтому к моменту попадания в лист учитывается не каждая особенность.Общая причина этого заключается в том, что параметры, которые вы указали (или по умолчанию)
RandomForestClassifier
, не подходят для вашего набора данных.Распространенным способом решения этой проблемы является поиск в гиперпараметре с использованием, например
GridSearchCV
:param_grid
Здесь представлены параметры, в которых вы хотите искать, иmake_scorer(accuracy_score)
мера, которую вы хотите оптимизировать.Обратите внимание, что
accuracy_score
подходит для сбалансированных наборов, но не для несбалансированных наборов. Выберите подходящий показатель для вашей конкретной цели.источник
Там может быть несколько причин. Количество деревьев и глубина могут изменить ваши результаты. Если ваша модель не работает должным образом после выбора параметров (перекрестная проверка и т. Д.), Возможно, это связано с тем, что ваши функции не очень предсказуемы, поэтому они выбираются почти «случайным образом», что приводит к высоким стандартным отклонениям от дерева к дереву. Но есть и другие возможности, например, возможно, ваши функции сильно коррелированы. Немного больше информации будет полезно.
источник