時系列データに基づいて機械学習を使用して予測を試みました。 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)
私の理解は:
私のデータは時系列なので、データをトレーニングとテストセットに分割するためにブートストラップを使用できないと思います。だから、私の質問は:私は正しいですか?もしそうなら-モデル評価にcreateTimeSlicesを使用する方法?
投稿した元の質問が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.
お役に立てれば!!
Shambhoの回答は、TimeSlicesでキャレットパッケージを使用する方法の適切な例を提供していますが、モデリング手法に関して誤解を招く可能性があります。したがって、時系列の予測モデリングにキャレットパッケージを使用したい将来の読者を誤解しないようにするために(ここで私は自己回帰モデルを意味しない)、いくつかのことを強調したいと思います。
時系列データの問題は、注意しないと先読みバイアスが容易になることです。この場合、経済データセットは、リリース日ではなく、経済報告日にデータを調整しています。これは、実際のライブアプリケーションには当てはまりません(経済データポイントには異なるタイムスタンプがあります)。失業率のデータは、リリース日に関して他の指標より2か月遅れている可能性があり、その場合はShambhoの例にモデルバイアスが導入されます。
次に、この例は記述統計のみであり、予測(予測)ではないデータを予測(予測)しないため、予測(予測)ではありません。同じ経済レポートの日付の予測変数に基づいて、失業の変動(この場合も、モデリングプロセスであらゆる種類の問題を作成する定常時系列です)を最もよく説明するモデルをトレーニングするだけです。
最後に、この例の12か月の期間は、Hyndmanが例で行うように、真の複数期間予測ではありません。
実際にできます!
まず、お伝えします このトピックに関する学術記事 。
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