問題が2倍です。 I)train
はちょうどがglm()
経由モデルに適合していない)、それはそのモデルをブートストラップしますので、でもデフォルトで、train()
は問題IIと相まって、25個のブートストラップ標本を、行います(またはですa)とii)train()
は、ののデフォルト機能を単にglm()
と呼びます。そして、これらのデフォルトはモデルフレーム(引数model = TRUE
の?glm
)を格納することです。これにはモデルフレームスタイルのデータのコピーが含まれます。 train()
によって返されたオブジェクトは、すでにデータのコピーを$trainingData
に格納しており、"glm"
オブジェクトには$finalModel
も実際のデータのコピーを保持しています。
この時点で、単にtrain()
を用いglm()
を実行すると、完全に拡張model.frame
との25のコピーのすべてがリサンプリングプロセス中にメモリに保持する必要がある元のデータ、生成される - これらが同時に保持されているかどうかを、またはlapply()
コールでリサンプリングが行われるため、コードを簡単に見てすぐにはっきりと分かりません。生データのコピーも25個あります。
リサンプリングが終了すると、返されたオブジェクトには、生データのコピーが2つ、model.frame
の完全コピーが含まれます。訓練データが利用可能なRAMに比べて大きい場合や、model.frame
に展開する多くの要素が含まれている場合、データのコピーを持ち歩くだけの膨大なメモリを簡単に使用できます。
列車にmodel = FALSE
を追加すると、それが異なる場合があります。ここで?glm
でclotting
データを使用して小さな例です。
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
のすべてのコピーを保持するかどうかによって異なります。
train()
によって返されるオブジェクトも、glm()
によって返されるオブジェクトよりも大幅に大きくなります(後述の@DWinで説明されています)。
これをさらに詳しく調べるには、コードをもっと詳しく調べるか、または保守担当者Max Khhn(キャレット)に電子メールのフットプリントを減らすオプションを問い合わせてください。
他の人が試してみると小さな再現可能な例を作るのに気をつけますか? –