回归模型的Shap解释器

一个专门用于时间序列预测模型的 shap 解释器

此类(目前)仅限于 Darts 的 RegressionModel 实例的预测模型。它使用 shap 值来提供每个输入特征的“解释”。输入特征是目标和/或过去协变量的不同过去滞后,以及预测模型用于生成其预测的未来协变量的潜在未来滞后。此外,在多变量序列的情况下,特征包含每个(滞后)序列的每个维度。

备注

此解释器受限于计算shap值时常用的特征独立性假设。这意味着它不会捕捉到某些滞后项可能通过影响其他滞后项而对目标产生的潜在间接影响。

  • explain() 为给定的前景序列(或背景序列,如果未提供前景)生成解释。

  • summary_plot() 显示目标序列的每个水平和每个组件维度的shap图摘要。

  • force_plot_from_ts() 显示给定目标序列的一个目标和一个时间范围的shap力图。它显示每个滞后/协变量的shap值,具有加性力。

    布局。

class darts.explainability.shap_explainer.ShapExplainer(model, background_series=None, background_past_covariates=None, background_future_covariates=None, background_num_samples=None, shap_method=None, **kwargs)[源代码]

基类:_ForecastingModelExplainer

定义

  • 背景系列是一个用于训练shap解释器的 TimeSeries

  • 前景系列是一个 TimeSeries,在拟合后可以通过 shap 解释器进行解释。

目前,ShapExplainer 仅适用于 RegressionModel 预测模型。解释的时间范围(t+1, t+2, …)最多可以等于 modeloutput_chunk_length

参数
  • model (darts.models.forecasting.regression_model.RegressionModel) – 一个待解释的 RegressionModel。它必须先被拟合。

  • background_series (Union[TimeSeries, Sequence[TimeSeries], None]) – 一个或多个系列用于 训练 ShapExplainer 以及任何前景系列。考虑使用一个经过精心选择的简化背景来减少计算时间。如果 model 是在单个目标系列上拟合的,则是可选的。默认情况下,它是拟合时使用的 series。如果 model 是在多个(列表)目标系列上拟合的,则是强制性的。

  • background_past_covariates (Union[TimeSeries, Sequence[TimeSeries], None]) – 模型在拟合后所需的过去协变量序列或序列列表。

  • background_future_covariates (Union[TimeSeries, Sequence[TimeSeries], None]) – 模型拟合后所需的未来的协变量序列或序列列表。

  • background_num_samples (Optional[int, None]) – 可选地,是否对原始背景进行子集采样。随机选择构建的训练数据集中的 background_num_samples 个训练样本(使用 shap.utils.sample())。通常用于加快计算速度,特别是在 shap_method"kernel""permutation" 时。

  • shap_method (Optional[str, None]) – 可选地,应用的 shap 方法。默认情况下,会尝试根据预定义的一组已知模型选择最合适的方法。内部映射。支持的值:"permutation", "partition", "tree", "kernel", "sampling", "linear", "deep", "gradient", "additive"

  • **kwargs – 可选地,传递给 shap_method 的其他关键字参数。

实际案例

>>> from darts.datasets import AirPassengersDataset
>>> from darts.explainability.shap_explainer import ShapExplainer
>>> from darts.models import LinearRegressionModel
>>> series = AirPassengersDataset().load()
>>> model = LinearRegressionModel(lags=12)
>>> model.fit(series[:-36])
>>> shap_explain = ShapExplainer(model)
>>> results = shap_explain.explain()
>>> shap_explain.summary_plot()
>>> shap_explain.force_plot_from_ts()

方法

explain([foreground_series, ...])

解释一个前景时间序列并返回一个 ShapExplainabilityResult

force_plot_from_ts([foreground_series, ...])

为给定的 foreground_series,显示一个针对一个目标和一个时间范围的 shap force_plot。

summary_plot([horizons, target_components, ...])

为目标的每个地平线和每个组件维度显示一个shap图摘要。

explain(foreground_series=None, foreground_past_covariates=None, foreground_future_covariates=None, horizons=None, target_components=None)[源代码]

解释一个前景时间序列并返回一个 ShapExplainabilityResult 。结果可以通过方法 get_explanation() 获取。结果是一个包含’解释’的多变量 TimeSeries 实例,该解释对应于前景 TimeSeries 输入在任何可预测时间戳处的(预测范围,目标组件)预测。

这个多变量 TimeSeries 的组件命名约定是:"{name}_{type_of_cov}_lag_{idx}",其中:

  • {name} 是从原始前景系列(目标、过去或未来)中的组件名称。

  • {type_of_cov} 是协变量类型。它可以取3个不同的值:"target""past_cov""future_cov"

  • {idx} 是滞后指数。

参数
  • foreground_series (Union[TimeSeries, Sequence[TimeSeries], None]) – 可选地,一个或一系列目标 TimeSeries 需要解释。可以是多元的。如果没有提供,将解释背景 TimeSeries

  • foreground_past_covariates (Union[TimeSeries, Sequence[TimeSeries], None]) – 可选地,如果预测模型需要,可以是一个或一系列过去协变量 TimeSeries

  • foreground_future_covariates (Union[TimeSeries, Sequence[TimeSeries], None]) – 可选地,如果预测模型需要,可以是一个或一系列未来协变量 TimeSeries

  • horizons (Optional[Sequence[int], None]) – 可选地,一个整数或整数序列,表示要解释的未来时间步。1 对应于被预测的第一个时间戳。所有值必须 <= 被解释的预测模型的 output_chunk_length

  • target_components (Optional[Sequence[str], None]) – 可选地,一个字符串或字符串序列,包含要解释的目标组件。

返回

预测解释

返回类型

ShapExplainabilityResult

实际案例

假设我们有一个模型,包含两个名为 "T_0""T_1" 的目标组件,三个过去协变量,默认组件名称为 "0""1""2",以及一个未来协变量,默认组件名称为 "0"。此外,horizons = [1, 2]。该模型是一个回归模型,其中 lags = 3lags_past_covariates=[-1, -3]lags_future_covariates = [0]

我们提供 foreground_seriesforeground_past_covariatesforeground_future_covariates,每个长度为5。

>>> explain_results = explainer.explain(
>>>     foreground_series=foreground_series,
>>>     foreground_past_covariates=foreground_past_covariates,
>>>     foreground_future_covariates=foreground_future_covariates,
>>>     horizons=[1, 2],
>>>     target_names=["T_0", "T_1"])
>>> output = explain_results.get_explanation(horizon=1, component="T_1")
>>> feature_values = explain_results.get_feature_values(horizon=1, component="T_1")
>>> shap_objects = explain_results.get_shap_explanation_objects(horizon=1, component="T_1")

然后,该方法返回一个包含 ShapExplainer解释 的多变量时间序列,其组件名称如下:

  • T_0_目标_滞后-1

  • T_0_目标_滞后-2

  • T_0_目标_滞后-3

  • T_1_目标_滞后-1

  • T_1_目标_滞后-2

  • T_1_目标_滞后-3

  • 0_过去_cov_滞后-1

  • 0_过去_cov_滞后-3

  • 1_past_cov_lag-1

  • 1_past_cov_lag-3

  • 2_过去_cov_滞后-1

  • 2_past_cov_lag-3

  • 0_fut_cov_lag_0

这个系列的长度为3,因为模型可以解释5-3+1个预测(时间戳索引4、5和6)

force_plot_from_ts(foreground_series=None, foreground_past_covariates=None, foreground_future_covariates=None, horizon=1, target_component=None, **kwargs)[源代码]

为给定的 foreground_series 显示一个目标和一个时间范围的 shap force_plot。它以加性力布局显示每个滞后/协变量的 shap 值。

一旦图表显示出来,选择“原始样本顺序”以按时间顺序观察时间序列。

参数
  • foreground_series (Optional[TimeSeries, None]) – 可选地,要解释的目标序列。可以是多元的。如果为 None,将使用 background_series

  • foreground_past_covariates (Optional[TimeSeries, None]) – 可选地,如果预测模型需要,可以提供一个过去的协变量序列。如果为 None,将使用 background_past_covariates

  • foreground_future_covariates (Optional[TimeSeries, None]) – 可选地,如果预测模型需要,可以提供一个未来的协变量序列。如果为 None,将使用 background_future_covariates

  • horizon (Optional[int, None]) – 可选地,一个整数用于未来时间点/步长的解释,从第一个预测步长1开始。horizons 不得大于 output_chunk_length

  • target_component (Optional[str, None]) – 可选地,要绘制的目标组件。如果目标序列是多变量的,则必须指定目标组件。

  • **kwargs – 可选地,传递给 shap.force_plot() 的额外关键字参数。

model: RegressionModel
summary_plot(horizons=None, target_components=None, num_samples=None, plot_type='dot', **kwargs)[源代码]

为目标的每个地平线和每个组件维度显示一个shap图摘要。此方法重用初始背景数据作为前景(可能采样),以为每个特征提供一个总体重要性图。如果没有提供目标名称和/或地平线,则生成所有摘要图。

参数
  • horizons (Union[int, Sequence[int], None]) – 可选地,一个整数或整数序列,表示从第一个预测步骤1开始,未来要解释的点/步骤。horizons 必须 <= 预测模型的 output_chunk_length

  • target_components (Union[str, Sequence[str], None]) – 可选地,一个字符串或字符串序列,包含要解释的目标组件。

  • num_samples (Optional[int, None]) – 可选地,一个用于对前景序列进行采样的整数(基于背景),以提高性能。

  • plot_type (Optional[str, None]) – 可选地,指定要使用的 shap 库绘图类型。可以是以下之一:'dot', 'bar', 'violin'

返回

一个嵌套的字典 {horizon : {component : shap.Explaination}},包含了所有地平线和组件的原始解释。

返回类型

shaps_