Rに組み込まれたモデルの再利用


82

Rでモデルを作成する場合、新しいデータで再利用できるように、モデルの仕様をどのように保存しますか?履歴データにロジスティック回帰を作成したが、来月まで新しい観測値がない場合を考えてみましょう。最善のアプローチは何ですか?

私が考慮したこと:

  • モデルオブジェクトを保存し、新しいセッションにロードする
  • 一部のモデルはPMMLでエクスポートできることは知っていますが、PMMLのインポートについては実際には何も見ていません。

簡単に言うと、新しいセッションでモデルを使用する必要があるときに、あなたが何をしているのかを理解しようとしています。

前もって感謝します。


ええと、あなたはいつでもモデル式を「保存」して、data引数で更新されたデータを提供することができます...私があなたを正しく理解したと仮定して...
aL3xa 2011

うーん、再利用とはどういう意味ですか?新しい観測値を予測するか、新しい観測値と古い観測値を使用するようにモデルを更新しますか?
Gavin Simpson

@Gavin。開発したモデルを使用して、まだ持っておらず、しばらくは持っていない可能性のあるデータの新しい値を予測したいと思います。
btibert3 2011

1
@ Bitbert3 OK、それなら私の答えの冒頭のセクションは私がすることです。ディスクへのモデルオブジェクトを保存すると、より受け入れよりも、しかし、Rコード/スクリプトを保存することが重要であるあなたの研究/モデリングが再現可能であるように、最初の場所でモデルを生成するために使用されます。
Gavin Simpson

回答:


143

モデルを再利用して新しい観測値を予測する

モデルの計算コストが高くない場合は、モデル構築プロセス全体をRスクリプトで文書化し、必要に応じて再実行する傾向があります。モデルフィッティングにランダム要素が含まれている場合は、既知のランダムシードを設定するようにします。

モデルの計算に計算コストがかかる場合でも、上記のスクリプトを使用save()しますが、intoおよびrdaオブジェクトを使用してモデルオブジェクトを保存します。次に、保存されたオブジェクトが存在する場合はそれをロードするか、存在しない場合if()...elseはコードの関連部分をラップした単純な句を使用してモデルを再適合させるようにスクリプトを変更する傾向があります。

保存したモデルオブジェクトをロードするときは、必要なパッケージを必ずリロードしてください。ただし、ロジットモデルがを介して適合した場合、glm()Rを超えてロードする追加のパッケージはありません。

次に例を示します。

> set.seed(345)
> df <- data.frame(x = rnorm(20))
> df <- transform(df, y = 5 + (2.3 * x) + rnorm(20))
> ## model
> m1 <- lm(y ~ x, data = df)
> ## save this model
> save(m1, file = "my_model1.rda")
> 
> ## a month later, new observations are available: 
> newdf <- data.frame(x = rnorm(20))
> ## load the model
> load("my_model1.rda")
> ## predict for the new `x`s in `newdf`
> predict(m1, newdata = newdf)
        1         2         3         4         5         6 
6.1370366 6.5631503 2.9808845 5.2464261 4.6651015 3.4475255 
        7         8         9        10        11        12 
6.7961764 5.3592901 3.3691800 9.2506653 4.7562096 3.9067537 
       13        14        15        16        17        18 
2.0423691 2.4764664 3.7308918 6.9999064 2.0081902 0.3256407 
       19        20 
5.4247548 2.6906722 

これを自動化したい場合は、おそらくスクリプトで次のことを行います。

## data
df <- data.frame(x = rnorm(20))
df <- transform(df, y = 5 + (2.3 * x) + rnorm(20))

## check if model exists? If not, refit:
if(file.exists("my_model1.rda")) {
    ## load model
    load("my_model1.rda")
} else {
    ## (re)fit the model
    m1 <- lm(y ~ x, data = df)
}

## predict for new observations
## new observations
newdf <- data.frame(x = rnorm(20))
## predict
predict(m1, newdata = newdf)

もちろん、データ生成コードは、実際のデータをロードするコードに置き換えられます。

以前に適合したモデルを新しい観測値で更新する

追加の新しい観測値を使用してモデルを再適合させたい場合。次にupdate()、便利な機能です。1つ以上のモデル引数を更新してモデルを再適合させるだけです。モデルの適合に使用されるデータに新しい観測値を含める場合は、引数'data'に渡されたデータフレームに新しい観測値を追加してから、次の手順を実行します。

m2 <- update(m1, . ~ ., data = df)

ここではm1、元の、保存されたモデル適合され. ~ .、この場合、手段は、の左と右両側に、既存のすべての変数が含まれるモデル式が変更される~(換言すれば、モデル式に変更を加えない)、そしてdfあります元のモデルを適合させるために使用されるデータフレーム。新しく利用可能な観測値を含むように拡張されました。

これが実際の例です:

> set.seed(123)
> df <- data.frame(x = rnorm(20))
> df <- transform(df, y = 5 + (2.3 * x) + rnorm(20))
> ## model
> m1 <- lm(y ~ x, data = df)
> m1

Call:
lm(formula = y ~ x, data = df)

Coefficients:
(Intercept)            x  
      4.960        2.222  

> 
> ## new observations
> newdf <- data.frame(x = rnorm(20))
> newdf <- transform(newdf, y = 5 + (2.3 * x) + rnorm(20))
> ## add on to df
> df <- rbind(df, newdf)
> 
> ## update model fit
> m2 <- update(m1, . ~ ., data = df)
> m2

Call:
lm(formula = y ~ x, data = df)

Coefficients:
(Intercept)            x  
      4.928        2.187

他の人はコメントformula()で言及しました、それは適合されたモデルから式を抽出します:

> formula(m1)
y ~ x
> ## which can be used to set-up a new model call
> ## so an alternative to update() above is:
> m3 <- lm(formula(m1), data = df)

ただし、モデルフィッティングに、などの追加の引数'family'、または'subset'より複雑なモデルフィッティング関数の引数が含まれる場合。update()モデルフィッティング関数にメソッドが使用できる場合(のような多くの一般的なフィッティング関数に使用できますglm())、モデル式を抽出して再利用するよりも簡単にモデルフィッティングを更新できます。

Rですべてのモデリングと将来の予測を行うつもりなら、PMMLなどを介してモデルを抽象化することにはあまり意味がないようです。


1
+1そしてあなたが私が準備していたどんな答えにも合うようにあなたの答えを編集することに親切に抵抗するなら...
;

@ジョリスは雌犬を予知していません!;-) +1 for updateme
Gavin Simpson

1
これは本当に素晴らしい答えです。誰かがこのようなSO [r]の回答をキュレートし、チュートリアルとしてまとめてくれることを願っています。
JDロング

1
素晴らしい答え。あなたが与えた例をありがとう。
nhern121 2012年

1
まさに私が探していたもの。+1000したい…ありがとう
Adjeiinfo 2015

7

データフレームと変数の同じ名前を使用する場合は、次のことができます(少なくとも lm()およびglm())関数を使用するupdate保存されたモデルに:

Df <- data.frame(X=1:10,Y=(1:10)+rnorm(10))

model <- lm(Y~X,data=Df)
model

Df <- rbind(Df,data.frame(X=2:11,Y=(10:1)+rnorm(10)))

update(model)

これは、データの準備などがなければコース外です。モデル仕様セットを再利用するだけです。その間にコントラストを変更すると、新しいモデルは古いものではなく新しいコントラストで更新されることに注意してください。

したがって、ほとんどの場合、スクリプトを使用する方が適切です。データフレームを取得するだけの便利な関数にすべてのステップを含めることができるため、スクリプトを入手して、新しいデータセットで関数を使用できます。そのためのギャビンの答えも参照してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.