def _get_xgb_feat_importances(self, clf):
try:
# Handles case when clf has been created by calling
# xgb.XGBClassifier.fit() or xgb.XGBRegressor().fit()
fscore = clf.booster().get_fscore()
except:
# Handles case when clf has been created by calling xgb.train.
# Thus, clf is an instance of xgb.Booster.
fscore = clf.get_fscore()
trained_feature_names = self._get_trained_feature_names()
feat_importances = []
# Somewhat annoying. XGBoost only returns importances for the features it finds useful.
# So we have to go in, get the index of the feature from the "feature name" by removing the f before the feature name, and grabbing the rest of that string, which is actually the index of that feature name.
fscore_list = [[int(k[1:]), v] for k, v in fscore.items()]
feature_infos = []
sum_of_all_feature_importances = 0.0
for idx_and_result in fscore_list:
idx = idx_and_result[0]
# Use the index that we grabbed above to find the human-readable feature name
feature_name = trained_feature_names[idx]
feat_importance = idx_and_result[1]
# If we sum up all the feature importances and then divide by that sum, we will be able to have each feature importance as it's relative feature imoprtance, and the sum of all of them will sum up to 1, just as it is in scikit-learn.
sum_of_all_feature_importances += feat_importance
feature_infos.append([feature_name, feat_importance])
sorted_feature_infos = sorted(feature_infos, key=lambda x: x[1])
print('Here are the feature_importances from the tree-based model:')
print('The printed list will only contain at most the top 50 features.')
for feature in sorted_feature_infos[-50:]:
print(str(feature[0]) + ': ' + str(round(feature[1] / sum_of_all_feature_importances, 4)))
评论列表
文章目录