在機器學習和資料科學領域,模型的可解釋性一直是研究者和實踐者關注的焦點。隨著深度學習和整合方法等複雜模型的廣泛應用,理解模型的決策過程變得尤為重要。可解釋人工智慧(Explainable AI | XAI)透過提高模型的透明度,幫助建立對機器學習模型的信任和信心。 提高模型的透明度可以透過多種複雜模型的廣泛應用等方法來實現,以及用於解釋模型的決策過程。這些方法包括特徵重要性分析、模型預測區間估計、局部可解釋性演算法等。特徵重要性分析可以透過評估模型對輸入特徵的影響程度來解釋模型的決策過程。模型預測區間估計可以提供模型預測的確定性資訊。局部可解釋性演算法可以幫助
XAI是一套工具和框架,用於理解和解釋機器學習模型如何做出決策。其中,Python中的SHAP(SHapley Additive explanations)庫是一個非常有用的工具。 SHAP庫能夠量化特徵對單一預測及整體預測的貢獻,並提供美觀且易於使用的視覺化功能。
接下來,我們將概括介紹下SHAP函式庫的基礎知識,以理解在Scikit-learn中所建構的迴歸和分類模型的預測。
SHAP 和SHAP values
SHAP(Shapley Additive Explanations)是一種解釋任何機器學習模型輸出的賽局理論方法。它利用經典的博弈論博弈值及其相關擴展,將最優的信用分配與局部解釋相結合(詳細資訊和引用請參閱相關論文:https://github.com/shap/shap#citations)。 SHAP透過計算每個特徵對模型產出的貢獻,從而提供最優的信用分配和局部解釋。這種方法可以應用於各種模型類型,包括線性模型、樹模型、深度學習模型等。 SHAP的目標是提供一種直觀且可解釋的方式,幫助人們理解機器學習模型的決策過程,以及各個特徵對於預測結果的影響程度。透過使用SHAP值和相關擴展,我們可以獲得更準確、全面的特徵重要性解釋,並對模型的預
SHAP+ values可以幫助我們量化特徵對預測的貢獻。 SHAP值越接近零,表示該特徵對預測的貢獻越小;而SHAP值越遠離零,表示該特徵對預測的貢獻越大。此外,SHAP值還可以告訴我們特徵對預測的貢獻大小。當SHAP值接近零時,表示該特徵對預測的貢獻很小;而當SHAP值遠離零時,
#安裝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值的方法是使用Explainer物件。接下來建立一個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_test的長度為89,因為它包含了每個測試實例的記錄。從查看第一個測試記錄中,我們可以看到它包含三個屬性:
shap_test[0].base_values:目標的基準值
shap_test[0].data:每個特徵的值
shap_test[0].values:每個物件的SHAP值
- 基準:基準值(shap_test.base_values),也稱為期望值(explainer. expected_value),是訓練資料中目標值的平均值。
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}")
- #shap_test.data 包含與X_test 相同的值
(shap_test.data == X_test).describe()
- values:shap_test 最重要的屬性是values 屬性,因為我們可以透過它來存取SHAP 值。讓我們將 SHAP 值轉換為 DataFrame,以便於操作:
shap_df = pd.DataFrame(shap_test.values, columns=shap_test.feature_names, index=X_test.index)shap_df
可以看到每条记录中每个特征的 SHAP 值。如果将这些 SHAP 值加到期望值上,就会得到预测值:
np.isclose(model.predict(X_test), explainer.expected_value[0] + shap_df.sum(axis=1))
现在我们已经有了 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 值分布。从这些图中可以看出,bmi 在所使用的4个特征中贡献最大。
Shap 内置图表
虽然我们可以使用 SHAP 值构建自己的可视化图表,但 shap 包提供了内置的华丽可视化图表。在本节中,我们将熟悉其中几种选择的可视化图表。我们将查看两种主要类型的图表:
- 全局:可视化特征的整体贡献。这种类型的图表显示了特征在整个数据集上的汇总贡献。
- 局部:显示特定实例中特征贡献的图表。这有助于我们深入了解单个预测。
- 条形图/全局:对于之前显示的左侧子图,有一个等效的内置函数,只需几个按键即可调用:
shap.plots.bar(shap_test)
这个简单但有用的图表显示了特征贡献的强度。该图基于特征的平均绝对 SHAP 值而生成:shap_df.apply(np.abs).mean()。特征按照从上到下的顺序排列,具有最高平均绝对 SHAP 值的特征显示在顶部。
- 总结图/全局:另一个有用的图是总结图:
shap.summary_plot(shap_test)
以下是解释这张图的指南:
- 图的横轴显示了特征的 SHAP 值分布。每个点代表数据集中的一个记录。例如,我们可以看到对于 BMI 特征,点的分布相当散乱,几乎没有点位于 0 附近,而对于年龄特征,点更加集中地分布在 0 附近。
- 点的颜色显示了特征值。这个额外的维度允许我们看到随着特征值的变化,SHAP 值如何变化。换句话说,我们可以看到关系的方向。例如,我们可以看到当 BMI 较高时(由热粉色点表示)SHAP 值倾向于较高,并且当 BMI 较低时(由蓝色点表示)SHAP 值倾向于较低。还有一些紫色点散布在整个光谱中。
- 热力图/全局:热力图是另一种可视化 SHAP 值的方式。与将 SHAP 值聚合到平均值不同,我们看到以颜色编码的个体值。特征绘制在 y 轴上,记录绘制在 x 轴上:
shap.plots.heatmap(shap_test)
这个热力图的顶部还补充了每个记录的预测值(即 f(x))的线图。
- Force plot/全局:这个交互式图表允许我们通过记录查看 SHAP 值的构成。
shap.initjs()shap.force_plot(explainer.expected_value, shap_test.values, X_test)
就像热力图一样,x 轴显示每个记录。正的 SHAP 值显示为红色,负的 SHAP 值显示为蓝色。例如,由于第一个记录的红色贡献比蓝色贡献多,因此该记录的预测值将高于期望值。
交互性允许我们改变两个轴。例如,y 轴显示预测值 f(x),x 轴根据输出(预测)值排序,如上面的快照所示。
- 条形图/局部:现在我们将看一下用于理解个别案例预测的图表。让我们从一个条形图开始:
shap.plots.bar(shap_test[0])
与“ 条形图/全局 ”中完全相同,只是这次我们将数据切片为单个记录。
- Force plot/局部:Force plot是单个记录的强制图。
shap.initjs()shap.plots.force(shap_test[0])
分类模型的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 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.plots.bar(shap_test[:,:,1])
或者瀑布图如下:
shap.plots.waterfall(shap_test[:,:,1][0])
示例
看一个具体的用例。我们将找出模型对幸存者预测最不准确的例子,并尝试理解模型为什么会做出错误的预测:
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')
生存概率为第一个记录的746。让我们看看各个特征是如何对这一预测结果产生贡献的:
ind1 = test.query("survived=='1'")\ .nsmallest(1, 'probability')['order'].values[0]shap.plots.waterfall(shap_test[:,:,1][ind1])
主要是客舱等级和年龄拉低了预测值。让我们在训练数据中找到类似的例子:
pd.concat([X_train, y_train], axis=1)[(X_train['pclass']==3) & (X_train['age']==29) & (X_train['fare'].between(7,8))]
所有类似的训练实例实际上都没有幸存。现在,这就说得通了!这是一个小的分析示例,展示了 SHAP 如何有助于揭示模型为何会做出错误预测。
在机器学习和数据科学中,模型的可解释性一直备受关注。可解释人工智能(XAI)通过提高模型透明度,增强对模型的信任。SHAP库是一个重要工具,通过量化特征对预测的贡献,提供可视化功能。本文介绍了SHAP库的基础知识,以及如何使用它来理解回归和分类模型的预测。通过具体用例,展示了SHAP如何帮助解释模型错误预测。
以上是一文帶您了解SHAP:機器學習的模型解釋的詳細內容。更多資訊請關注PHP中文網其他相關文章!

嘿,編碼忍者!您當天計劃哪些與編碼有關的任務?在您進一步研究此博客之前,我希望您考慮所有與編碼相關的困境,這是將其列出的。 完畢? - 讓&#8217

AI增強食物準備 在新生的使用中,AI系統越來越多地用於食品製備中。 AI驅動的機器人在廚房中用於自動化食物準備任務,例如翻轉漢堡,製作披薩或組裝SA

介紹 了解Python函數中變量的名稱空間,範圍和行為對於有效編寫和避免運行時錯誤或異常至關重要。在本文中,我們將研究各種ASP

介紹 想像一下,穿過美術館,周圍是生動的繪畫和雕塑。現在,如果您可以向每一部分提出一個問題並獲得有意義的答案,該怎麼辦?您可能會問:“您在講什麼故事?

繼續使用產品節奏,本月,Mediatek發表了一系列公告,包括新的Kompanio Ultra和Dimenty 9400。這些產品填補了Mediatek業務中更傳統的部分,其中包括智能手機的芯片

#1 Google推出了Agent2Agent 故事:現在是星期一早上。作為AI驅動的招聘人員,您更聰明,而不是更努力。您在手機上登錄公司的儀表板。它告訴您三個關鍵角色已被採購,審查和計劃的FO

我猜你一定是。 我們似乎都知道,心理障礙由各種chat不休,這些chat不休,這些chat不休,混合了各種心理術語,並且常常是難以理解的或完全荒謬的。您需要做的一切才能噴出fo

根據本週發表的一項新研究,只有在2022年製造的塑料中,只有9.5%的塑料是由回收材料製成的。同時,塑料在垃圾填埋場和生態系統中繼續堆積。 但是有幫助。一支恩金團隊


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

記事本++7.3.1
好用且免費的程式碼編輯器

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

SublimeText3漢化版
中文版,非常好用