全文共4701字,預計學習時長12分鐘
在Python中使用時間序列來解決數據科學問題是非常有挑戰性的,現有的工具並不適合時間序列任務,也不容易集成。
Scikiti -learn包中的方法假設數據是表格格式結構,每一列為獨立同分布——這些假設不適用於時間序列數據。包含時間序列學習模塊的程序包,例如狀態模型,不能很好地集成。此外,現有的Python包不支持許多基本的時間序列操作,比如將數據分成不同時間的訓練集和測試集。
Sktime就是為了解決這一問題應運而生的。Sktime是一個使用時間序列進行機器學習的開源Python工具箱。這是一個由英國經濟與社會研究理事會、消費者數據研究中心和艾倫·圖靈研究所資助的社區驅動的基金項目。
Sktime將Scikit-learn應用程式接口擴展到時間序列任務。它提供了必要的算法和轉換工具,能有效地解決時間序列回歸、預測和分類任務。該庫包括其他通用類庫沒有的、專用的時間序列學習算法和轉換方法。
Sktime的設計可以與Scikiti -learn互操作,輕鬆適應相關時間序列任務的算法,並構建複合模型。具體怎麼操作呢?許多時間序列任務是相關聯的,能夠解決一項任務的算法通常可以用來解決相關的任務,這個概念叫做還原。
例如,時間序列回歸模型(使用序列來預測輸出值)可用於時間序列預測任務(預測的輸出值是終值)。
其宗旨是:「Sktime使可理解和可組合的機器學習具有時間序列,為支持清晰學習任務分類Scikiti -learn兼容算法和模型組合工具提供了具有啟發性的文檔和友好的社群。」
本文將重點介紹sktime的一些特性。
適合時間序列的數據模型
Sktime針對pandas數據幀中的時間序列使用了嵌套數據結構。
典型數據框架中的每一行都包含獨立同分布觀測值,列代表不同的變量。對於Sktime方法,Pandas數據幀中的每個單元格包含整個時間序列。這種格式對於多變量、面板和異構數據很靈活,允許重用Pandas和Scikit-learn中的方法。在下表中,每一行都是一個觀察值,X列中包含一個時間序列數組,y列包含一個組值。
在下表中,按照Scikit-learn的方法要求,X列中的每個元素被分為單個列,251列的維數非常高。此外,表格學習算法忽略了列的時間順序(但用於時間序列分類和回歸算法)。
對於建模多個同時出現的系列的問題,本機系列數據結構兼容的Sktime顯然是最好的,Scikiti -learn表格格式數據結構訓練的模型會淹沒在眾多特性中。
sktime能做什麼?
根據Github頁面介紹,sktime目前提供:
· 模型調優。
· 轉換器和模型流水線技術。
· 最先進的時間序列分類、回歸和預測算法(來自基於java的tsml工具包)。
· 用於時間序列的轉換器:單序列變換(例如去趨勢或去周期),序列作為特徵變換(例如特徵提取器),以及組成不同轉換器的工具。
· 模型集合——例如用於時間序列分類和回歸的可完全定製的隨機森林;多變量問題的集合。
sktime應用程式接口
如上所述,Sktime遵循基本的Scikit-learn應用程式接口以及擬合、預報和變換類方法。對於估計量(即模型)類,Sktime提供了一個擬合方法用於模型訓練,以及一個預報方法用於生成新的預測;Sktime中的估計量將Scikit-learn的回歸器和分類器擴展到對應的時間序列;Sktime還包括特定於時間序列任務的新的估計器。
對於轉換器類,sktime提供了擬合和轉換方法來轉換系列數據。有幾種可用的類型轉換:
· 表格式數據轉換器,例如PCA,可以在獨立同分布實例上操作。
· 序列到基元轉換器,將每一行的時間序列轉換為基元數字(例如,特徵事務)。
· 序列到序列轉換器將序列轉換為不同的序列(如序列的傅立葉變換)。
· 去趨勢轉換器返回與輸入序列在同一域中的去趨勢時間序列(例如去周期)。
代碼示例
時間序列預測
下面的例子改編自Github上的預測教程,本例中的系列(博克思-詹金斯法航空數據集)顯示了1949-1960年期間每月國際航空公司乘客的數量。
首先,加載數據並將其分為訓練集、測試集和圖表。sktime提供了兩個方便的函數來輕鬆完成此任務——temporal_train_test_splitfor按時間分割數據集,plot_ys用於繪製訓練和測試序列值。
from sktime.datasets import load_airline
fromsktime.forecasting.model_selection import temporal_train_test_split
fromsktime.utils.plotting.forecasting import plot_ys
y =load_airline()
y_train,y_test =temporal_train_test_split(y)
plot_ys(y_train,y_test, labels=["y_train", "y_test"])
在創建複雜的預測之前,將預測與一個簡單的基線進行比較會很有幫助——一個好的模型必須超過這個值。sktime提供NaiveForecaster方法,採用不同的「策略」生成基線預測。
下面的代碼和圖表展示了兩個天真預測。strategy = " last "預測器會預測序列的最後觀察值。strategy = " seasonal_last "預測器預測給定季節中觀察到的序列最後一個值。本例中的周期指定為「sp=12」,即12個月。
from sktime.forecasting.naive importNaiveForecaster
naive_forecaster_last =NaiveForecaster(strategy="last")
naive_forecaster_last.fit(y_train)
y_last=naive_forecaster_last.predict(fh)
naive_forecaster_seasonal =NaiveForecaster(strategy="seasonal_last",sp=12)
naive_forecaster_seasonal.fit(y_train)
y_seasonal_last=naive_forecaster_seasonal.predict(fh)
plot_ys(y_train,y_test, y_last, y_seasonal_last, labels=["y_train", "y_test", "y_pred_last", "y_pred_seasonal_last"]);
smape_loss(y_last, y_test)
>>0.231957
下一個預測片段顯示了如何用最小的工作量輕鬆、正確地調整現有的sklearn回歸器來完成預測任務。下方,Sktime的ReducedRegressionForecaste方法使用sklearnRandomForestRegressor模型對序列進行預測。在內部,Sktime將訓練數據分割成長度為12的窗口,以便回歸器進行訓練。
from sktime.forecasting.compose importReducedRegressionForecaster
fromsklearn.ensemble importRandomForestRegressor
fromsktime.forecasting.model_selection import temporal_train_test_split
fromsktime.performance_metrics.forecasting import smape_loss
regressor =RandomForestRegressor()
forecaster=ReducedRegressionForecaster(regressor,window_length=12)
forecaster.fit(y_train)
y_pred= forecaster.predict(fh)
plot_ys(y_train,y_test, y_pred, labels=['y_train', 'y_test', 'y_pred'])
smape_loss(y_test, y_pred)
sktime還包含本地預測方法,如AutoArima。
from sktime.forecasting.arima importAutoARIMA
forecaster=AutoARIMA(sp=12)
forecaster.fit(y_train)
y_pred = forecaster.predict(fh)
plot_ys(y_train,y_test, y_pred, labels=["y_train", "y_test", "y_pred"]);
smape_loss(y_test, y_pred)
>>0.07395319887252469
想要更全面地了解Sktime的預測功能,請查看Sktime預測教程。
時間序列的分類
最後,Sktime可以用於將時間序列劃分為不同的序列組。在下面的代碼示例中,單個時間序列的分類和scikit-learn中的分類一樣簡單,唯一的區別在於上面討論的嵌套時間序列數據結構。
from sktime.datasets import load_arrow_head
fromsktime.classification.compose importTimeSeriesForestClassifier
fromsklearn.model_selection import train_test_split
from sklearn.metricsimport accuracy_score
X, y =load_arrow_head(return_X_y=True)
X_train, X_test, y_train,y_test =train_test_split(X, y)
classifier=TimeSeriesForestClassifier()
classifier.fit(X_train, y_train)
y_pred= classifier.predict(X_test)
accuracy_score(y_test, y_pred)
>>0.8679245283018868
來源: https://pypi.org/project/sktime/
關於時間序列和sktime的基本介紹就到這裡啦,如果想要更全面地了解時間序列分類,請查看sktime單變量和多變量分類教程。
留言點讚關注
我們一起分享AI學習與發展的乾貨
如轉載,請後臺留言,遵守轉載規範