评估#

evaluate(forecaster, cv, y, X=None, strategy: str = 'refit', scoring: callable | list[callable] | None = None, return_data: bool = False, error_score: str | int | float = nan, backend: str | None = None, cv_X=None, backend_params: dict | None = None)[源代码][源代码]#

使用时间序列交叉验证评估预测器。

一个用于预测器的全方位统计性能基准测试工具,运行一个简单的回测实验并返回一个总结的 pd.DataFrame。

实验运行如下:

\(y_{train, 1}, y_{test, 1}, \dots, y_{train, K}, y_{test, K}\) 为由生成器 cv.split_series(y) 生成的训练/测试折。记 \(X_{train, 1}, X_{test, 1}, \dots, X_{train, K}, X_{test, K}\) 为由生成器 cv_X.split_series(X) 生成的训练/测试折(如果 XNone,则这些也为 None)。

  1. 将计数器初始化为 i = 1

  2. forecaster 拟合到 \(y_{train, 1}\)\(X_{train, 1}\),并将 fh 设置为 \(y_{test, 1}\) 的绝对索引。

  3. 使用 forecaster 进行预测,生成 y_pred ,并考虑外生变量。

    数据 \(X_{test, i}\)。预测是使用 predictpredict_probapredict_quantiles 进行的,具体取决于 scoring

  4. 计算 y_pred\(y_{test, i}\) 上的 scoring 函数

  5. 如果 i == K,终止,否则

  6. 设置 i = i + 1

  7. 摄取更多数据 \(y_{train, i}\)\(X_{train, i}\),如何取决于 strategy

  • 如果 strategy == "refit",则重置并拟合 forecaster 通过 fit,在 \(y_{train, i}\)\(X_{train, i}\) 上以预测 \(y_{test, i}\)

  • 如果 strategy == "update",则通过 update 更新 forecaster,基于 \(y_{train, i}\)\(X_{train, i}\) 来预测 \(y_{test, i}\)

  • 如果 strategy == "no-update_params",通过 update 方法将 forecaster 传递到 \(y_{train, i}\) 的截止点,参数 update_params=False

  1. 转到 3

此函数返回的结果是:

  • scoring 计算的结果,从第 4 次循环开始,在第 i 次循环中

  • 用于拟合和/或预测的运行时间,从第2、3、7次循环,在第 i 次循环中

  • forecaster 的截止状态,在第 i 次循环中为 3

  • \(y_{train, i}\), \(y_{test, i}\), y_pred (可选)

可以通过 backend 参数选择分布式和/或并行后端。

参数:
预测者sktime BaseForecaster 后代(具体预测器)

sktime 预测器基准测试

cvsktime BaseSplitter 后代

确定 y 和可能的 X 被分割为测试和训练折叠。y 总是根据 cv 进行分割,见上文。如果未传递 cv_X,则 X 的分割是 loc 等于 y 的子集。如果传递了 cv_X,则 X 根据 cv_X 进行分割。

ysktime 时间序列容器

评估实验中使用的目标(内生)时间序列

Xsktime 时间序列容器,与 y 具有相同的 mtype

评估实验中使用的外生时间序列

策略{“refit”, “update”, “no-update_params”},可选,默认=”refit”

定义了预测器在窗口扩展时看到新数据时的摄入模式:”refit” = 预测器被重新拟合到每个训练窗口;”update” = 预测器按顺序更新训练窗口数据;”no-update_params” = 拟合到第一个训练窗口,之后重复使用,不进行拟合或更新。

评分sktime.performance_metrics.BaseMetric 的子类或相同类型的列表,

default=None。用于获取一个评分函数,该函数接受 y_pred 和 y_test 参数,并接受 y_train 作为关键字参数。如果为 None,则使用 scoring = MeanAbsolutePercentageError(symmetric=True)。

return_databool, 默认=False

在 DataFrame 中返回三个额外的列,默认为 False。这些列的单元格中分别包含 y_train、y_pred、y_test 的 pd.Series。

error_score“raise” 或数值,默认=np.nan

如果在估计器拟合过程中发生异常,则分配给分数的值。如果设置为“raise”,则引发异常。如果给定数值,则引发 FitFailedWarning。

后端{“dask”, “loky”, “multiprocessing”, “threading”},默认值为 None。

如果指定并设置``strategy``为”refit”,则运行并行评估。

  • “None”: 按顺序执行循环,简单的列表推导

  • “loky”, “multiprocessing” 和 “threading”: 使用 joblib.Parallel 循环

  • “joblib”:自定义和第三方 joblib 后端,例如,spark

  • “dask”: 使用 dask,需要在环境中安装 dask

  • “dask_lazy”: 与 “dask” 相同,但将返回值更改为(延迟)``dask.dataframe.DataFrame``。

建议:使用“dask”或“loky”进行并行评估。由于GIL和序列化后端(“dask”和“loky”使用的是``cloudpickle``),“threading”不太可能看到速度提升,而“dask”和“loky”的序列化后端通常比“multiprocessing”中使用的标准``pickle``库更为健壮。

cv_Xsktime BaseSplitter 后代,可选

确定 X 被分割为测试和训练折叠的默认方式是,如果传递了 y,则 X 被分割为与 y 相同的 loc 索引,并且必须与 cv 有相同数量的分割。

backend_paramsdict, 可选

传递给后端的附加参数作为配置。直接传递给 utils.parallel.parallelize 。有效键取决于 backend 的值:

  • “None”: 没有额外参数, backend_params 被忽略

  • “loky”, “multiprocessing” 和 “threading”: 默认的 joblib 后端 任何有效的 joblib.Parallel 键都可以在这里传递,例如 n_jobs,除了 backend 直接由 backend 控制。如果未传递 n_jobs,它将默认为 -1,其他参数将默认为 joblib 的默认值。

  • “joblib”:自定义和第三方 joblib 后端,例如 spark。任何 joblib.Parallel 的有效键都可以在这里传递,例如 n_jobs,在这种情况下,backend 必须作为 backend_params 的键传递。如果未传递 n_jobs,它将默认为 -1,其他参数将默认为 joblib 的默认值。

  • “dask”: 任何 dask.compute 的有效键都可以传递,例如 scheduler

返回:
结果pd.DataFrame 或 dask.dataframe.DataFrame

包含多个列的 DataFrame,这些列包含有关每次重训练/更新和预测器预测的信息。行索引是 cv 中训练/测试折叠的分裂器索引。第 i 行的条目对应于 cv 中的第 i 个训练/测试分割。列如下:

  • test_{scoring.name}: (float) 模型性能得分。如果 scoring

列表,然后每个评分器都有一个名为 test_{scoring.name} 的列。

  • fit_time: (float) 在训练折叠上执行 fitupdate 所用的时间,单位为秒。

  • pred_time: (float) 从拟合的估计器中 预测 所需的时间,单位为秒。

  • len_train_window: (int) 训练窗口的长度。

  • cutoff: (int, pd.Timestamp, pd.Period) cutoff = 训练折叠中的最后一个时间索引。

  • y_train: (pd.Series) 仅在 return_data=True 时存在

cv 中第 i 个分割的训练折叠,用于拟合/更新预测器。

  • y_pred: (pd.Series) 如果看到 return_data=True 则存在

来自拟合预测器的第 i 个测试折叠索引的预测 cv

  • y_test: (pd.Series) 如果看到 return_data=True 则存在

cv 中用于计算指标的第 i 个分割的测试折叠。

示例

evaluate 进行的评估类型取决于参数 scoring 中的指标。默认是 MeanAbsolutePercentageError

>>> from sktime.datasets import load_airline
>>> from sktime.forecasting.model_evaluation import evaluate
>>> from sktime.split import ExpandingWindowSplitter
>>> from sktime.forecasting.naive import NaiveForecaster
>>> y = load_airline()[:24]
>>> forecaster = NaiveForecaster(strategy="mean", sp=3)
>>> cv = ExpandingWindowSplitter(initial_window=12, step_length=6, fh=[1, 2, 3])
>>> results = evaluate(forecaster=forecaster, y=y, cv=cv)

可选地,用户可以选择其他可以通过 scoring 参数提供的指标。这些可以是任何类型的预测指标,如 这里 所述。

<https://www.sktime.net/en/stable/api_reference/performance_metrics.html?highlight=metrics>`_ 即,点预测指标、区间指标、分位数预测指标。要使用特定指标评估估计器,请将其提供给评分参数。

>>> from sktime.performance_metrics.forecasting import MeanAbsoluteError
>>> loss = MeanAbsoluteError()
>>> results = evaluate(forecaster=forecaster, y=y, cv=cv, scoring=loss)

可选地,用户可以为 scoring 参数提供一个指标列表。

>>> from sktime.performance_metrics.forecasting import MeanSquaredError
>>> results = evaluate(
...     forecaster=forecaster,
...     y=y,
...     cv=cv,
...     scoring=[MeanSquaredError(square_root=True), MeanAbsoluteError()],
... )

区间度量的一个例子是 PinballLoss 。它可以与所有概率预测器一起使用。

>>> from sktime.forecasting.naive import NaiveVariance
>>> from sktime.performance_metrics.forecasting.probabilistic import PinballLoss
>>> loss = PinballLoss()
>>> forecaster = NaiveForecaster(strategy="drift")
>>> results = evaluate(forecaster=NaiveVariance(forecaster),
... y=y, cv=cv, scoring=loss)