より一般的な用語で質問に答えるために、機械学習を使用してh-steps-ahead予測を予測することができます。トリッキーな部分は、データをその中にあるマトリックスに再形成しなければならないことです。観測ごとに、観測の実際の値と定義された範囲の時系列の過去の値です。実際にARIMAモデルをパラメーター化する場合と同様に、時系列の予測に関連すると思われるデータの範囲を手動で定義する必要があります。マトリックスの幅/水平線は、マトリックスが取る次の値を正しく予測するために重要です。地平線が制限されている場合、季節性の影響を見逃す可能性があります。
これを実行したら、hステップ先を予測するには、最後の観測に基づいて最初の次の値を予測する必要があります。次に、ARIMAモデルと同様に、予測を「実際の値」として保存する必要があります。これを使用して、タイムシフトによって2番目の次の値を予測します。h-steps-aheadを取得するには、プロセスをh回繰り返す必要があります。各反復は前の予測に依存します。
Rコードを使用した例は次のようになります。
library(forecast)
library(randomForest)
# create a daily pattern with random variations
myts <- ts(rep(c(5,6,7,8,11,13,14,15,16,15,14,17,13,12,15,13,12,12,11,10,9,8,7,6), 10)*runif(120,0.8,1.2), freq = 24)
myts_forecast <- forecast(myts, h = 24) # predict the time-series using ets + stl techniques
pred1 <- c(myts, myts_forecast1$mean) # store the prediction
# transform these observations into a matrix with the last 24 past values
idx <- c(1:24)
designmat <- data.frame(lapply(idx, function(x) myts[x:(215+x)])) # create a design matrix
colnames(designmat) <- c(paste0("x_",as.character(c(1:23))),"y")
# create a random forest model and predict iteratively each value
rfModel <- randomForest(y ~., designmat)
for (i in 1:24){
designvec <- data.frame(c(designmat[nrow(designmat), 2:24], 0))
colnames(designvec) <- colnames(designmat)
designvec$y <- predict(rfModel, designvec)
designmat <- rbind(designmat, designvec)
}
pred2 <- designmat$y
#plot to compare predictions
plot(pred1, type = "l")
lines(y = pred2[216:240], x = c(240:264), col = 2)
明らかに、時系列モデルと機械学習モデルのどちらがより効率的かを決定する一般的なルールはありません。機械学習モデルの場合、計算時間は長くなる可能性がありますが、一方で、それらを使用して時系列を予測するために、任意のタイプの追加機能を含めることができます(たとえば、数値または論理機能だけでなく)。一般的なアドバイスは、両方をテストし、最も効率的なモデルを選択することです。