問題は2つあります。i) を介してモデルを適合さtrain
せるだけでなく、そのモデルをブートストラップするため、デフォルトでも25のブートストラップサンプルを実行します。これは、問題ii)と相まって、問題の(または)原因であり、ii )デフォルトで関数を呼び出すだけです。そして、それらのデフォルトは、モデルフレーム(の引数)を格納することです。これには、モデルフレームスタイルのデータのコピーが含まれます。によって返されるオブジェクトは、にデータのコピーをすでに格納しており、のオブジェクトにも実際のデータのコピーがあります。glm()
train()
train()
glm()
model = TRUE
?glm
train()
$trainingData
"glm"
$finalModel
この時点で、をglm()
使用して実行するだけで、完全に拡張されtrain()
た元のデータの25コピーが生成されます。これらはすべて、リサンプリングプロセス中にメモリに保持する必要があります。これらが同時に保持されるか連続して保持されるかは、クイックルックからすぐにはわかりません。呼び出しでリサンプリングが行われるときにコードで。生データの25のコピーもあります。model.frame
lapply()
リサンプリングが完了すると、返されるオブジェクトには、生データの2つのコピーとの完全なコピーが含まれますmodel.frame
。トレーニングデータが使用可能なRAMに比べて大きい場合、またはで拡張される多くの要素が含まれているmodel.frame
場合は、データのコピーを持ち歩くだけで大量のメモリを簡単に使用できます。
model = FALSE
電車の呼び出しに追加すると、違いが生じる可能性があります。clotting
以下のデータを使用した小さな例を次に示し?glm
ます。
clotting <- data.frame(u = c(5,10,15,20,30,40,60,80,100),
lot1 = c(118,58,42,35,27,25,21,19,18),
lot2 = c(69,35,26,21,18,16,13,12,12))
require(caret)
それから
> m1 <- train(lot1 ~ log(u), data=clotting, family = Gamma, method = "glm",
+ model = TRUE)
Fitting: parameter=none
Aggregating results
Fitting model on full training set
> m2 <- train(lot1 ~ log(u), data=clotting, family = Gamma, method = "glm",
+ model = FALSE)
Fitting: parameter=none
Aggregating results
Fitting model on full training set
> object.size(m1)
121832 bytes
> object.size(m2)
116456 bytes
> ## ordinary glm() call:
> m3 <- glm(lot1 ~ log(u), data=clotting, family = Gamma)
> object.size(m3)
47272 bytes
> m4 <- glm(lot1 ~ log(u), data=clotting, family = Gamma, model = FALSE)
> object.size(m4)
42152 bytes
したがって、返されるオブジェクトにはサイズの違いがあり、トレーニング中のメモリ使用量は少なくなります。どれだけ低くなるかは、内部がリサンプリングプロセス中にtrain()
のすべてのコピーをmodel.frame
メモリに保持するかどうかによって異なります。
によって返されるオブジェクトも、以下のコメントで@DWinによって言及されているように、によって返されるオブジェクトtrain()
よりも大幅に大きくなります。glm()
これをさらに進めるには、コードをさらに詳しく調べるか、caretの保守者であるMax Kuhnに電子メールを送信して、メモリフットプリントを削減するためのオプションについて問い合わせてください。