XAI: 설명가능 인공지능
Q1. 모델 전체에서 중요한 요인은?
A1. FI(tree 기반), PFI(tree 외 알고리즘)Q2. 중요한 변수의 값이 변할 때 예측 값에 영향은?
A2. PDPQ3. 개별 데이터에서 어떤 feature 값이 예측값 영향을 끼친 정도
A3. SHAP (성능이 좋은 모델 > explainer 선언 > shap 값 추출 > 그래프)
pm을 하게 되면 변화관리에 주의
Q) 모델은 왜 그렇게 예측 했나요?
Q) 모델은 비즈니스 문제를 해결할 수 있을까요?
설명이 잘 되는 알고리즘은 대체로 성능이 낮다.
< 전체 데이터 관점 >
1. 모델 전체에서 어떤 feature가 중요할까? (FI, PFI)
2. 특정 feature 값의 변화에 따라 예측 값은 어떻게 달라질까? (PDP)
< 개별 데이터 관점 >
3. 이 데이터(분석단위)는 왜 그러한 결과로 예측되었을까? (SHAP)
성능 낮은 모델에선 의미 없음
예측값에 중요한 변수
트리기반 모델에서 뽑아낼 수 있음
트리모델 말고는 FI를 어떻게 구함?
Permutation Feature Importance로 구함• Permutation: 순서가 부여된 임의의 집합을 다른 순서로 뒤섞는 연산
• Feature 하나의 데이터를 무작위로 섞을 때, model의 score가 얼마나 감소되는 지로 계산원래 스코어 - (섞었을 때 스코어*여러번)의 평균 = 최종 변수 중요도
feature 순서 섞어서 predict했을 때 변화가 적다 = 어차피 영향이 없던거
변화가 크다 = 성능에 영향이 갈 정도로 중요하다⭐ 단점: 다중공선성이 있다면 score가 별 차이 없음
from sklearn.inspection import permutation_importance
pfi = permutation_importance(model,x_val,y_val,n_repeats=10,random_state=2023)
다중공선성: 분산 팽창 지수로 가려내야함
관심 feature의 값이 변할 때 모델에 미치는 영향을 시각화
x:관심 feature, y:예측값
Shapley Value: 모든 가능한 조합에서, 하나의 feature에 대한 평균 기여도를 계산한 값
기여도 : 조합에 대한 예측값 - (조합(-특정 피처))의 예측 값
위 기여도에 가중치를 곱하여, 각 조합의 기여도를 합침
= 가중 평균 기여도
1) Shapley Value 만들기
explainer1 = shap.TreeExplainer(model1)
shap_values1 = explainer1.shap_values(x_train)
+는 결과예측의 긍정요인, -는 결과예측의 부정요인
# y_train의 평균
explainer1.expected_value
shap.initjs() # javascript 시각화 라이브러리 --> colab에서는 모든 셀에 포함시켜야 함.
# force_plot(전체평균, shapley_values, input)
shap.force_plot(explainer1.expected_value, shap_values1[0, :], x_train.iloc[0,:])
예측값들의 평균은 base value (21.8)
0행의 예측값은 평균보다 작음, 그 값의 하락요인은 rm, dis, lstat 등이 화살표 범위(그래프의 폭)만큼 작용함(기여도), 숫자는 실제 데이터값
위 사진과 같은 의미!
전체 평균에 개별 데이터의 shap value를 다 더하면 그 행의 예측 값
shap 값이 그 차이에 대해 기여도를 계산한 것
분류문제면 shap value는 확률에 대한 기여도로 해석
하위 계층의 비율이 높은데 214 인덱스는 집값은 높다, 이유가 뭘까?
같은 case에 대한 의문
그래서 예측값에 대한 분석 (실제값은 23.7)
확실히 예측값에선 lstat이 하락 요인으로 꼽힘
범죄율, 오염도, 연식 등등이 상승 요인으로 꼽힘
상승요인 덕에 근처랑 lstat이 비슷해도 실제 집 값이 높을 수 있음.
(ex. 하위계층 비율이 높은 다른 지역에 비해 상대적으로 범죄율이나 공기오염도가 상대적으로 낮다~)
각각의 기여도 sum = 베이스 값-예측값
점 하나: 분석단위별 feature 기여도
변수 중요도로 치환해서 볼 수 있다.
rm은 양의기여도가 분포가 크고 음의기여도가 분포가 작다.
즉, rm값이 작을 때는 집값이 떨어질 때 크게 영향을 안줌
근데!!방의 수(rm)가 많으면!!집값 높이는데!!크게 영향을 줌!!!
1) 비즈니스 문제 상황 파악
2) 평가 전 질문
3) 문제 정의 및 평가
4) 평가 지표
5) 회귀 모델은?
0이라고 예측하면 거절할거임, 1이라고 예측하면 수익을 얻을 수 있음
따라서 -0.08은 1인데 0으로 예측함으로 얻을 수 있었던 수익을 못 얻는다는 가정하에 -임
0을 0으로 예측한건 그냥 모델이 잘 맞춰서 잘 피해간거니 +-0임
# 비즈니스 가치 매트릭스 정의
bv = np.array([[0,-0.18],[-0.08,0.08]])
# 모델 성적표 추출
cm1 = confusion_matrix(y_val,pred1)
cm1_p = cm1/np.sum(cm1)
# 기대가치 계산
np.sum(bv*cm1_p)*3200
함수화, scoring에 넣어주기
def biz_score(y, pred, biz_v):
cm = confusion_matrix(y, pred)
cm_p = cm / np.sum(cm)
amt_mean = 3200
return np.sum(biz_v * cm_p) * amt_mean
b_score = make_scorer(biz_score, greater_is_better= True, biz_v = bv )
.fit(): 전체 오차가 가장 적어지는 모델이라서 클래스 불균형이 있을 때 소수의 클래스를 잘 못 맞춰 recall이 떨어지는 현상이 발생
SMOTE: 보간법으로 upsamling 해줌
upsamling: 복원추출해서 upsamling 해줌