[머신러닝]

microbiome data 에서 explainable AI 의 사용 (SHAP)

" " 2023. 9. 4. 21:24

오늘은 마이크로바이옴 데이터를 머신러닝 모델에 적용한 논문을 가져왔습니다. 간단하게 리뷰해 보겠습니다.
 


Explainable AI reveals changes in skin microbiome composition linked to phenotypic differences

 
 
위 논문에서 강조하는 것은 제목에도 나와있듯이 Explainable AI (이하, XAI)를 사용했다는 것입니다. XAI 란, 말 그대로 설명가능한 인공지능 이란 뜻으로, 머신러닝의 특징 중 하나인 블랙박스 모델에서 벗어나 모델이 결론을 도출하는 과정을 사람이 이해할 수 있도록 하는 것을 말합니다.
 
 
머신러닝은 기본적으로 엄청나게 많은 양의 데이터 속에서 사람이 보지 못하는 인사이트를 도출해 내는 것에 강점이 있습니다. 위 논문에서의 데이터로 예를 들면, 스킨 마이크로바이옴 데이터를 4가지 표현형에 대해 라벨링 한 후 (나이, 피부의 수분량, 폐경기, 흡연 여부) 머신러닝을 학습시켜 라벨링 되지 않은 데이터에 대해 표현형을 예측하게 되는데, 사람은 머신러닝 모델이 결론을 내리기까지 어떤 과정을 거쳤는지, 어떤 feature 가 중요하게 작용했는지 등을 알지 못한다는 것입니다.
 
 
그러므로, XAI를 사용하여 사람에게 예측 결과에 대한 설명을 함께 함으로써 사람은 이 머신러닝 모델에 어떤 부적절한 bias, noise 등이 영향을 주지는 않았는지 확인 가능함과 동시에 결과에 대한 더 나은 이해가 가능해집니다.
 

XAI 의 필요성

 
머신러닝 알고리즘 중에서, 이런 XAI의 특성을 가지고 있는 것에는 대표적으로 의사결정나무 알고리즘이 있습니다.
 

 
위와 같은 그림이 의사결정나무 알고리즘의 예시인데, 한눈에 봐도 직관적이고 어떤 과정을 통해서 결론이 도출되었는지를 쉽게 확인할 수 있습니다. 따라서 위 논문에서도 의사결정나무 알고리즘을 기반으로 하는 RF, XGBoost, LightGBM 등 3가지 알고리즘에 SHapley Additive exPlanations (이하, SHAP)를 더해서 결과에 대한 설명을 할 수 있는 모델을 만들었습니다.
 
 

SHAP 예시

SHAP는 게임이론을 바탕으로, 각 feature 가 결괏값에 기여한 정도를 계산합니다. 위의 예시를 보면 기본 아이디어에 대해서는 쉽게 이해할 수 있습니다. 총개의 feature 가 있는데 (y 절편 포함) 각 feature 가 기여하는 정도를 계산합니다. 예를 들어, parch라는 feature의 값으로 0 을 넣음으로써, -0.003 만큼 기여하게 됩니다. age feature 의 경우에는 8을 넣음으로써 0.27이라는 많은 상대적으로 많은 기여를 한 것을 계산하여, 위 예측에서는 나이가 중요하게 작용했다는 것을 직관적으로 확인할 수 있습니다.
 
 

 
해당 논문의 결과 피규어는 위와 같은 형식으로 되어있습니다. 이것이 SHAP를 수행했을 때 확인할 수 있는 결과 피규어이고, b) AGE - RF에 대해 간단하게 보겠습니다.
 
모델은 random forest를 사용했고 표현형 중 나이를 예측하기 위해 중요하게 작용했던 feature를 위에서부터 확인할 수 있습니다. 가장 먼저 Alloprevotella 가 Younger age에서 더 많이 나타나고 Older age 에서 더 적게 나타나는데 그 정도가 가장 큰 것을 확인할 수 있어 가장 많이 기여하고 있다고 볼 수 있습니다.
 
어떻게 보면 differential abundance 분석을 진행한 것과 비슷한 형식의 결과를 확인할 수 있습니다. 그러나 위의 결과는 머신러닝 모델을 학습시켜 예측한 것이므로 통계적인 분석을 통해 수행되는 ALDEX2, LEfse 등과는 완전히 다른 것입니다.
 
 

import xgboost
import shap

# train an XGBoost model
X, y = shap.datasets.boston()
model = xgboost.XGBRegressor().fit(X, y)

# explain the model's predictions using SHAP
# (same syntax works for LightGBM, CatBoost, scikit-learn, transformers, Spark, etc.)
explainer = shap.Explainer(model)
shap_values = explainer(X)

# visualize the first prediction's explanation
shap.plots.waterfall(shap_values[0])

 
실제 SHAP 구동하는 간단한 예시 코드입니다. 기본적으로 사용할 알고리즘을 import 하여 모델을 fitting 하는 것은 똑같고 학습한 모델을 explainer에 넣어주면 간단하게 시각화까지 할 수 있는 것 같습니다. sklearn에서도 동일한 문법을 사용하면 가능하다고 하니 기본적인 부분을 수행해 보는 것은 어렵지 않게 해 볼 수 있을 것 같습니다. 
 

 
위의 코드를 실행한 결과이고 역시 직관적인 결과를 확인할 수 있습니다. 
 
 
 
 
# reference
1) Carrieri, Anna Paola, et al. "Explainable AI reveals changes in skin microbiome composition linked to phenotypic differences." Scientific reports 11.1 (2021): 4565.
 
2) https://github.com/shap/shap
 
3) https://ema.drwhy.ai/shapley.html