Interpreting ML Model

Daum·2021년 6월 17일
0

Machine Learning

목록 보기
7/7
post-thumbnail

📝 Interpreting ML Model

1. Feature Importances

각각 특성을 모든 트리에 대해 평균불순도감소를 계산한 값으로 서로 관련이 있는 모든 특성들에 대한 전역적인(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();

2. Permutation Importances

검증데이터에서 각 특성을 제거하지 않고 특성값에 무작위로 노이즈(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 형식
    )

3. PDP(Partial Dependence Plots)

타겟과 관련이 있는 개별 특성들에 대한 전역적인 설명을 한다.

$ 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에서 카테고리 특성 사용(인코딩되기 전 카테고리값을 보여주기 위한 방법)

# 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);

4. SHAP

개별 관측치에 대한 지역적인(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'
    )

📝 Code Review

0개의 댓글