使用sktime在Python中构建时间序列机器学习模型
本文介绍如何使用sktime库在Python中构建时间序列机器学习模型,包括数据预处理、预测管道构建、模型评估和交叉验证。通过一个工业HVAC传感器温度预测的完整案例,展示了sktime与scikit-learn风格一致的API,以及如何处理季节性和趋势等时间序列特有结构。
sktime是一个专为时间序列数据设计的Python库,它提供了与scikit-learn风格一致的API(如fit、predict、transform),但底层完全针对时间序列的结构特点构建。时间序列数据具有季节性、趋势、时间顺序以及未来值依赖过去值等特性,标准的scikit-learn管道无法直接处理这些问题。sktime支持预测、分类、回归和聚类等多种任务,并拥有统一的接口。
本文通过一个工业HVAC传感器温度预测的完整案例,详细介绍sktime的核心用法。数据集模拟了工厂中每小时记录的温度读数,包含90天共2160个数据点,具有每日季节性模式(工作时间温度较高)、轻微上升趋势(夏季来临)以及一些噪声和缺失值。
首先,使用sktime的temporal_train_test_split按时间顺序分割数据,将最后7天(168小时)作为测试集。与常规机器学习不同,时间序列数据不能打乱,必须确保训练数据在测试数据之前。然后定义预测范围(ForecastingHorizon),明确需要预测的时间步。
核心部分是构建预处理与预测管道。sktime的TransformedTargetForecaster允许将多个变换与一个预测器串联成一个估计器。管道中的变换会自动应用于目标序列,并在预测时逆变换回原始尺度。示例管道包含以下步骤:使用Imputer(线性插值)填充缺失值;使用Detrender去除线性趋势;使用Deseasonalizer(季节周期sp=24)去除每日季节性;最后用ExponentialSmoothing预测残差。
评估预测效果时,sktime提供了标准指标如平均绝对误差(MAE)和平均绝对百分比误差(MAPE)。案例中MAE约为0.584°C,MAPE约为2.40%。更重要的是,更换预测算法极为方便:只需将管道最后一步的ExponentialSmoothing替换为ARIMA,预处理步骤完全不变,模型即完成切换,且表现相当。
为了避免单次测试窗口的误导,sktime支持时间序列交叉验证。使用ExpandingWindowSplitter(扩展窗口分割器)可以逐步增加训练集大小,评估模型在多个时间窗口上的泛化能力。evaluate函数返回每折的指标和拟合时间,交叉验证的MAE约为0.606°C,验证了模型的一致性。
sktime的功能远不止基本预测,它还包括时间序列分类、概率预测、多序列共享模型、传统机器学习算法的时序适配以及自动模型选择与调优。其一致的API和与Python机器学习生态的集成,使得实验过程对初学者和专家都十分友好。官方文档和示例笔记本质量很高,值得经常处理时间序列问题的开发者收藏。