ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [XAI/Python] SHAP 파이썬 라이브러리 사용 코드 예시(SHapley Additive exPlanations)
    Data Science/데이터마이닝 2022. 7. 15. 21:18
    반응형

    0. SHAP란

    SHAP는 ML 모델의 예측 결과를 설명하기 위한 게임이론적 접근방식이다.

    XAI가 주목받는 요즘, 쉽게 접근 할 수 있으며 결과를 그래프로 볼 수 있는 SHAP에 대해서 포스팅한다.

    1. SHAP 설치

    # 주피터 노트북 안에서
    !pip install shap
    
    # 터미널에서
    pip install shap

    2. 사용 데이터 및 모델

    해당 포스팅에서는 회귀예측을 하기 위한 보스턴 주택 가격 데이터를 사용한다.

    예측모델로는 XGBoost 회귀모델을 사용한다.

     

    해당 데이터의 구성은 아래와 같다.

    컬럼 설명
    CRIM 타운 별 1인당 범죄율
    ZN 25,000 피트 이상 주거용 토지 비율
    INDUS 비소매 상업지역 점유 토지 비율
    CHAS 강 인접 유무(1 = 강과 인접, 0 = 강과 인접하지 않음)
    NOX 산화질소 농도
    RM 가구당 평균 방 수
    AGE 1940년 이전 건축 주택 비율
    DIS 5개 보스턴 직업센터 접근성 지수
    RAD 방사형 도로 접근성 지수
    TAX $10,000 당 재산세율
    PTRATIO 도시별 학생/교사 비율
    B 1000(Bk-0.63)^2 (Bk : 도시별 흑인 비율)
    LSTAT 모집단의 하위계층 비율(%)
    PRICES(Target) 본인 소유 주택가격(중앙값, 단위 : $1,000)

    데이터의 호출 및 모델 학습 코드는 아래와 같다.

    import pandas as pd
    import numpy as np
    from xgboost import XGBRegressor
    import shap
    
    # 데이터 호출
    X,y = shap.datasets.boston()
    
    # 기본 모델 생성 및 학습
    model = XGBRegressor().fit(X,y)

    3. SHAP 기능 들

    3.1 SHAP 준비

    ex = shap.Explainer(model)
    
    shap_v = ex(X)

    3.2 SHAP Waterfall Plot

    shap.plots.waterfall(shap_v[0])

    그래프의 Y축에서는 독립변수의 종류와 값을 확인 할 수 있다. 

    그래프의 X축은 예측 모델에서의 종속변수 값을 의미한다. 

    X축 하단의 E[f(x)]=22.533 이 의미하는 것은 base value로 종속변수의 평균을 의미한다.

    그래프 안의 컨텐츠들은 독립변수들의 SHAP value를 나타낸다.

    양의 값은 붉은색, 음의 값은 푸른색으로 표기되며,

    모든 독립변수의 SHAP value가 적용된 값이 상단에 표기된다. (f(x) = 26.648)

    각 독립변수의 영향을 시각적으로 쉽게 표현하고 있으며 직관적이다.

    shap.plots.waterfall(shap_v[1])

    첫번째와는 다르게 두번째 그래프에서는 독립변수 RM에 의해 음의 영향을 많이 받아 f(x)=22.248인 것을 확인 할 수 있다.

    3.3 SHAP Force Plot

    waterfall plot의 다른 버전으로 foce plot이 있다.

    shap.initjs() #JS를 이용해 그려진 다른 그래프가 있다면 초기화를 해주어야 한다.
    shap.plots.force(shap_v[0])

    특정 행을 넣지 않고 전체 넣게 되면 모든 데이터에 대한 force plot을 그릴 수 있다.

    shap.initjs()
    shap.plots.force(shap_v)

    그래프의 Y축과 X축에 위치한 드롭박스를 통해서 Y,X축의 값을 지정 할 수 있다.

    3.4 SHAP Scatter Plot

    Scatter plot은 특정 독립변수와 해당 값에 대한 SHAP Value에 대한 산점도를 시각화한다.

    X축은 선택된 독립변수를, Y축은 해당 값의 SHAP Value를 나타낸다.

    아래 그림에서는 독립변수 "RM"이 6이상의 값을 가질 때 SHAP Value가 증가함을 보이고있다.

    따라서 방의 개수가 6개 이상일 경우 집값에 양의 영향을 미치는 것을 확인 할 수 있다.

    shap.plots.scatter(shap_v[:,'RM'])

    color 파라미터를 추가하여서 또 다른 독립변수의 값을 점의 색으로 표현 할 수 있다.

    아래 그래프에서는 독립변수 "DIS"의 값에 따라서 점에 색이 입혀졌다.

    "RM" 값이 5 이하일 경우 모두 "DIS" 값이 낮은 경향을 보인다. → 방의 평균 개수가 5이하일 경우 직업센터 접근성도 낮다.

    "RM" 값이 6에 근사할 때 "DIS"값이 높으면 SHAP Value가 낮은 경향을 보인다. → 방의 평균 개수가 6에 근사할 때는 직업센터 접근성이 높으면 집의 가격에 음의 영향을 미치는 경향이 있다.

    shap.plots.scatter(shap_v[:,'RM'],color=shap_v[:,'DIS'])

    color 파라미터에 특정 독립변수를 정하지 않고 넣을 경우 한가지가 추천되어 시각화 된다.

    아래의 그림에서는 "RAD"가 선택되어 시각화 되었다.

    "RM" 값이 6에 근사할 때 "RAD"값이 낮으면 SHAP Value가 낮은 경향을 보인다. → 방의 평균 개수가 6에 근사할 때는 방사형 도로 접근성이 낮으면 집의 가격에 음의 영향을 미치는 경향이 있다.

    shap.plots.scatter(shap_v[:,'RM'],color=shap_v)

    3.5 SHAP Beeswarm Plot

    Beeswarm plot은 독립변수들의 SHAP Value의 분포를 나타낸다.

    shap.plots.beeswarm(shap_v)

    3.6 SHAP Bar Plot

    각 독립변수의 SAHP Value 절대값의 평균을 막대그래프로 나타낸다.

    shap.plots.bar(shap_v)

    4. 타 XAI와 비교

    모델에서 독립변수의 영향도 등을 분석하는데 자주 등장하는 것으로는 feature importance가 있다.

    4.1 Feature Importance

    아래의 코드를 통해서 feature importance를 뽑아내고 시각화 할 수 있다.

    독립변수 별 가중치의 비율은 조금 다르나 순서는 "LSTAT", "RM", "PTRATIO"로 비슷함을 확인 할 수 있다.

    import seaborn as sns
    
    fi_df = pd.DataFrame({
        'f':X.columns,
        'fi':model.feature_importances_
    })
    fi_df.sort_values('fi', ascending=False, inplace=True)
    sns.barplot(x='fi',y='f',data=fi_df)

    4.2 Permutation Importance

    아래의 코드를 통해 permutation importance를 계산 할 수 있다.

    독립변수 별  순서는 "LSTAT", "RM", "DIS"이며 "PTRATIO"가 여섯번째에 위치하고 있다.

    import eli5
    from eli5.sklearn import PermutationImportance
    
    pfi_model = PermutationImportance(xgb_model, scoring='r2', random_state=7)
    pfi_model.fit(X, y)
    
    eli5.show_weights(pfi_model, feature_names = X.columns.tolist())

    5. 참고문헌

    https://shap.readthedocs.io/en/latest/api.html#explainers

    https://moondol-ai.tistory.com/378

    https://zzinnam.tistory.com/entry/SHAP-value에-대한-간단한-소개with-Python

    https://velog.io/@rsj9987/TIL-21.06.24-feature-importance

    https://hong-yp-ml-records.tistory.com/51

    반응형

    댓글

Designed by Tistory.