web-dev-qa-db-ja.com

時系列-データ分割とモデル評価

時系列データに基づいて機械学習を使用して予測を試みました。 stackoverflowの質問( RのCARETパッケージのcreateTimeSlices関数 )の1つは、createTimeSlicesを使用してモデルのトレーニングとパラメーターの調整の交差検証を行う例です。

    library(caret)
    library(ggplot2)
    library(pls)
    data(economics)
    myTimeControl <- trainControl(method = "timeslice",
                                  initialWindow = 36,
                                  horizon = 12,
                                  fixedWindow = TRUE)

    plsFitTime <- train(unemploy ~ pce + pop + psavert,
                        data = economics,
                        method = "pls",
                        preProc = c("center", "scale"),
                        trControl = myTimeControl)

私の理解は:

  1. Mayデータをトレーニングとテストセットに分割する必要があります。
  2. パラメータの調整にはトレーニングセットを使用します。
  3. テストセットで取得したモデルを評価する(R2、RMSEなどを使用)

私のデータは時系列なので、データをトレーニングとテストセットに分割するためにブートストラップを使用できないと思います。だから、私の質問は:私は正しいですか?もしそうなら-モデル評価にcreateTimeSlicesを使用する方法?

18
Jot eN

投稿した元の質問がtimeSlicingを処理し、手動でtimeSliceを作成する必要がないことに注意してください。

ただし、ここでは、createTimeSlicesを使用してデータを分割し、モデルのトレーニングとテストに使用する方法を示します。

ステップ0:データのセットアップとtrainControl :(質問から)

library(caret)
library(ggplot2)
library(pls)

data(economics)

手順1:データのインデックスのtimeSliceを作成します。

timeSlices <- createTimeSlices(1:nrow(economics), 
                   initialWindow = 36, horizon = 12, fixedWindow = TRUE)

これにより、timeSlicesのトレーニングとテストのリストが作成されます。

> str(timeSlices,max.level = 1)
## List of 2
## $ train:List of 431
##   .. [list output truncated]
## $ test :List of 431
##   .. [list output truncated]

理解を容易にするために、それらを別々の変数に保存しています。

trainSlices <- timeSlices[[1]]
testSlices <- timeSlices[[2]]

ステップ2:trainSlicesの最初のトレーニング:

plsFitTime <- train(unemploy ~ pce + pop + psavert,
                    data = economics[trainSlices[[1]],],
                    method = "pls",
                    preProc = c("center", "scale"))

ステップ3:trainSlicesの最初のテスト:

pred <- predict(plsFitTime,economics[testSlices[[1]],])

ステップ4:プロット:

true <- economics$unemploy[testSlices[[1]]]

plot(true, col = "red", ylab = "true (red) , pred (blue)", ylim = range(c(pred,true)))
points(pred, col = "blue") 

その後、すべてのスライスに対してこれを行うことができます。

for(i in 1:length(trainSlices)){
  plsFitTime <- train(unemploy ~ pce + pop + psavert,
                      data = economics[trainSlices[[i]],],
                      method = "pls",
                      preProc = c("center", "scale"))
  pred <- predict(plsFitTime,economics[testSlices[[i]],])


  true <- economics$unemploy[testSlices[[i]]]
  plot(true, col = "red", ylab = "true (red) , pred (blue)", 
            main = i, ylim = range(c(pred,true)))
  points(pred, col = "blue") 
}

前述のように、この種のtimeSlicingは、元の関数によって1つのステップで実行されます。

> myTimeControl <- trainControl(method = "timeslice",
+                               initialWindow = 36,
+                               horizon = 12,
+                               fixedWindow = TRUE)
> 
> plsFitTime <- train(unemploy ~ pce + pop + psavert,
+                     data = economics,
+                     method = "pls",
+                     preProc = c("center", "scale"),
+                     trControl = myTimeControl)
> plsFitTime
Partial Least Squares 

478 samples
  5 predictors

Pre-processing: centered, scaled 
Resampling: Rolling Forecasting Origin Resampling (12 held-out with a fixed window) 

Summary of sample sizes: 36, 36, 36, 36, 36, 36, ... 

Resampling results across tuning parameters:

  ncomp  RMSE  Rsquared  RMSE SD  Rsquared SD
  1      1080  0.443     796      0.297      
  2      1090  0.43      845      0.295      

RMSE was used to select the optimal model using  the smallest value.
The final value used for the model was ncomp = 1. 

お役に立てれば!!

38
Shambho

Shambhoの回答は、TimeSlicesでキャレットパッケージを使用する方法の適切な例を提供していますが、モデリング手法に関して誤解を招く可能性があります。したがって、時系列の予測モデリングにキャレットパッケージを使用したい将来の読者を誤解しないようにするために(ここで私は自己回帰モデルを意味しない)、いくつかのことを強調したいと思います。

時系列データの問題は、注意しないと先読みバイアスが容易になることです。この場合、経済データセットは、リリース日ではなく、経済報告日にデータを調整しています。これは、実際のライブアプリケーションには当てはまりません(経済データポイントには異なるタイムスタンプがあります)。失業率のデータは、リリース日に関して他の指標より2か月遅れている可能性があり、その場合はShambhoの例にモデルバイアスが導入されます。

次に、この例は記述統計のみであり、予測(予測)ではないデータを予測(予測)しないため、予測(予測)ではありません。同じ経済レポートの日付の予測変数に基づいて、失業の変動(この場合も、モデリングプロセスであらゆる種類の問題を作成する定常時系列です)を最もよく説明するモデルをトレーニングするだけです。

最後に、この例の12か月の期間は、Hyndmanが例で行うように、真の複数期間予測ではありません。

時系列の相互検証のヒントマン

5
P. Garnry

実際にできます!

まず、お伝えします このトピックに関する学術記事

R:

パッケージcaretを使用すると、createResampleを使用して単純なbootstrapサンプルを作成でき、createFoldsを使用してバランスのとれた相互検証グループを生成できます。データのセットから。したがって、おそらくcreateResampleを使用する必要があります。ここでは、その使用例を示します。

data(oil)
createDataPartition(oilType, 2)

x <- rgamma(50, 3, .5)
inA <- createDataPartition(x, list = FALSE)

plot(density(x[inA]))
rug(x[inA])

points(density(x[-inA]), type = "l", col = 4)
rug(x[-inA], col = 4)

createResample(oilType, 2)

createFolds(oilType, 10)
createFolds(oilType, 5, FALSE)

createFolds(rnorm(21))

createTimeSlices(1:9, 5, 1, fixedWindow = FALSE)
createTimeSlices(1:9, 5, 1, fixedWindow = TRUE)
createTimeSlices(1:9, 5, 3, fixedWindow = TRUE)
createTimeSlices(1:9, 5, 3, fixedWindow = FALSE)

createResample関数に表示される値は、作成するパーティションとデータの数、この場合は2です。さらに、結果をlist = TRUEまたはlist = FALSEでリストとして保存するかどうかを指定できます。

さらに、caretには、このタイプの分割のインデックスを作成できるcreateTimeSlicesという関数が含まれています。

このタイプの分割の3つのパラメーターは次のとおりです。

  • initialWindow:各トレーニングセットサンプルの連続する値の初期数
  • horizon:テストセットサンプル内の連続する値の数
  • fixedWindow:論理値:FALSEの場合、トレーニングセットは常に最初のサンプルから始まり、トレーニングセットのサイズはデータ分割によって異なります。

使用法:

createDataPartition(y, 
                    times = 1,
                    p = 0.5,
                    list = TRUE,
                    groups = min(5, length(y)))
createResample(y, times = 10, list = TRUE)
createFolds(y, k = 10, list = TRUE, returnTrain = FALSE)
createMultiFolds(y, k = 10, times = 5)
createTimeSlices(y, initialWindow, horizon = 1, fixedWindow = TRUE)

出典:

http://caret.r-forge.r-project.org/splitting.html

http://eranraviv.com/blog/bootstrapping-time-series-r-code/

http://rgm3.lab.nig.ac.jp/RGM/R_rdfile?f=caret/man/createDataPartition.Rd&d=R_CC

CARET。データ分割とtrainControlの関係

2
Hack-R