2017-11-14 6 views
0

いくつかの異なる線形モデルを比較したいデータがあります。私はcaTools::sample.split()を使って1つのトレーニング/テストセットを得ることができます。同じサンプルから異なるテストとトレーニングセットを取得する

同じサンプルの別のトレーニング/テストセットを使用した場合、モデルがどのように変化するかを知りたいと思います。 set.seed()を使用しない場合は、sample.splitと呼び出すたびに別のセットを取得する必要があります。

私は今、関数に特定の回数を呼び出すためにlapplyを使用しています:

library(data.table) 
library(caTools) 
dat <- as.data.table(iris) 
dat_list <- lapply(1:20, function(z) { 
    sample_indices <- sample.split(dat$Sepal.Length, SplitRatio = 3/4) 
    inter <- dat 
    inter$typ <- "test" 
    inter$typ[sample_indices] <- "train" 
    inter$set_no <- z 
    return(as.data.table(inter))}) 

と係数を比較する:

coefs <- sapply(1:20, function(z){ 
    m <- lm(Sepal.Length ~ Sepal.Width, data = dat_list[[z]][typ == "train"]) 
    return(unname(m$coefficients)) 
}) 

最後の数行を返すように編集することができテストセット(typ=="test")の値を予測するときのRMSエラー

もっと良い方法があるのでしょうか?

+0

より良い方法は何ですか?データを複数回に分割する?係数を比較する?問題に近づく?私はあなたが大丈夫だと言うでしょう、そして結果に満足すれば、一緒に移動してください!代わりにk-foldクロスバリデーションに興味があるかもしれません。これはもっと一般的であり、同様の目標を共有しています。あなたは 'キャレット 'を使って自動的にそれを行うことができます。 – Gregor

+0

ありがとう!私はデータを効率的に分割することに興味があります(私の実際のデータセットはかなり大きい)。私はまた、この方法でモデルを比較するための標準的な方法があるかどうかを知りたいと思っています - あなたが言及したk-foldメソッドを調べます。私の統計知識は悲しいかなか貧弱です。 – Gautam

答えて

0

私は、データフレームのリストの巨大な支持者だけど、それが意味がありません(私の実際のデータセットがかなり大きい)

効率的にデータを分割するに興味がありますデータをリストに複製します。特に大量のデータの場合は、20個のトレインテスト分割を行うために20個のデータをコピーする必要はありません。

代わりに、列車とテストセットのインデックスを保存し、適切なサブセットをモデルに与えます。

n = 5 
train_ind = replicate(n = n, sample(nrow(iris), size = 0.75 * nrow(iris)), simplify = FALSE) 
test_ind = lapply(train_ind, function(x) setdiff(1:nrow(iris), x)) 

# then modify your loop to subset the right rows 
coefs <- sapply(seq_len(n), function(z) { 
    m <- lm(Sepal.Length ~ Sepal.Width, data = iris[train_ind[[z]], ]) 
    return(m$coefficients) 
}) 

複数回使用されているものをパラメータ化することも有効です。 20個の複製に変更する場合は、コードを設定してn = 20を先頭に変更し、5を使用して20に変更するたびに、すべてを調べる必要はありません。 split_ratio = 0.75を取り出して一度しか使用されていなくても、その上に自分の行を置くといいかもしれません。

+0

良いアイデア、私は代わりにインデックスを保存します!今はモデルを比較することです。 – Gautam

関連する問題