发布日期:2024-10-25 10:49 点击次数:57
什么是SHAP解说?快播成人影片
在机器学习和深度学习限制,模子解说性是一个紧迫的课题,尽管复杂的模子如深度神经收罗和集成模子(如XGBoost、LightGBM)在算计性能上阐扬优异,但它们常常被视为“黑箱”,难以解说其里面决议历程,SHAP(SHapley Additive exPlanations)是一种处罚这一问题的用具,通过分派特征的紧迫性值来解说模子的输出SHAP的核热情念SHAP的中枢想想源自配合博弈论中的Shapley值,Shapley值用于公说念分派多个参与者在配合中所带来的收益,SHAP将这一主意引入到机器学习模子解说中,用于想象每个特征对模子算计完毕的孝顺SHAP的特质
一致性:如若模子的特征孝顺增多,那么SHAP值也会增多
局部解说:SHAP值不错解说单个算计完毕,从而提供针对单一数据点的解说全局解说:通过对多个数据点的SHAP值进行汇总,不错提供模子的全局解说SHAP值的想象
生成统统可能的特征组合:想象特征在各式组合中的孝顺
想象角落孝顺:关于每个特征,想象其在不同特征组合中的角落孝顺求平均值:对角落孝顺进行加权平均,获得特征的SHAP值SHAP的应用
特征紧迫性排序:通过SHAP值,不错直不雅地看到哪些特征对模子算计完毕影响最大
解说个体算计:SHAP值不错解说单个数据点的算计完毕,匡助贯通模子为何作念出某个算计很是检测:通过分析SHAP值,不错发现很是数据点和潜在的问题特征SHAP在实施中的使用SHAP撑执多种机器学习框架,如XGBoost、LightGBM、sklearn、TensorFlow等,使用SHAP时,常常包括以下门径:
检修模子:使用数据集检修机器学习模子
想象SHAP值:使用SHAP库想象每个特征的SHAP值可视化与解说:通过可视化门径展示SHAP值,进行模子解说
代码达成
搭建LightGBM模子
import pandas as pdimport numpy as npimport matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = 'SimHei'plt.rcParams['axes.unicode_minus'] = Falsedf = pd.read_excel('california.xlsx')
from sklearn.model_selection import train_test_split
X = df.drop(['price'],axis=1)y = df['price']
X_temp, X_test, y_temp, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 然后将检修集进一步永诀为检修集和考据集X_train, X_val, y_train, y_val = train_test_split(X_temp, y_temp, test_size=0.125, random_state=42) # 0.125 x 0.8 = 0.1
# 数据集轨范化x_mean = X_train.mean()x_std = X_train.std()y_mean = y.mean()y_std = y.std()X_train = (X_train - x_mean)/x_stdy_train = (y_train-y_mean)/y_stdX_val = (X_val - x_mean)/x_stdy_val = (y_val - y_mean)/y_stdX_test = (X_test - x_mean)/x_stdy_test = (y_test - y_mean)/y_std
import lightgbm as lgb
# LightGBM模子参数params_lgb = { 'learning_rate': 0.02, # 学习率,放肆每一步的步长,用于驻扎过拟合。典型值规模:0.01 - 0.1 'boosting_type': 'gbdt', # 栽植门径,这里使用梯度栽植树(Gradient Boosting Decision Tree,简称GBDT) 'objective': 'mse', # 耗损函数 'metric': 'rmse', # 评估主义 'num_leaves': 127, # 每棵树的叶子节点数目,放肆模子复杂度。较大值不错提高模子复杂度但可能导致过拟合 'verbose': -1, # 放肆 LightGBM 输出信息的详备进度,-1暗示无输出,0暗示最少输出,正数暗示输出更多信息 'seed': 42, # 当场种子,用于重现模子的完毕 'n_jobs': -1, # 并走运算的线程数目,-1暗示使用统统可用的CPU中枢 'feature_fraction': 0.8, # 每棵树当场采用的特征比例,用于增多模子的泛化才智 'bagging_fraction': 0.9, # 每次迭代时当场采用的样本比例,用于增多模子的泛化才智 'bagging_freq': 4 # 每隔些许次迭代进行一次bagging操作,用于增多模子的泛化才智}
model_lgb = lgb.LGBMRegressor(**params_lgb)model_lgb.fit(X_train, y_train, eval_set=[(X_val, y_val)], eval_metric='rmse')
图片
将数据集永诀为检修集、考据集和测试集,并对其进行轨范化处理,然后使用LightGBM模子进行检修,建立参数以驻扎过拟合和提高泛化才智,到现在为止就构建了一个LighGBM模子,对这个算计完毕进行一个浅薄的可视化
國產av 果凍傳媒 肛交pred_train = model_lgb.predict(X_train)pred_val = model_lgb.predict(X_val)pred_test = model_lgb.predict(X_test)
y_train_h = y_train*y_std y_meanpred_train_h = pred_train*y_std y_mean
y_val_h = y_val*y_std y_meanpred_val_h = pred_val*y_std y_mean
y_test_h = y_test*y_std y_meanpred_test_h = pred_test*y_std y_mean
import seaborn as snscolors = sns.color_palette('husl', 3)
plt.figure(figsize=(15,5),dpi=300)plt.subplot(3,1,1)plt.scatter(y_train_h, pred_train_h, label='检修集', alpha=0.3, color=colors[0])plt.xlabel('信得过值')plt.ylabel('算计值')plt.legend()plt.subplot(3,1,2)plt.scatter(y_val_h, pred_val_h, label='考据集', alpha=0.3, color=colors[1])plt.xlabel('信得过值')plt.ylabel('算计值')plt.legend()plt.subplot(3,1,3)plt.scatter(y_test_h, pred_test_h, label='测试集', alpha=0.3, color=colors[2])plt.xlabel('信得过值')plt.ylabel('算计值')plt.legend()plt.tight_layout()plt.show()
图片
将模子算计完毕与信得过值进行比拟并可视化,但这种浅薄的可视化无法深远解说模子的决议历程,然则咱们不错借助SHAP值进一步分析模子特征的紧迫性和孝顺度
选录图(Summary Plot)
import shap# 构建 shap解说器explainer = shap.TreeExplainer(model_lgb)# 想象测试集的shap值shap_values = explainer.shap_values(X_train)# 特征标签labels = X_train.columnsplt.rcParams['font.family'] = 'serif'plt.rcParams['font.serif'] = 'Times new Roman'plt.rcParams['font.size'] = 13#cmap='?'配色viridis Spectral coolwar mRdYlGn RdYlBu RdBu RdGy PuOr BrBG PRGn PiYGplt.figure()shap.summary_plot(shap_values, X_train, feature_names=labels, plot_type='dot')
图片
选录图是SHAP常用的一种可视化门径,用于流露特征的紧迫性和特征值的影响处所,选录图商酌了特征紧迫性和特征效应图,展示了每个特征的SHAP值的散布情况,匡助咱们贯通每个特征对模子算计的孝顺,这张可视化完毕可在繁多论文当中看见,虽然你也不错通过参数cmap转换配色幸免审好意思疲钝('viridis':从黄色到蓝绿色。'Spectral':从红色到蓝色,适用于有正负影响的特征。'coolwarm':从冷到暖的神采图。'RdYlGn':从红到绿的神采图。'RdYlBu':从红到蓝的神采图。'RdBu':红蓝双色图。'RdGy':红灰双色图。'PuOr':从紫色到橙色的神采图。'BrBG':从棕色到蓝绿色的神采图。'PRGn':从紫色到绿色的神采图。'PiYG':从粉红色到绿色的神采图),接下来从不同角度对可视化进行解读神采:粉红色点:暗示特征值在这个不雅察模子中对模子算计产生了正面影响蓝色点:暗示该特征值在这个不雅察中对模子算计产生负面影响水平轴(shap值):流露每个特征对算计完毕的影响大小,点越辩认中心线(零点),暗示该特征对模子输出的影响越大正的shap值暗示正面影响,负的shap值暗示负面影响垂直轴(特征摆设):图中垂直摆设的特征按影响力从上到小进行排序,上方的特征对模子输出的总影响更大,而下方的特征影响较小特征影响力解说:最上方特征(如:MedInc):流露了无数的正面和负面影响,标明其在不同的不雅察值对模子算计的完毕有很大不同的影响中部特征(如:AveRooms):也流露出两种神采的点,但点的散布更采集,影响相对较小底部特征(如:Population):对模子的影响最小,且大部分影响较为接近于零值,暗示这些特征对模子算计的孝顺较小其中若何去贯通每个特征的SHAP值这句话>shap_values值响应的其实便是每一个样本,每一个特征对输出完毕的影响
print('shap维度:',shap_values.shape)print('测试集维度:',X_train.shape)
图片
不错看见shap_values和测试集(这里作念的选录图是对测试集进行操作)维度是一致的,也便是每一个shap值骨子和原始数据每一个点是逐一双应的,虽然也不错对所特殊据集在一张画布上展示每一个特征的排序
# 想象检修集和测试集的SHAP值shap_values_train = explainer.shap_values(X_train)shap_values_val = explainer.shap_values(X_val)shap_values_test = explainer.shap_values(X_test)
# 画图SHAP值回归图(Summary Plot)plt.figure(figsize=(15, 5))plt.subplot(1, 3, 1)shap.summary_plot(shap_values_train, X_train, plot_type='bar', show=False)plt.title('X_train')plt.xlabel('') # 移除 x 轴标签幸免x轴重迭
plt.subplot(1, 3, 2)shap.summary_plot(shap_values_val, X_val, plot_type='bar', show=False)plt.title('X_val')
plt.subplot(1, 3, 3)shap.summary_plot(shap_values_test, X_test, plot_type='bar', show=False)plt.title('X_test')plt.xlabel('')
plt.tight_layout()plt.show()
图片
这里想象的就不在是每一个点的shap值,而是想象的每一个特征的紧迫进度,特征按影响力从大到小进行排序,若何进行想象的呢?
np.abs(shap_values_train).mean(axis=0) # 哄骗测试集进行演示
图片
便是把SHAP_value样本取统统值的平均值从而获得每个特征的紧迫进度
依赖图(Dependence Plot)
shap.dependence_plot('MedInc', shap_values, X_train, interaction_index='AveOccup')
图片
依赖图用于流露一个特征的SHAP值与该特征值之间的相干,并不错展示特征之间的交互作用在这里shap.dependence_plot函数的参数解说如下:
'MedInc':这是你想要推敲的特征名
shap_values:这是通过SHAP想象获得的特征紧迫性值
X_train:这是用于生成SHAP值的检修数据interaction_index='AveOccup':这是指定与主特征(MedInc)交互的特征,SHAP会在图中流露两者的交互后果终末对这个依赖图进行解读:
正有关相干:在这里跟着MedInc的增多,主义变量AveOccup也随之增多 影响的进度:MedInc的值在 3 到 6 的规模内,SHAP 值变化并不证实,标明,在这个规模内,MedInc对模子算计的主义变量影响并不大,反之竖立
交互后果:通过不雅察图中的神采变化,不错了解主特征与交互特征之间的相干以及它们对模子算计的共同影响
力求(Force Plot)
# 画图单个样本的SHAP解说(Force Plot)sample_index = 7 # 采用一个样本索引进行解说shap.force_plot(explainer.expected_value, shap_values_test[sample_index], X_test.iloc[sample_index], matplotlib=True)
图片
力求用于直不雅地展示单个样本的SHAP值过火对模子算计完毕的影响,通过力求,不错明晰地看到每个特征对该样本算计值的孝顺
力求可视化解说:
基线值:图中的最先暗示模子的基线值(expected_value)也便是可视化当中的base valuc
特征孝顺:每个特征的孝顺通过带神采的条暗示,条的长度暗示该特征对最终算计值的影响大小,红色条暗示正向孝顺,即该特征使算计值增多,蓝色条暗示负向孝顺,即该特征使算计值减少算计值:特殊暗示模子对该样本的最终算计值,这是基线值加上统统特征孝顺的总数,在这里为-0.31交互作用选录图(Interaction Summary Plot)
shap_interaction_values = explainer.shap_interaction_values(X_train)shap.summary_plot(shap_interaction_values, X_train)
图片
用于展示特征之间交互作用的紧迫性和影响的一种可视化门径
特征排序:特征按紧迫性排序,最紧迫的特征在图的顶部,每个特征的总紧迫性值是其与统统其他特征交互作用的紧迫性值之和
SHAP交互作用值散布:每个点暗示一个样本的交互作用值,交互作用值越大,暗示该特征与另一个特征的交互对模子算计的影响越大神采暗示交互特征:神采暗示与主特征交互的特征,使用神采渐变来暗示不同的特征交互后果SHAP热图(Heatmap)
# 创建 shap.Explanation 对象shap_explanation = shap.Explanation(values=shap_values_test[0:500,:], base_values=explainer.expected_value, data=X_test.iloc[0:500,:], feature_names=X_test.columns)# 画图热图shap.plots.heatmap(shap_explanation)
图片
热图解读:
左侧y轴为紧迫性特征排行,特征按影响力从大到小进行排序,右侧y轴为其可视化,图像中神采浅深暗示SHAP值的大小,也便是该特征下值对模子的影响,神采越深SHAP值统统值越大越影响模子,顶部为模子在这些数值下的算计完毕可视化,这里只从测试采集采用了500个数据进行可视化,太多的数据会影响运转技巧,以及可视化的密致,读者自行采用
通过热图,不错有用地探索和贯通复杂模子的特征紧迫性和特征之间的互有相干快播成人影片,从而提高模子的解说性和可解说性
本站仅提供存储事业,统统内容均由用户发布,如发现存害或侵权内容,请点击举报。