Model Explainability¶
머신 러닝 모델은 훈련 과정에서 입력과 출력 간의 관계를 미리 명시적으로 설명하지 않고 추론합니다. 이를 통해 ML 기법은 특히 특정 결과의 인과관계가 복잡하거나 불분명하지만 결과 모델이 블랙박스와 같은 역할을 하는 경우, 많은 변수가 포함된 복잡한 시나리오를 광범위한 설정 없이 처리할 수 있습니다. 모델이 성능이 저조한 경우 그 이유와 더 나아가 성능을 개선하는 방법을 파악하기 어려울 수 있습니다. 블랙박스 모델은 암시적인 편견을 감출 수도 있고, 의사 결정에 대한 명확한 이유를 확립하지 못할 수도 있습니다. 금융 및 의료와 같이 신뢰할 수 있는 시스템에 대한 규제가 있는 산업에서는 모델이 올바른 이유로 올바른 결과를 산출하고 있다는 더 강력한 증거가 필요할 수 있습니다.
이러한 문제를 해결하기 위해 Snowflake Model Registry에는 Shapley 값 에 기반한 설명 가능성 함수가 포함되어 있습니다. Shapley 값은 머신 러닝 모델의 출력을 입력 기능에 따라 특성화하는 방법입니다. Shapley 값은 모든 가능한 특성 조합을 고려하여 모델 예측에 대한 각 특성의 평균적인 한계 기여도를 측정합니다. 이 접근법은 중요도 특성 부여의 공정성을 보장하고 복잡한 모델을 이해하기 위한 탄탄한 토대를 제공합니다. Shapley 값에서 얻은 인사이트는 계산 집약적이지만, 모델 해석 가능성 및 디버깅에 매우 유용합니다.
예를 들어, 집의 크기, 위치, 침실 수, 반려동물 허용 여부에 대해 훈련된 집의 가격을 예측하는 모델이 있다고 가정해 보겠습니다. 이 예제에서 주택의 평균 가격은 10만 달러이며, 모델의 최종 예측은 2000평방피트, 해변가, 침실 3개, 반려동물을 허용하지 않는 주택의 경우 25만 달러였습니다. 다음 테이블에 표시된 대로 이러한 각 특징 값은 최종 모델 예측에 영향을 미칠 수 있습니다.
Feature |
값 |
기여 vs. 평균 주택 |
---|---|---|
크기 |
2000 |
+$50,000 |
location |
해변가 |
+$75,000 |
침실 |
3 |
+$50,000 |
반려동물 |
아니요 |
-$25,000 |
이러한 기여도를 종합해 보면, 이 특정 주택의 가격이 평균 주택보다 15만 달러 더 비싼 이유를 설명할 수 있습니다. Shapley 값은 최종 결과에 긍정적으로 또는 부정적으로 영향을 미쳐 평균과 비교하여 결과의 차이를 더할 수 있습니다. 이 예제에서 반려동물을 키울 수 없는 집에서 사는 것은 바람직하지 않으므로 해당 특성 값의 기여도는 -$25,000입니다.
평균값은 전체 데이터 세트의 대표 샘플인 배경 데이터를 사용하여 계산됩니다. 자세한 내용은 배경 데이터를 사용한 모델 로깅 섹션을 참조하십시오.
지원되는 모델 유형¶
이 미리 보기 릴리스에서 지원하는 Python 기본 모델 패키지는 다음과 같습니다.
XGBoost
CatBoost
LightGBM
scikit-learn
다음 snowflake.ml.modeling
의 Snowpark ML 모델링 클래스가 지원됩니다.
XGBoost
LightGBM
Scikit-learn(파이프라인 모델 제외)
설명 기능은 Snowpark ML 1.6.2 이상을 사용하여 로깅한 위 모델에서 기본적으로 사용할 수 있습니다. 구현에서는 SHAP 라이브러리 를 사용합니다.
배경 데이터를 사용한 모델 로깅¶
일반적으로 대표 데이터의 샘플인 배경 데이터는 Shapley 값 기반 설명의 중요한 요소입니다. 배경 데이터는 Shapley 알고리즘에 개별 설명을 비교할 수 있는 “평균” 입력이 어떤 것인지에 대한 아이디어를 제공합니다.
Shapley 값은 입력 특징을 체계적으로 교란하고 이를 배경 데이터로 대체하여 계산합니다. 배경 데이터와의 편차를 보고하기 때문에 여러 데이터 세트의 Shapley 값을 비교할 때는 일관적인 배경 데이터를 사용하는 것이 중요합니다.
일부 트리 기반 모델은 훈련 중에 구조 내에 배경 데이터를 암시적으로 인코딩하며, 명시적인 배경 데이터가 필요하지 않을 수 있습니다. 그러나 대부분의 모델은 유용한 설명을 위해 별도로 배경 데이터를 제공해야 하며, 모든 모델(트리 기반 모델 포함)은 배경 데이터를 제공하면 더 정확하게 설명할 수 있습니다.
모델을 로깅할 때 아래와 같이 sample_input_data
매개 변수를 전달하여 최대 1,000행의 백그라운드 데이터를 제공할 수 있습니다.
참고
모델이 Shapley 값을 계산하기 위해 명시적인 배경 데이터가 필요한 유형인 경우 이 데이터가 없으면 설명 가능성을 활성화할 수 없습니다.
mv = reg.log_model(
catboost_model,
model_name="diamond_catboost_explain_enabled",
version_name="explain_v0",
conda_dependencies=["snowflake-ml-python"],
sample_input_data = xs, # xs will be used as background data
)
아래에 표시된 대로, 모델을 기록하는 동안 서명을 사용하여 배경 데이터를 제공할 수도 있습니다.
mv = reg.log_model(
catboost_model,
model_name="diamond_catboost_explain_enabled",
version_name="explain_v0",
conda_dependencies=["snowflake-ml-python"],
signatures={"predict": predict_signature, "predict_proba": predict_proba_signature},
sample_input_data = xs, # xs will be used as background data
options= {"enable_explainability": True} # you will need to set this flag in order to pass both signatures and background data
)
설명 가능성 값 검색하기¶
설명 가능성이 있는 모델에는 모델의 특징에 대한 Shapley 값을 반환하는 이름이 explain
인 메서드가 있습니다.
Shapley 값은 특정 입력으로부터 만들어진 예측에 대한 설명이므로, 설명할 예측을 생성하려면 입력 데이터를 explain
에 전달해야 합니다.
Snowflake 모델 버전 오브젝트에는 explain
메서드가 있으며, Python에서는 ModelVersion.run
을 사용하여 호출합니다.
reg = Registry(...)
mv = reg.get_model("Explainable_Catboost_Model").default
explanations = mv.run(input_data, function_name="explain")
다음은 SQL로 설명을 검색하는 예제입니다.
WITH MV_ALIAS AS MODEL DATABASE.SCHEMA.DIAMOND_CATBOOST_MODEL VERSION EXPLAIN_V0
SELECT *,
FROM DATABASE.SCHEMA.DIAMOND_DATA,
TABLE(MV_ALIAS!EXPLAIN(CUT, COLOR, CLARITY, CARAT, DEPTH, TABLE_PCT, X, Y, Z));
중요
버전 1.7.0 이전 snowflake-ml-python
을 사용하는 경우 XGBoost 모델에서 오류 UnicodeDecodeError: 'utf-8' codec can't decode byte
가 표시될 수 있습니다. 이는 SHAP 라이브러리 버전 0.42.1과 Snowflake에서 지원하는 최신 XGBoost 버전(2.1.1) 간의 호환성 문제로 인한 것입니다. snowflake-ml-python
을 버전 1.7.0 이상으로 업그레이드할 수 없는 경우 다음 예제와 같이 XGBoost 버전을 2.0.3으로 다운그레이드하고 relax_version
옵션을 False
로 설정하여 모델을 로깅합니다.
mv_new = reg.log_model(
model,
model_name="model_with_explain_enabled",
version_name="explain_v0",
conda_dependencies=["snowflake-ml-python"],
sample_input_data = xs,
options={"relax_version": False}
)
기존 모델에 설명 기능 추가하기¶
1.6.2 이전 버전의 Snowpark ML을 사용하여 레지스트리에 로그인한 모델에는 설명 기능 기능이 없습니다. 모델 버전은 변경할 수 없으므로 기존 모델에 설명 기능을 추가하려면 새 모델 버전을 생성해야 합니다. ModelVersion.load
를 사용하여 모델의 구현을 다시 나타내는 Python 오브젝트를 검색한 다음 이를 새 모델 버전으로 레지스트리에 기록할 수 있습니다. 배경 데이터를 sample_input_data
로 전달해야 합니다. 이 접근법은 아래와 같습니다.
중요
모델을 로드하는 Python 환경은 모델이 배포되는 환경과 정확히 동일해야 합니다(즉, 모든 라이브러리 및 Python 버전이 동일해야 함). 자세한 내용은 모델 버전 로드하기 섹션을 참조하십시오.
mv_old = reg.get_model("model_without_explain_enabled").default
model = mv_old.load()
mv_new = reg.log_model(
model,
model_name="model_with_explain_enabled",
version_name="explain_v0",
conda_dependencies=["snowflake-ml-python"],
sample_input_data = xs
)
설명 불가능한 모델 로깅¶
설명 기능은 모델에서 지원하는 경우 기본적으로 활성화됩니다. 설명 없이 레지스트리에 모델 버전을 기록하려면 다음과 같이 모델을 기록할 때 enable_explainability
옵션에 False
를 전달합니다.
mv = reg.log_model(
catboost_model,
model_name="diamond_catboost_explain_enabled",
version_name="explain_v0",
conda_dependencies=["snowflake-ml-python"],
sample_input_data = xs,
options= {"enable_explainability": False}
)