评估#
- 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)
生成的训练/测试折(如果X
为None
,则这些也为None
)。将计数器初始化为
i = 1
将
forecaster
拟合到 \(y_{train, 1}\) 和 \(X_{train, 1}\),并将fh
设置为 \(y_{test, 1}\) 的绝对索引。- 使用
forecaster
进行预测,生成y_pred
,并考虑外生变量。 数据 \(X_{test, i}\)。预测是使用
predict
、predict_proba
或predict_quantiles
进行的,具体取决于scoring
。
- 使用
计算
y_pred
与 \(y_{test, i}\) 上的scoring
函数如果
i == K
,终止,否则设置
i = i + 1
摄取更多数据 \(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
。
转到 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) 在训练折叠上执行
fit
或update
所用的时间,单位为秒。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)