Если вы используете scikitlearn, вы можете легко сделать это, обратившись к свойству feature_importance_
встроенного RandomForestClassifier.Согласно SciKitLearn:
Относительный ранг (т. Е. Глубина) объекта, используемого в качестве узла принятия решения в дереве, может использоваться для оценки относительной важности этого объекта в отношении предсказуемости цели.переменная.Элементы, используемые в верхней части дерева, способствуют окончательному прогнозированию большей части входных выборок.Таким образом, ожидаемая доля образцов, в которые они вносят вклад, может использоваться в качестве оценки относительной важности признаков.Усредняя эти ожидаемые показатели активности по нескольким рандомизированным деревьям, можно уменьшить дисперсию такой оценки и использовать ее для выбора признаков.
Свойство feature_importance_
сохраняет среднюю глубину каждого объекта среди деревьев.,Вот пример.Давайте начнем с импорта необходимых библиотек.
# using this for some array manipulations
import numpy as np
# of course we're going to plot stuff!
import matplotlib.pyplot as plt
# dummy iris dataset
from sklearn.datasets import load_iris
#random forest classifier
from sklearn.ensemble import RandomForestClassifier
Как только они у нас появятся, мы собираемся загрузить фиктивный набор данных, определить модель классификации и подогнать данные к модели.
data = load_iris()
# we're gonna use 100 trees
forest = RandomForestClassifier(n_estimators = 100)
# fit data to model by passing features and labels
forest.fit(data.data, data.target)
Теперь мы можем использовать свойство важности объекта, чтобы получить оценку каждой функции, основываясь на том, насколько хорошо она может классифицировать данные по различным целям.
# find importances of each feature
importances = forest.feature_importances_
# find the standard dev of each feature to assess the spread
std = np.std([tree.feature_importances_ for tree in forest.estimators_],
axis=0)
# find sorting indices of importances (descending)
indices = np.argsort(importances)[::-1]
# Print the feature ranking
print("Feature ranking:")
for f in range(data.data.shape[1]):
print("%d. feature %d (%f)" % (f + 1, indices[f], importances[indices[f]]))
Ранжирование объектов: 1.функция 2 (0.441183) 2. функция 3 (0.416197) 3. функция 0 (0.112287) 4. функция 1 (0.030334)
Теперь мы можем отобразить важность каждой функции в виде гистограммы ирешить, стоит ли их всех оставить.Мы также строим графики ошибок для оценки значимости.
plt.figure()
plt.title("Feature importances")
plt.bar(range(data.data.shape[1]), importances[indices],
color="b", yerr=std[indices], align="center")
plt.xticks(range(data.data.shape[1]), indices)
plt.xlim([-1, data.data.shape[1]])
plt.show()
Гистограмма важности объектов