使用 sktime 进行基准测试#
基准测试模块允许您轻松编排基准测试实验,在这些实验中,您希望比较一个或多个算法在一个或多个数据集上的性能。它还提供了许多统计测试,以检查观察到的性能差异是否具有统计显著性。
基准测试模块基于 mlaut 。
预备知识#
[1]:
# import required functions and classes
import os
import warnings
from sklearn.metrics import accuracy_score
from sktime.benchmarking.data import UEADataset, make_datasets
from sktime.benchmarking.evaluation import Evaluator
from sktime.benchmarking.metrics import PairwiseMetric
from sktime.benchmarking.orchestration import Orchestrator
from sktime.benchmarking.results import HDDResults
from sktime.benchmarking.strategies import TSCStrategy
from sktime.benchmarking.tasks import TSCTask
from sktime.classification.interval_based import (
RandomIntervalSpectralEnsemble,
TimeSeriesForestClassifier,
)
from sktime.series_as_features.model_selection import PresplitFilesCV
# hide warnings
warnings.filterwarnings("ignore")
设置路径#
[2]:
# set up paths to data and results folder
import sktime
DATA_PATH = os.path.join(os.path.dirname(sktime.__file__), "datasets/data")
RESULTS_PATH = "results"
创建指向硬盘上数据集的指针#
这里我们使用 UEADataset
,它遵循 UEA/UCR 格式 ,以及 sktime 中包含的一些时间序列分类数据集。
[3]:
# Create individual pointers to dataset on the disk
datasets = [
UEADataset(path=DATA_PATH, name="ArrowHead"),
UEADataset(path=DATA_PATH, name="ItalyPowerDemand"),
]
[4]:
# Alternatively, we can use a helper function to create them automatically
datasets = make_datasets(
path=DATA_PATH, dataset_cls=UEADataset, names=["ArrowHead", "ItalyPowerDemand"]
)
对于每个数据集,我们还需要指定一个学习任务#
学习任务封装了定义我们试图解决的问题的所有信息和指令。在我们的例子中,我们试图解决分类任务,我们需要的关键信息是数据集中我们试图预测的目标变量的名称。这里所有的任务都是相同的,因为在所有数据集中目标变量的名称是相同的。
[5]:
tasks = [TSCTask(target="target") for _ in range(len(datasets))]
指定学习策略#
在设置了数据集和相应的学习任务后,我们需要定义我们想要评估和比较的算法。
[6]:
# Specify learning strategies
strategies = [
TSCStrategy(TimeSeriesForestClassifier(n_estimators=10), name="tsf"),
TSCStrategy(RandomIntervalSpectralEnsemble(n_estimators=10), name="rise"),
]
设置一个结果对象#
结果对象封装了基准测试结果存储的位置和方式,这里我们选择将它们输出到硬盘。
[7]:
# Specify results object which manages the output of the benchmarking
results = HDDResults(path=RESULTS_PATH)
运行基准测试#
最后,我们将所有规范传递给编排器。编排器将自动在所有数据集上训练和评估所有算法,并写出结果。
[8]:
# run orchestrator
orchestrator = Orchestrator(
datasets=datasets,
tasks=tasks,
strategies=strategies,
cv=PresplitFilesCV(),
results=results,
)
orchestrator.fit_predict(save_fitted_strategies=False, overwrite_predictions=True)
评估和比较结果#
运行了编排器之后,我们可以评估和比较预测策略。
[9]:
evaluator = Evaluator(results)
metric = PairwiseMetric(func=accuracy_score, name="accuracy")
metrics_by_strategy = evaluator.evaluate(metric=metric)
metrics_by_strategy.head()
[9]:
strategy | accuracy_mean | accuracy_stderr | |
---|---|---|---|
0 | rise | 0.850126 | 0.019921 |
1 | tsf | 0.829563 | 0.020512 |
评估器提供了多种额外的评估和比较策略的方法,包括统计假设检验和可视化工具,例如:
[10]:
evaluator.rank()
[10]:
strategy | accuracy_mean_rank | |
---|---|---|
0 | rise | 1.5 |
1 | tsf | 1.5 |
目前,以下功能已实现:
evaluator.plot_boxplots()
evaluator.ranks()
evaluator.t_test()
evaluator.sign_test()
evaluator.ranksum_test()
evaluator.t_test_with_bonferroni_correction()
evaluator.wilcoxon_test()
evaluator.friedman_test()
evaluator.nemenyi()