각각 특성을 모든 트리에 대해 평균불순도감소를 계산한 값으로 서로 관련이 있는 모든 특성들에 대한 전역적인(Global) 설명을 한다.
from xgboost import XGBClassifier
import seaborns as sns
model = XGBClassifier()
model.fit(X_train, y_train)
# 정렬과 시각화를 쉽게 하기 위해 series 전환
importances = pd.Series(model.feature_importances_, X_train.columns)
# 시각화
importances.sort_values()[-10:].plot.barh();
검증데이터에서 각 특성을 제거하지 않고 특성값에 무작위로 노이즈(e.g. shuffle, permutation)를 주어 성능을 측정하는 것으로 더욱 정확한 계산이 가능하다.
서로 관련이 있는 모든 특성들에 대한 전역적인(Global) 설명을 한다.
from eli5.sklearn import PermutationImportance
from xgboost import XGBClassifier
import eli5
import seaborns as sns
model = XGBClassifier()
model.fit(X_train, y_train)
# permuter 정의
permuter = PermutationImportance(
model,
scoring='accuracy',
n_iter=5,
random_state=2
)
permuter.fit(X_val, y_val);
feature_names = X_val.columns.tolist()
pd.Series(permuter.feature_importances_, feature_names).sort_values()
# 특성별 score 확인
eli5.show_weights(
permuter,
top=None,
feature_names=feature_names # list 형식
)
타겟과 관련이 있는 개별 특성들에 대한 전역적인 설명을 한다.
$ pip install pdpbox
# PDP for a single feature
from pdpbox.pdp import pdp_isolate, pdp_plot
feature = 'annual_inc'
isolated = pdp_isolate(
model=linear,
dataset=X_val,
model_features=X_val.columns,
feature=feature,
grid_type='percentile', # default='percentile', or 'equal'
num_grid_points=10 # default=10
)
pdp_plot(isolated, feature_name=feature);
# PDP Interact for two features with contour plot
from pdpbox.pdp import pdp_interact, pdp_interact_plot
features = ['annual_inc', 'fico_range_high']
interaction = pdp_interact(
model=boosting,
dataset=X_val_encoded,
model_features=X_val.columns,
features=features
)
pdp_interact_plot(interaction, plot_type='grid', feature_names=features);
# PDP 카테고리값 맵핑
feature = 'sex'
for item in encoder.mapping:
if item['col'] == feature:
feature_mapping = item['mapping'] # Series
feature_mapping = feature_mapping[feature_mapping.index.dropna()]
category_names = feature_mapping.index.tolist()
category_codes = feature_mapping.values.tolist()
pdp.pdp_plot(pdp_dist, feature)
plt.xticks(category_codes, category_names);
개별 관측치에 대한 지역적인(local) 설명을 한다.
import shap
model = XGBClassifier()
row = X_test.iloc[[10]]
explainer = shap.TreeExplainer(model)
row_processed = processor.transform(row)
shap_values = explainer.shap_values(row_processed)
shap.initjs()
shap.force_plot(
base_value=explainer.expected_value,
shap_values=shap_values,
features=row,
link='logit'
)