目录
多步时间序列预测也能可解释?SHAP分析全攻略
多步时间序列预测(multi-step time series forecasting)+ SHAP 可解释分析,确实是一个当前研究和应用都很感兴趣但又容易踩坑的方向。
01 什么是“多步时间序列预测”?
输入过去一段时间的值,预测未来 T 步(如未来7天) 的值:
输出:Y =[y(t+1), y(t+2), …, y(t+T)]
输入:X =[x(t-10), x(t-9), …, x(t)]
所以本质上经过滑动窗口处理后,多步长时间序列可以看作一个多输入多输出问题
02 SHAP 本质上解释什么?
SHAP 本质上是回答这样的问题:“某个输入变量对模型输出的影响有多大?”
所以关键是:
- 输入维度:时间步 + 变量
- 输出维度:预测步长(多步)
方法 1:分别对每个输出维度使用 SHAP
- 针对第 i 个输出,用一个模型(或模型的一部分)只对它做 SHAP 解释。
- 得到的是每个特征对第 i 个输出的 SHAP 值。
- 最终你会得到一个 n_outputs × n_features 的 SHAP 值矩阵(对每个样本)
✔️ 优点:简单直接,完全兼容现有 SHAP 库(如 Python 的 shap 包)
❗ 缺点:这种方式默认输出之间是独立的,仅解释每个输出
import shap# 假设 model 是一个多输出模型,输出为 y1, y2, y3for i in range(model.output_shape[1]): # 针对每个输出维度 explainer = shap.Explainer(lambda x: model(x)[:, i], X_train) shap_values = explainer(X_test) shap.plots.beeswarm(shap_values)
方法 2:合并多个输出为一个指标进行解释(如加权平均)
- 把多个输出合成一个“总输出”再进行解释。
- 比如对输出 [y1, y2, y3] 做加权和:y_total = w1y1 + w2y2 + w3*y3
- 然后对 y_total 做 SHAP 分析。
✔️ 优点:能提供综合影响解释
❗ 缺点:解释的是加权后的“复合输出”,不能区分各输出维度
代码实现
MATLAB 实现
MATLAB shap可解释分析确实没有python的完善,不过也是针对几种算法配备了shap可解释分析库的,如果想快速拿来用一下,不想配置python环境,可以考虑下MATLAB的shap可解释分析
MTpredict工具箱可以直接实现多输出和时序的SHAP可解释分析可以直接实现任意步长的单时序预测、多元时序预测的shap分析以及非时序多输入多输出的shap分析,保存的特征数据也可以直接导入python进一步实现shap分析奥
MTpredict工具箱现在滑动窗口处理之后的数据,会直接保存,方便之后进行其他处理或者在python中实现SHAP可解释分析
比如这样一个单时序数据,导入后会自动数据处理
这里选择好预测点个数以及输入历史点数
命令行会提醒这个处理好的数据保存在这个excel表格里面,如果这个表格有的话可以提前删除,因为这个数据是覆盖上去的
可以看到处理好的表格就是以下的样子,把过去时序作为特征预测未来的,然后就把这个表格直接导入作为多输出预测就行,预测点是几,y_out设置成几就行
将SHAP可解释分析打开后,框内可以自定义绘图配色样式
可以直接分析得到预测时序未来预测点和过去历史点以及历史特征的关系
将多个时序维度SHAP分析结果放在一张图里面,多个特征对多个维度的SHAP分析更加明显 像以上的标识,有uu问我分别是什么意思,以上输出是medv未来三个点,就是预测未来三个点,预测特征是用到medv过去5个点,以及其他特征过去两个时间点,这是多元时序预测的问题。 最新也是更新了超好看的预测结果图,运行完直出9张结果图,200多种配色方案任意选择
python SHAP可解释分析实现
之前分享过python可解释分享代码,主要实现思路是,对于CatBoost、LightGBM相关模型,只能做单输出回归,对此类模型训练多个单输出模型再进行解释,对于神经网络模型类,是可以训练多输入多输出模型的,直接SHAP分析就可以得到多维预测结果。已经把相关代码和教程整理好了,只要替换下数据,以及明确多输出的数量就能得到分析结果了,默认最后设置列为输出列,前面的是特征
df_all = pd.read_excel('光场12.xlsx') # 单输出示例/多输入多输出# df_all = pd.read_excel('BostonHousing1.xlsx')
# df_all = pd.read_excel('process_data_dec1.xlsx') # 单时序预测示例# df_all = pd.read_excel('process_data_dec1_4.xlsx') # 单时序预测示例
# df_all = pd.read_excel('process_data_dec1_m.xlsx') # 多元时序预测(不可知未来特征)示例df_process = df_all.dropna()
train_vaild_test_list=[0.8,0.1,0.1] #训练集、验证集、测试集划分
y_out=1#输出数量设定
如果是多输出回归,只需要把原始数据导入,把y_out设置为输出列数就行,例如输出3列,y_out设置3
df_all = pd.read_excel('光场12.xlsx') # 单输出示例/多输入多输出
df_process = df_all.dropna()
train_vaild_test_list=[0.8,0.1,0.1] #训练集、验证集、测试集划分
y_out=2#输出数量设定
多输出是会得到每个输出的预测结果和多个输出的平均预测结果,改变index_choose就会得到不同模型的shap分析结果
CatBoost shap分析
KAN网络shap分析