XGBoost의 변수 중요도를 변수 이름을 유지하고 그래프화하고 싶다! !

도전



XGBoost는 변수 중요도를 보여 주어 편리합니다만 변수명이 'f0'라든지 적당한 값이 되어 버린다!
거기서 어떻게든 datafrme의 column명 그대로 표시해 주는 방법은 없는가! 라고 찾아 보았습니다.
※matplotlib 주위의 사용법으로 곤란하고 있으므로 조언해 주세요!

현재 상태



먼저 xgboost의 변수 심각도 그래프는 다음과 같이 표시됩니다.
#clfはfit済みのモデル
xgb.plot_importance(clf)



이제 ↑의 이미지 용으로 표시됩니다. 분명히 말하십시오.

어느 것이 뭐야! !

라고 간지입니다.

그래서 검색을 시작한 곳
Xgboost의 to_graphviz 메소드에서 변수 이름 표시 @hand10ryo 2018년 06월 29일에 작성.
( @ 밥 d10 료 씨 감사합니다!)
plot_importanceには変数名をkey、そのfeature_importanceをvalueにもつ辞書を渡せば
"f1"などと表示されてしまう問題は解決できた

라고 썼습니다.

입니다. 생각해 보았습니다.

회답(※간결한 것도 추가했으므로 추기 참조)


#dfは元データフレーム
#clfは訓練済みモデル

features =df.columns[df.any()]
fscore = clf.feature_importances_   
plt.figure(figsize=(10,10))
plt.barh(features,fscore)

이제 가로축 그래프를 낼 수 있습니다.



그러나 이것이라면 그래프가 정렬되지 않았습니다.

그래서 (features : fscore)의 사전을 만들려고 다음과 같은 것을 생각했습니다.
dict={}
for f,s in zip(features,fscore):
    dict[f]=s
dict=sorted(dict.items(), key=lambda x: -x[1])


이제 value에서 정렬된 사전을 만들었습니다.
그러나, 사전의 아직도 잘 plt.barh()에 돌진할 수 없었기 때문에…
features=[]
fscore=[]
for (k,v) in dict:
    features[i]=k
    fscore[i]=v

plt.barh(range(len(features)), fscore, tick_label=features, align="center")
plt.show()

이제 아래에서 큰 순서로 채워지는 그래프를 할 수 있습니다.



※matplotlib로 내림차순으로 하는 방법을 모르기 때문에 알고 있는 분은 코멘트등으로 가르쳐 주세요!

@ 밥 d10 료 씨의 코멘트에 의해 개선 (2018/09/12 갱신)



모델의 fit이 끝난 단계에서 다음과 같은 조작에 의해, 중요도의 내림차순으로 표시해 주는 것 같습니다.
@ 밥 d10 료 씨 거듭 감사합니다!
features =df.columns[df.any()]
mapper = {'f{0}'.format(i): v for i, v in enumerate(features)}
mapped = {mapper[k]: v for k, v in clf._Booster.get_fscore().items()}
xgb.plot_importance(mapped)

좋은 웹페이지 즐겨찾기