>  기사  >  기술 주변기기  >  이 기사에서는 SHAP: 기계 학습을 위한 모델 설명을 이해하도록 안내합니다.

이 기사에서는 SHAP: 기계 학습을 위한 모델 설명을 이해하도록 안내합니다.

WBOY
WBOY원래의
2024-06-01 10:58:13646검색

기계 학습 및 데이터 과학 분야에서 모델의 해석 가능성은 항상 연구자와 실무자의 초점이었습니다. 딥러닝, 앙상블 방법 등 복잡한 모델이 널리 적용되면서 모델의 의사결정 과정을 이해하는 것이 특히 중요해졌습니다. explainable AI | XAI는 모델 투명성을 높여 기계 학습 모델에 대한 신뢰와 확신을 구축하는 데 도움이 됩니다. 모델 투명성을 향상시키는 것은 여러 복잡한 모델의 광범위한 사용은 물론 모델을 설명하는 데 사용되는 의사 결정 프로세스와 같은 방법을 통해 달성할 수 있습니다. 이러한 방법에는 기능 중요도 분석, 모델 예측 간격 추정, 로컬 해석 가능성 알고리즘 등이 포함됩니다. 특성 중요도 분석은 모델이 입력 특성에 미치는 영향 정도를 평가하여 모델의 의사결정 과정을 설명할 수 있습니다. 모델 예측 구간 추정은 모델 예측에 대한 결정론적 정보를 제공할 수 있습니다. 로컬 해석 알고리즘이 도움이 될 수 있습니다.

XAI는 기계 학습 모델이 의사 결정을 내리는 방법을 이해하고 설명하기 위한 도구 및 프레임워크 세트입니다. 그 중에서도 Python의 SHAP(SHapley Additive explain) 라이브러리는 매우 유용한 도구입니다. SHAP 라이브러리는 개별 예측과 전체 예측에 대한 기능의 기여도를 정량화하고 아름답고 사용하기 쉬운 시각화를 제공합니다.

다음으로 Scikit-learn에 구축된 회귀 및 분류 모델에 대한 예측을 이해하기 위해 SHAP 라이브러리의 기본 사항을 간략하게 설명합니다.

이 기사에서는 SHAP: 기계 학습을 위한 모델 설명을 이해하도록 안내합니다.

SHAP 및 SHAP 값

SHAP(Shapley Additive Descriptions)는 기계 학습 모델의 출력을 해석하기 위한 게임 이론 방법입니다. 이는 고전적인 게임 이론의 게임 가치와 관련 확장을 활용하여 최적의 크레딧 할당과 로컬 해석을 결합합니다(자세한 내용과 인용은 관련 논문 참조: https://github.com/shap/shap#citations). SHAP는 모델 출력에 대한 각 기능의 기여도를 계산하여 최적의 크레딧 할당 및 로컬 설명을 제공합니다. 이 접근 방식은 선형 모델, 트리 모델, 딥 러닝 모델 등 다양한 모델 유형에 적용될 수 있습니다. SHAP의 목표는 사람들이 기계 학습 모델의 의사 결정 프로세스와 각 기능이 예측 결과에 미치는 영향을 이해하는 데 도움이 되는 직관적이고 해석 가능한 방법을 제공하는 것입니다. SHAP 값 및 관련 확장을 사용하면 특성 중요도에 대한 보다 정확하고 포괄적인 해석을 얻을 수 있으며, 모델에 대한 사전 SHAP+ 값은 예측에 대한 특성 기여도를 정량화하는 데 도움이 될 수 있습니다. SHAP 값이 0에 가까울수록 예측에 대한 특성의 기여도가 낮아지고 SHAP 값이 0에서 멀어질수록 예측에 대한 특성의 기여도가 커집니다. 또한 SHAP 값은 예측에 대한 특성의 기여도를 알려줄 수도 있습니다. SHAP 값이 0에 가까우면 해당 기능이 예측에 거의 기여하지 않는다는 의미이며, SHAP 값이 0에 멀면

shap 패키지를 설치합니다.

pip install shap-i https://pypi.tuna.tsinghua.edu.cn/simple
다음 예를 살펴보겠습니다. 회귀 문제 SHAP 값에서 기능을 얻습니다. 먼저 라이브러리와 샘플 데이터를 로드한 다음 당뇨병 진행을 예측하는 모델을 빠르게 구축하겠습니다.

import numpy as npnp.set_printoptions(formatter={'float':lambda x:"{:.4f}".format(x)})import pandas as pdpd.options.display.float_format = "{:.3f}".formatimport seaborn as snsimport matplotlib.pyplot as pltsns.set(style='darkgrid', context='talk', palette='rainbow')from sklearn.datasets import load_diabetesfrom sklearn.model_selection import train_test_splitfrom sklearn.ensemble import (RandomForestRegressor, RandomForestClassifier)import shapshap.initjs()# Import sample datadiabetes = load_diabetes(as_frame=True)X = diabetes['data'].iloc[:, :4] # Select first 4 columnsy = diabetes['target']# Partition dataX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1)print(f"Training features shape: {X_train.shape}")print(f"Training target shape: {y_train.shape}\n")print(f"Test features shape: {X_test.shape}")print(f"Test target shape: {y_test.shape}")display(X_train.head())# Train a simple modelmodel = RandomForestRegressor(random_state=42)model.fit(X_train, y_train)

이 기사에서는 SHAP: 기계 학습을 위한 모델 설명을 이해하도록 안내합니다.SHAP 값을 얻는 일반적인 방법은 설명 개체를 사용하는 것입니다. 다음으로 explainer 객체를 생성하고 테스트 데이터에 대한 shap_test 값을 추출합니다.

explainer = shap.Explainer(model)shap_test = explainer(X_test)print(f"Shap values length: {len(shap_test)}\n")print(f"Sample shap value:\n{shap_test[0]}")

이 기사에서는 SHAP: 기계 학습을 위한 모델 설명을 이해하도록 안내합니다.shap_test에는 각 테스트 인스턴스에 대한 레코드가 포함되어 있으므로 길이가 89입니다. 첫 번째 테스트 기록을 보면 여기에 세 가지 속성이 포함되어 있음을 알 수 있습니다.

shap_test[0].base_values: 대상의 기본 값

shap_test[0].data: 각 기능의 값

shap_test[ 0].values: 각 객체의 SHAP 값

base value: 기대값(explainer.expected_value)이라고도 알려진 기본 값(shap_test.base_values)은 훈련 데이터의 목표 값의 평균입니다.
print(f"Expected value: {explainer.expected_value[0]:.1f}")print(f"Average target value (training data): {y_train.mean():.1f}")print(f"Base value: {np.unique(shap_test.base_values)[0]:.1f}")
EaShap_test.data에 동일한 값이 포함됨

이 기사에서는 SHAP: 기계 학습을 위한 모델 설명을 이해하도록 안내합니다.

Rreeee
값: Shap_test의 가장 중요한 속성은 값의 값입니다. 이를 통해 Shap 값에 액세스할 수 있기 때문입니다. 보다 쉬운 조작을 위해 SHAP 값을 DataFrame으로 변환해 보겠습니다.

이 기사에서는 SHAP: 기계 학습을 위한 모델 설명을 이해하도록 안내합니다.

(shap_test.data == X_test).describe()

    이 기사에서는 SHAP: 기계 학습을 위한 모델 설명을 이해하도록 안내합니다.

    可以看到每条记录中每个特征的 SHAP 值。如果将这些 SHAP 值加到期望值上,就会得到预测值:

    이 기사에서는 SHAP: 기계 학습을 위한 모델 설명을 이해하도록 안내합니다.

    np.isclose(model.predict(X_test),  explainer.expected_value[0] + shap_df.sum(axis=1))

    이 기사에서는 SHAP: 기계 학습을 위한 모델 설명을 이해하도록 안내합니다.

    现在我们已经有了 SHAP 值,可以进行自定义可视化,如下图所示,以理解特征的贡献:

    columns = shap_df.apply(np.abs).mean()\ .sort_values(ascending=False).indexfig, ax = plt.subplots(1, 2, figsize=(11,4))sns.barplot(data=shap_df[columns].apply(np.abs), orient='h', ax=ax[0])ax[0].set_title("Mean absolute shap value")sns.boxplot(data=shap_df[columns], orient='h', ax=ax[1])ax[1].set_title("Distribution of shap values");plt.show()

    이 기사에서는 SHAP: 기계 학습을 위한 모델 설명을 이해하도록 안내합니다.

    左侧子图显示了每个特征的平均绝对 SHAP 值,而右侧子图显示了各特征的 SHAP 值分布。从这些图中可以看出,bmi 在所使用的4个特征中贡献最大。

    Shap 内置图表

    虽然我们可以使用 SHAP 值构建自己的可视化图表,但 shap 包提供了内置的华丽可视化图表。在本节中,我们将熟悉其中几种选择的可视化图表。我们将查看两种主要类型的图表:

    • 全局:可视化特征的整体贡献。这种类型的图表显示了特征在整个数据集上的汇总贡献。
    • 局部:显示特定实例中特征贡献的图表。这有助于我们深入了解单个预测。
    • 条形图/全局:对于之前显示的左侧子图,有一个等效的内置函数,只需几个按键即可调用:
    shap.plots.bar(shap_test)

    이 기사에서는 SHAP: 기계 학습을 위한 모델 설명을 이해하도록 안내합니다.

    这个简单但有用的图表显示了特征贡献的强度。该图基于特征的平均绝对 SHAP 值而生成:shap_df.apply(np.abs).mean()。特征按照从上到下的顺序排列,具有最高平均绝对 SHAP 值的特征显示在顶部。

    • 总结图/全局:另一个有用的图是总结图:
    shap.summary_plot(shap_test)

    이 기사에서는 SHAP: 기계 학습을 위한 모델 설명을 이해하도록 안내합니다.

    以下是解释这张图的指南:

    • 图的横轴显示了特征的 SHAP 值分布。每个点代表数据集中的一个记录。例如,我们可以看到对于 BMI 特征,点的分布相当散乱,几乎没有点位于 0 附近,而对于年龄特征,点更加集中地分布在 0 附近。
    • 点的颜色显示了特征值。这个额外的维度允许我们看到随着特征值的变化,SHAP 值如何变化。换句话说,我们可以看到关系的方向。例如,我们可以看到当 BMI 较高时(由热粉色点表示)SHAP 值倾向于较高,并且当 BMI 较低时(由蓝色点表示)SHAP 值倾向于较低。还有一些紫色点散布在整个光谱中。

    • 热力图/全局:热力图是另一种可视化 SHAP 值的方式。与将 SHAP 值聚合到平均值不同,我们看到以颜色编码的个体值。特征绘制在 y 轴上,记录绘制在 x 轴上:
    shap.plots.heatmap(shap_test)

    이 기사에서는 SHAP: 기계 학습을 위한 모델 설명을 이해하도록 안내합니다.

    这个热力图的顶部还补充了每个记录的预测值(即 f(x))的线图。

    • Force plot/全局:这个交互式图表允许我们通过记录查看 SHAP 值的构成。
    shap.initjs()shap.force_plot(explainer.expected_value, shap_test.values, X_test)

    이 기사에서는 SHAP: 기계 학습을 위한 모델 설명을 이해하도록 안내합니다.

    就像热力图一样,x 轴显示每个记录。正的 SHAP 值显示为红色,负的 SHAP 值显示为蓝色。例如,由于第一个记录的红色贡献比蓝色贡献多,因此该记录的预测值将高于期望值。

    交互性允许我们改变两个轴。例如,y 轴显示预测值 f(x),x 轴根据输出(预测)值排序,如上面的快照所示。

    • 条形图/局部:现在我们将看一下用于理解个别案例预测的图表。让我们从一个条形图开始:
    shap.plots.bar(shap_test[0])

    이 기사에서는 SHAP: 기계 학습을 위한 모델 설명을 이해하도록 안내합니다.

    与“ 条形图/全局 ”中完全相同,只是这次我们将数据切片为单个记录。

  1. Force plot/局部:Force plot是单个记录的强制图。
shap.initjs()shap.plots.force(shap_test[0])

이 기사에서는 SHAP: 기계 학습을 위한 모델 설명을 이해하도록 안내합니다.

分类模型的SHAP values/图表

上面示例是回归模型,下面我们以分类模型展示SHAP values及可视化:

import numpy as npnp.set_printoptions(formatter={'float':lambda x:"{:.4f}".format(x)})import pandas as pdpd.options.display.float_format = "{:.3f}".formatimport seaborn as snsimport matplotlib.pyplot as pltsns.set(style='darkgrid', context='talk', palette='rainbow')from sklearn.datasets import load_diabetesfrom sklearn.model_selection import train_test_splitfrom sklearn.ensemble import RandomForestClassifierimport shapfrom sklearn.datasets import fetch_openml# 加载 Titanic 数据集titanic = fetch_openml('titanic', version=1, as_frame=True)df = titanic.frame# 选择特征和目标变量features = ['pclass', 'age', 'sibsp', 'parch', 'fare']df = df.dropna(subset=features + ['survived'])# 删除包含缺失值的行X = df[features]y = df['survived']# 分割数据集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 训练随机森林分类器model = RandomForestClassifier(n_estimators=100, random_state=42)model.fit(X_train, y_train)

이 기사에서는 SHAP: 기계 학습을 위한 모델 설명을 이해하도록 안내합니다.

和回归模型一样的,shap values 值也是包括base_values 和values 值:

explainer = shap.Explainer(model)shap_test = explainer(X_test)print(f"Length of shap_test: {len(shap_test)}\n")print(f"Sample shap_test:\n{shap_test[0]}")print(f"Expected value: {explainer.expected_value[1]:.2f}")print(f"Average target value (training data): {y_train}")print(f"Base value: {np.unique(shap_test.base_values)[0]:.2f}")shap_df = pd.DataFrame(shap_test.values[:,:,1],  columns=shap_test.feature_names,  index=X_test.index)shap_df

我们仔细检查一下将 shap 值之和添加到预期概率是否会给出预测概率:

np.isclose(model.predict_proba(X_test)[:,1],  explainer.expected_value[1] + shap_df.sum(axis=1))

이 기사에서는 SHAP: 기계 학습을 위한 모델 설명을 이해하도록 안내합니다.

内置图与回归模型是一致的,比如:

shap.plots.bar(shap_test[:,:,1])

이 기사에서는 SHAP: 기계 학습을 위한 모델 설명을 이해하도록 안내합니다.

或者瀑布图如下:

shap.plots.waterfall(shap_test[:,:,1][0])

이 기사에서는 SHAP: 기계 학습을 위한 모델 설명을 이해하도록 안내합니다.

示例

看一个具体的用例。我们将找出模型对幸存者预测最不准确的例子,并尝试理解模型为什么会做出错误的预测:

test = pd.concat([X_test, y_test], axis=1)test['probability'] = model.predict_proba(X_test)[:,1]test['order'] = np.arange(len(test))test.query("survived=='1'").nsmallest(5, 'probability')

이 기사에서는 SHAP: 기계 학습을 위한 모델 설명을 이해하도록 안내합니다.

生存概率为第一个记录的746。让我们看看各个特征是如何对这一预测结果产生贡献的:

ind1 = test.query("survived=='1'")\ .nsmallest(1, 'probability')['order'].values[0]shap.plots.waterfall(shap_test[:,:,1][ind1])

이 기사에서는 SHAP: 기계 학습을 위한 모델 설명을 이해하도록 안내합니다.

主要是客舱等级和年龄拉低了预测值。让我们在训练数据中找到类似的例子:

pd.concat([X_train, y_train], axis=1)[(X_train['pclass']==3) & (X_train['age']==29) & (X_train['fare'].between(7,8))]

이 기사에서는 SHAP: 기계 학습을 위한 모델 설명을 이해하도록 안내합니다.

所有类似的训练实例实际上都没有幸存。现在,这就说得通了!这是一个小的分析示例,展示了 SHAP 如何有助于揭示模型为何会做出错误预测。

在机器学习和数据科学中,模型的可解释性一直备受关注。可解释人工智能(XAI)通过提高模型透明度,增强对模型的信任。SHAP库是一个重要工具,通过量化特征对预测的贡献,提供可视化功能。本文介绍了SHAP库的基础知识,以及如何使用它来理解回归和分类模型的预测。通过具体用例,展示了SHAP如何帮助解释模型错误预测。

위 내용은 이 기사에서는 SHAP: 기계 학습을 위한 모델 설명을 이해하도록 안내합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.