Sktime:用于工夫序列机器学习的一致Python库
作者头像
  • zhi2001
  • 2020-07-18 15:30:44 7

在Python中处理时间序列数据以解决数据科学问题具有一定的挑战性。

目前存在的工具并不适合处理时间序列任务,而且难以无缝集成。scikit-learn软件包中的方法假设数据以表格形式排列,并且每一列都是独立同分布的(这一假设不适合时间序列数据)。包含时间序列学习模块(例如statsmodels)的软件包也很难很好地整合在一起。此外,现有的Python包中缺乏一些重要的时间序列操作,比如跨时间将数据划分为训练集和测试集。

为了解决这些问题,开发了sktime。

sktime是一个用于时间序列机器学习的开源Python工具箱。这是一个由社区推动的项目,得到了英国经济和社会研究委员会、消费者数据研究中心和图灵研究所的支持。

sktime扩展了scikit-learn的API,使其能够处理时间序列任务。它提供了必要的算法和转换工具,可以有效地处理时间序列回归、预测和分类任务。该库包含了公共的时间序列学习算法和转换方法,而这些方法在其他常见的库中尚不可用。

sktime旨在与scikit-learn兼容,能够轻松地将算法应用于相关的时间序列任务,并构建复合模型。许多时间序列任务是相互关联的,可以解决一个任务的算法往往也可以用来解决相关的任务。这种思想被称为“降维”。例如,可以将用于时间序列回归的模型(利用序列预测输入值)重新用于时间序列预测任务(预测的输入值是未来值)。

使命宣言:“sktime支持按时间序列进行可理解和可组合的机器学习。它提供了与scikit-learn兼容的算法和模型组合工具,并由明确的学习任务分类法、指导性文档和友好的社区支持。”

接下来,我们将重点介绍sktime的一些独特功能。

时间序列的正确数据模型

sktime使用嵌套数据结构来处理Pandas数据框中的时间序列数据。

在普通的数据框中,每一行包含一个独立的观测值和表示不同变量的列表。而对于sktime的方法,Pandas数据框中的每个单元格现在可以包含整个时间序列。这种格式对于多变量、面板和异构数据非常灵活,并且允许在Pandas和scikit-learn中重用方法。

在下表中,每一行都是一个观测值,在X列中包含一个时间序列数组,在y列中包含类别值。sktime估计器和转换器可以在这样的序列上运行。

相比之下,scikit-learn方法需要将时间序列X中的每个元素分割成单独的列。这会导致维度非常高(251列),并且表格学习算法会忽略列的时间顺序(尽管时间序列分类和回归算法会使用这些顺序)。

对于需要同时建模多个时间序列的任务,与本地序列数据结构兼容的sktime显然是最佳选择。对于scikit-learn期望的以表格形式组织的数据进行训练的模型可能会陷入许多性能问题。

sktime能做什么?

在GitHub页面上,sktime当前提供了以下功能:

  • 最新的时间序列分类、回归和预测算法(从基于Java的tsml工具包移植)
  • 时间序列转换器:单序列变换(例如去趋势化或去季节化)、按功能序列化的变换(例如特征提取器)以及组合不同转换器的工具
  • 转换器和模型的流水线
  • 模型调整
  • 模型组合 - 例如,为时间序列分类和回归定制的随机森林;多变量问题的集合

sktime API

如前所述,sktime遵循基本的scikit-learn API,包括fit、predict和transform类方法。

对于估计器(即模型)类,sktime提供了fit方法用于模型训练和predict方法用于生成新预测。

sktime中的估计器将scikit-learn的回归器和分类器扩展到它们的时间序列对应物。sktime还包括专门针对时间序列任务的新估计器。

对于转换器类,sktime提供了fit和transform方法来转换序列数据。有几种类型的转换可用:

  • 在实例上运行的表格数据转换器(例如PCA)
  • 序列到基元的转换器,将每行的时间序列转换为基元数(例如特征提取)
  • 串联到串联的转换器,将串联转换为不同的串联(例如串联的傅立叶变换)
  • 去趋势转换器在与输入序列相同的域中返回去趋势时间序列(例如季节性去趋势)

代码示例

时间序列预测

以下示例改编自GitHub上的预测教程。该示例中的序列(Box-Jenkins航空公司数据集)展示了1949年至1960年间每月国际航空公司的乘客数量。

首先,加载数据并将其拆分为训练集和测试集,然后绘制数据。 ```python from sktime.datasets import loadairline from sktime.forecasting.modelselection import temporaltraintestsplit from sktime.utils.plotting.forecasting import plotys

y = loadairline() ytrain, ytest = temporaltraintestsplit(y) plotys(ytrain, ytest, labels=["ytrain", "y_test"]) ```

在创建任何复杂的预测之前,将预测与简单的基准进行比较是有帮助的——好的模型必须超越这个基准。sktime提供了具有不同“策略”的NaiveForecaster方法来生成基线预测。

以下代码和图表展示了两个简单的预测。策略为“最后”的预测器始终预测该序列的最后观察值。策略为“季节性最后”的预测器预测给定季节中观测到的序列的最后一个值。示例中的季节性指定为“sp = 12”或12个月。 ```python from sktime.forecasting.naive import NaiveForecaster

naiveforecasterlast = NaiveForecaster(strategy="last") naiveforecasterlast.fit(ytrain) ylast = naiveforecasterlast.predict(fh)

naiveforecasterseasonal = NaiveForecaster(strategy="seasonallast", sp=12) naiveforecasterseasonal.fit(ytrain) yseasonallast = naiveforecasterseasonal.predict(fh)

plotys(ytrain, ytest, ylast, yseasonallast, labels=["ytrain", "ytest", "ypredlast", "ypredseasonal_last"]) ```

下一个预测代码片段展示了如何轻松地将现有的scikit-learn回归器正确地用于预测任务。下面,sktime的ReducedRegressionForecaster方法使用scikit-learn的RandomForestRegressor模型预测该序列。外部,sktime将训练数据分成长度为12的窗口,以便回归器继续训练。 ```python from sktime.forecasting.compose import ReducedRegressionForecaster from sklearn.ensemble import RandomForestRegressor from sktime.forecasting.modelselection import temporaltraintestsplit from sktime.performancemetrics.forecasting import smapeloss

regressor = RandomForestRegressor() forecaster = ReducedRegressionForecaster(regressor, windowlength=12) forecaster.fit(ytrain) ypred = forecaster.predict(fh) plotys(ytrain, ytest, ypred, labels=['ytrain', 'ytest', 'ypred']) ```

sktime还包含本地预测方法,例如AutoARIMA。 ```python from sktime.forecasting.arima import AutoARIMA

forecaster = AutoARIMA(sp=12) forecaster.fit(ytrain) ypred = forecaster.predict(fh) plotys(ytrain, ytest, ypred, labels=["ytrain", "ytest", "y_pred"]) ```

要全面了解sktime的预测功能,请查看sktime的预测教程。

时间序列分类

最后,sktime可用于将时间序列分类为不同的序列组。

在下面的代码示例中,单个时间序列的分类与scikit-learn中的分类一样简单。唯一的区别在于这里讨论的嵌套时间序列数据结构。 ```python from sktime.datasets import loadarrowhead from sktime.classification.compose import TimeSeriesForestClassifier from sklearn.modelselection import traintestsplit from sklearn.metrics import accuracyscore

X, y = loadarrowhead(returnXy=True) Xtrain, Xtest, ytrain, ytest = traintestsplit(X, y) classifier = TimeSeriesForestClassifier() classifier.fit(Xtrain, ytrain) ypred = classifier.predict(Xtest) accuracyscore(ytest, y_pred) ```

要全面了解时间序列分类,请查看sktime的单变量和多变量分类教程。

sktime的附加资源

要了解更多关于sktime的信息,请访问以下链接以获取详细的文档和示例:

  • 详细的API参考:sktime.org
  • sktime GitHub页面(带有文档)
  • 示例笔记本
  • Sktime论文:Markus Löning, Anthony Bagnall, Sajaysurya Ganesh, Viktor Kazakov, Jason Lines, Franz Király (2019):"sktime:具有时间序列的机器学习的一致接口"

(本文翻译自Alexandra Amidon的文章《Sktime: a Unified Python Library for Time Series Machine Learning》,参考:https://towardsdatascience.com/sktime-a-unified-python-library-for-time-series-machine-learning-3c103c139a55)

    本文来源:图灵汇
责任编辑: : zhi2001
声明:本文系图灵汇原创稿件,版权属图灵汇所有,未经授权不得转载,已经协议授权的媒体下载使用时须注明"稿件来源:图灵汇",违者将依法追究责任。
    分享
序列工夫一致用于机器PythonSktime学习
    下一篇