Rumah > Artikel > Peranti teknologi > Artikel ini akan membawa anda memahami SHAP: penjelasan model untuk pembelajaran mesin
Dalam bidang pembelajaran mesin dan sains data, kebolehtafsiran model sentiasa menjadi tumpuan penyelidik dan pengamal. Dengan aplikasi meluas model yang kompleks seperti kaedah pembelajaran mendalam dan ensemble, memahami proses membuat keputusan model menjadi sangat penting. AI yang boleh dijelaskan |. XAI membantu membina kepercayaan dan keyakinan dalam model pembelajaran mesin dengan meningkatkan ketelusan model. Meningkatkan ketelusan model boleh dicapai melalui kaedah seperti penggunaan meluas pelbagai model yang kompleks, serta proses membuat keputusan yang digunakan untuk menerangkan model. Kaedah ini termasuk analisis kepentingan ciri, anggaran selang ramalan model, algoritma kebolehtafsiran tempatan, dsb. Analisis kepentingan ciri boleh menerangkan proses membuat keputusan model dengan menilai tahap pengaruh model ke atas ciri input. Anggaran selang ramalan model boleh memberikan maklumat deterministik tentang ramalan model. Algoritma kebolehtafsiran tempatan boleh membantu
XAI ialah satu set alat dan rangka kerja untuk memahami dan menerangkan cara model pembelajaran mesin membuat keputusan. Antaranya, pustaka SHAP (SHapley Additive explanations) dalam Python ialah alat yang sangat berguna. Pustaka SHAP mengukur sumbangan ciri kepada ramalan individu dan ramalan keseluruhan, dan menyediakan visualisasi yang cantik dan mudah digunakan.
Seterusnya, kami akan menggariskan asas perpustakaan SHAP untuk memahami ramalan bagi model regresi dan klasifikasi yang dibina dalam Scikit-learn.
SHAP (Penjelasan Tambahan Shapley) ialah kaedah teori permainan untuk mentafsir output mana-mana model pembelajaran mesin. Ia memanfaatkan nilai permainan teori permainan klasik dan sambungan berkaitannya untuk menggabungkan peruntukan kredit optimum dengan tafsiran tempatan (lihat kertas berkaitan untuk butiran dan petikan: https://github.com/shap/shap#citations). SHAP menyediakan peruntukan kredit yang optimum dan penjelasan tempatan dengan mengira sumbangan setiap ciri kepada output model. Pendekatan ini boleh digunakan untuk pelbagai jenis model, termasuk model linear, model pokok, model pembelajaran mendalam, dsb. Matlamat SHAP adalah untuk menyediakan cara yang intuitif dan boleh ditafsir untuk membantu orang ramai memahami proses membuat keputusan model pembelajaran mesin dan kesan setiap ciri pada hasil ramalan. Dengan menggunakan nilai SHAP dan sambungan yang berkaitan, kami boleh mendapatkan tafsiran yang lebih tepat dan komprehensif tentang kepentingan ciri, dan nilai pra-SHAP+ untuk model boleh membantu kami mengukur sumbangan ciri kepada ramalan. Semakin hampir nilai SHAP kepada sifar, semakin kecil sumbangan ciri kepada ramalan; semakin jauh nilai SHAP dari sifar, semakin besar sumbangan ciri tersebut kepada ramalan. Selain itu, nilai SHAP juga boleh memberitahu kami sumbangan ciri kepada ramalan. Apabila nilai SHAP menghampiri sifar, ia bermakna ciri menyumbang sedikit kepada ramalan; dan apabila nilai SHAP jauh dari sifar,
Pasang pakej shap:
pip install shap-i https://pypi.tuna.tsinghua.edu.cn/simple
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)
Cara biasa untuk mendapatkan nilai SHAP adalah menggunakan objek Explainer. Seterusnya buat objek Explainer dan ekstrak nilai shap_test untuk data ujian:
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 mempunyai panjang 89 kerana ia mengandungi rekod untuk setiap contoh ujian. Daripada melihat rekod ujian pertama, kita dapat melihat bahawa ia mengandungi tiga atribut:
shap_test[0].base_values: Nilai asas sasaran
shap_test[0].data: Nilai setiap ciri
shap_test[ 0].nilai: nilai SHAP setiap objek
nilai asas: nilai asas (shap_test.base_values), juga dikenali sebagai nilai jangkaan (explainer.expected_value), ialah purata nilai sasaran dalam data latihan.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 mengandungi nilai yang sama Rreeee
(shap_test.data == X_test).describe()
可以看到每条记录中每个特征的 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.plots.bar(shap_test)
这个简单但有用的图表显示了特征贡献的强度。该图基于特征的平均绝对 SHAP 值而生成:shap_df.apply(np.abs).mean()。特征按照从上到下的顺序排列,具有最高平均绝对 SHAP 值的特征显示在顶部。
shap.summary_plot(shap_test)
以下是解释这张图的指南:
shap.plots.heatmap(shap_test)
这个热力图的顶部还补充了每个记录的预测值(即 f(x))的线图。
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])
与“ 条形图/全局 ”中完全相同,只是这次我们将数据切片为单个记录。
shap.initjs()shap.plots.force(shap_test[0])
上面示例是回归模型,下面我们以分类模型展示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如何帮助解释模型错误预测。
Atas ialah kandungan terperinci Artikel ini akan membawa anda memahami SHAP: penjelasan model untuk pembelajaran mesin. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!