2

複数の GLM オブジェクトをリストに保存しようとしています。1 つの GLM オブジェクトが大規模なデータセットでトレーニングされますが、GLM オブジェクト内のすべての不要なデータを NULL に設定することで、オブジェクトのサイズが縮小されます。問題は、R が GLM オブジェクトのサイズよりもはるかに多くの RAM を予約するため、RAM の問題が発生することです。この問題が発生する理由と、これを解決する方法を誰かが知っていますか? この背後で、オブジェクトを保存すると、オブジェクト サイズよりも大きなファイルが生成されます。

例:

> glm_full <- glm(formula = formule , data = dataset, family = binomial(), model = F, y = F)
> glm_full$data <- glm_full$model <- glm_full$residuals <- glm_full$fitted.values <- glm_full$effects <- glm_full$qr$qr <- glm_full$linear.predictors <- glm_full$weights <- glm_full$prior.weights <- glm_full$y <- NULL
> rm(list= ls()[!(ls() %in% c('glm_full'))])
> object.size(glm_full)
172040 bytes
> gc()
           used  (Mb) gc trigger   (Mb)  max used   (Mb)
Ncells   944802  50.5    3677981  196.5   3862545  206.3
Vcells 83600126 637.9  503881514 3844.4 629722059 4804.4
> rm(glm_full)
> gc()
          used (Mb) gc trigger   (Mb)  max used   (Mb)
Ncells  944208 50.5    2942384  157.2   3862545  206.3
Vcells 4474439 34.2  403105211 3075.5 629722059 4804.4

ここでは、R が GLM オブジェクト用に RAM を予約していることがわかります。複数の GLM オブジェクトを環境に保存すると、RAM 不足の問題が発生します。

4

1 に答える 1

1

これの大まかな説明glmは、オブジェクトの奥深くglm(および多くの場所) で、環境および環境からのものへのポインターを隠すことです。

で何ができるようになる必要がありますglmか? モデルの多くの「脂肪」をなくしたとしても、オブジェクトのサイズはデータ サイズに比例して増加します。複数のglmオブジェクトを格納することでそれをさらに複雑にすると、RAM の制限にぶつかることは明らかな懸念事項です。

これは、必須ではないほとんどすべてのものをスライスできるようにする関数です。最良の部分はglm、データがどれだけ大きくなっても、オブジェクトのサイズが一定のままであることです。

stripGlmLR = function(cm) {
  cm$y = c()
  cm$model = c()

  cm$residuals = c()
  cm$fitted.values = c()
  cm$effects = c()
  cm$qr$qr = c()  
  cm$linear.predictors = c()
  cm$weights = c()
  cm$prior.weights = c()
  cm$data = c()


  cm$family$variance = c()
  cm$family$dev.resids = c()
  cm$family$aic = c()
  cm$family$validmu = c()
  cm$family$simulate = c()
  attr(cm$terms,".Environment") = c()
  attr(cm$formula,".Environment") = c()

  cm
}

いくつかのメモ:

model$family完全にnull にすることができ、predict関数は引き続きデフォルト値を返します (したがって、機能しますpredict(model, newdata = data)))。ただし、predict(model, newdata=data, type = 'response')失敗します。responseリンク値を逆リンク関数に渡すことでを復元できます。ロジスティック回帰の場合、これはシグモイド関数 ですsigmoid(x) = 1/(1 + exp(-x))。(よくわからないtype = 'terms')

predict最も重要なことは、モデルでやりたいこと以外のすべてのことはglm、簡素化されたバージョンでは失敗することです (したがってsummary()anova()、 、およびstep()はすべてダメです)。glmしたがって、オブジェクトからこの情報をすべて抽出してから関数を実行するのが賢明stripGlmLRです。

クレジット: Nina Zumelglmによる、オブジェクトのメモリ割り当てに関する素晴らしい分析

于 2015-08-22T18:54:55.953 に答える