: 학습에 사용된 model이 무엇인지에 구애받지 않고 독립적으로 모델을 해석할 수 있다는 의미
서로 관련이 있는 모든 특성들에 대한 전역적인(Global) 설명
타겟과 관련이 있는 개별 특성들에 대한 전역적인 설명
개별 관측치에 대한 지역적인(local) 설명
앞으로 우린 예측모델의 결과를 해석하는 PDP, ShapV에 대해서 이야기 하겠다
!pip install pdpbox
!pip install shap
: 관심있는 특성들이 타겟에 어떻게 영향을 주는지 쉽게 파악
from pdpbox.pdp import pdp_isolate, pdp_plot
feature = 'annual_inc'
isolated = pdp_isolate(
model=boosting,
dataset=X_val_encoded,
model_features=X_val_encoded.columns,
feature=feature,
# grid point를 크게 주면 겹치는 점이 생겨 Number of unique grid points는 grid point 보다 작을 수 있습니다.
#num_grid_points=100
)
pdp_plot(isolated, feature_name=feature);
pdp_plot(isolated
, feature_name=feature
, plot_lines=True # ICE plots
, frac_to_plot=0.001 # or 10 (# 10000 val set * 0.001)# ICE곡선의 갯수(비율로)
, plot_pts_dist=True)
plt.xlim(20000,150000);
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);
import matplotlib.pyplot as plt
from pdpbox import pdp
feature = 'sex'
pdp_dist = pdp.pdp_isolate(model=rf dataset=X_encoded, model_features=features, feature=feature)
pdp.pdp_plot(pdp_dist, feature); # 인코딩된 sex 값을 확인할 수 있습니다
# encoder 맵핑을 확인합니다, {male:1, female:2} 로 인코딩 되어 있습니다
encoder.mapping
pdp.pdp_plot(pdp_dist, feature)
# xticks labels 설정을 인코딩된 코드리스트와, 카테고리 값 리스트를 넣어 수동으로 해보겠습니다.
plt.xticks([1, 2], ['male', 'female',]);
#y는 생존의 예측 값
features = ['sex', 'age']
interaction = pdp_interact(
model=rf,
dataset=X_encoded,
model_features=X_encoded.columns,
features=features
)
pdp_interact_plot(interaction, plot_type='grid', feature_names=features);
:특성들의 기여도(feature attribution)를 계산하기 위한 방법
: 변수들의 영향력을 그래프로 표현하는 것
row = X_test.iloc[[1]]
row
y_test.iloc[[1]]# 실제 값: 323000.0
model.predict(row) # 예측값:341878.50142523
import shap
explainer = shap.TreeExplainer(model) # 트리모델 shape value 계산 객체 지정
shap_values = explainer.shap_values(row) # Shap value 계산
shap_values
-------------------------------------------------------------
array([[ -26522.39096789, 33507.9223697 , -1347.04735052,
-189024.90759352]]
shap.initjs() # 자바스크립트 초기화
shap.force_plot(
base_value=explainer.expected_value,
shap_values=shap_values,
features=row
)
shap.initjs()
shap_values = explainer.shap_values(X_test.iloc[:100])
shap.force_plot(explainer.expected_value, shap_values, X_test.iloc[:100])
shap_values = explainer.shap_values(X_test)
shap.summary_plot(shap_values, X_test)
shap.summary_plot(shap_values, X_test.iloc[:300], plot_type="violin")
영향력의 고저를 판단하는 기준
shap.summary_plot(shap_values, X_test, plot_type="bar")
가장 영향력이 큰 특성:lat