Как получить значение функции в xgboost?
Я использую xgboost для создания модели и пытаюсь найти важность каждой функции с помощью get_fscore()
, но она возвращает {}
и мой код поезда:
dtrain = xgb.DMatrix(X, label=Y)
watchlist = [(dtrain, 'train')]
param = {'max_depth': 6, 'learning_rate': 0.03}
num_round = 200
bst = xgb.train(param, dtrain, num_round, watchlist)
Так есть ли какая-то ошибка в моем поезде? Как получить значение функции в xgboost?
Ответы
Ответ 1
В своем коде вы можете получить важность для каждой функции в форме подсказки:
bst.get_score(importance_type='gain')
>>{'ftr_col1': 77.21064539577829,
'ftr_col2': 10.28690566363971,
'ftr_col3': 24.225014841466294,
'ftr_col4': 11.234086283060112}
Объяснение: Метод API train() get_score() определен как:
get_score (fmap = '', priority_type = 'weight')
- fmap (str (необязательно)) - имя файла карты объектов.
- importance_type
-
‘Вес - количество раз, которое функция используется для разделения данных по всем деревьям.
- ‘Усиление - среднее усиление по всем разделениям, в которых используется эта функция.
- ‘Покрытие - среднее покрытие по всем разделениям, в которых используется эта функция.
- ‘Total_gain - общее усиление по всем разделениям, в которых используется эта функция.
- Total_cover - общее покрытие по всем разделениям, в которых используется объект.
https://xgboost.readthedocs.io/en/latest/python/python_api.html
Ответ 2
Использование sklearn API и XGBoost> = 0.81:
clf.get_booster().get_score(importance_type="gain")
или
regr.get_booster().get_score(importance_type="gain")
Чтобы это работало правильно, при вызове regr.fit
(или clf.fit
) X
должен быть pandas.DataFrame
.
Ответ 3
Попробуйте это
fscore = clf.best_estimator_.booster().get_fscore()
Ответ 4
Я не знаю, как получить значения, конечно, но есть хороший способ определения важности функций:
model = xgb.train(params, d_train, 1000, watchlist)
fig, ax = plt.subplots(figsize=(12,18))
xgb.plot_importance(model, max_num_features=50, height=0.8, ax=ax)
plt.show()
Ответ 5
Для важности функции. Попробуйте следующее:
Классификация:
pd.DataFrame(bst.get_fscore().items(), columns=['feature','importance']).sort_values('importance', ascending=False)
регрессия:
xgb.plot_importance(bst)
Ответ 6
Сначала соберите модель из XGboost
from xgboost import XGBClassifier, plot_importance
model = XGBClassifier()
model.fit(train, label)
это приведет к массиву. Таким образом, мы можем отсортировать его по убыванию
sorted_idx = np.argsort(model.feature_importances_)[::-1]
Затем пришло время распечатать все отсортированные значения и названия столбцов вместе в виде списков (я предполагаю, что данные загружены с помощью Pandas)
for index in sorted_idx:
print([train.columns[index], model.feature_importances_[index]])
Кроме того, мы можем построить график с помощью встроенной функции XGboost
plot_importance(model, max_num_features = 15)
pyplot.show()
используйте max_num_features
в plot_importance
, чтобы ограничить количество функций, если хотите.
Ответ 7
Для тех, кто сталкивается с этой проблемой при использовании xgb.XGBRegressor()
, обходной путь, который я использую, заключается в том, чтобы сохранить данные в pandas.DataFrame()
или numpy.array()
, а не для преобразования данных в dmatrix()
. Кроме того, я должен был убедиться, что параметр gamma
не указан для XGBRegressor.
fit = alg.fit(dtrain[ft_cols].values, dtrain['y'].values)
ft_weights = pd.DataFrame(fit.feature_importances_, columns=['weights'], index=ft_cols)
После установки регрессора fit.feature_importances_
возвращает массив весов, который, как я предполагаю, находится в том же порядке, что и столбцы функций pandas dataframe.
Моя текущая настройка - Ubuntu 16.04, Anaconda distro, python 3.6, xgboost 0.6 и sklearn 18.1.
Ответ 8
Получите таблицу, содержащую оценки и названия элементов, а затем подготовьте ее.
feature_important = model.get_score(importance_type='weight')
keys = list(feature_important.keys())
values = list(feature_important.values())
data = pd.DataFrame(data=values, index=keys, columns=["score"]).sort_values(by = "score", ascending=False)
data.plot(kind='barh')
Например:
![enter image description here]()
Ответ 9
print(model.feature_importances_)
plt.bar(range(len(model.feature_importances_)), model.feature_importances_)