8

R にベクトル/リスト/配列などにオブジェクトを配置する機能があるかどうかに興味があります。randomforest パッケージを使用して、より大きなデータのサブセットを処理しており、各バージョンをリストに保存したいと考えています。これは次のようになります。

answers <- c()
for(i in 1:10){
x <- round((1/i), 3)
answers <- (rbind(answers, x))
}

理想的には、次のようなことをしたいと思います。

answers <- c()
for(i in 1:10){
RF <- randomForest(training, training$data1, sampsize=c(100), do.trace=TRUE, importance=TRUE, ntree=50,,forest=TRUE)
answers <- (rbind(answers, RF))
}

この種の作品ですが、単一の RF オブジェクトの出力は次のとおりです。

> RF 

Call:
 randomForest(x = training, y = training$data1, ntree = 50, sampsize = c(100), importance = TRUE, do.trace = TRUE,      forest = TRUE) 
               Type of random forest: regression
                     Number of trees: 10
No. of variables tried at each split: 2

          Mean of squared residuals: 0.05343956
                    % Var explained: 14.32

これは「回答」リストの出力ですが、

> answers 
   call       type         predicted      mse        rsq        oob.times      importance importanceSD
RF Expression "regression" Numeric,150000 Numeric,10 Numeric,10 Integer,150000 Numeric,16 Numeric,8   
RF Expression "regression" Numeric,150000 Numeric,10 Numeric,10 Integer,150000 Numeric,16 Numeric,8   
RF Expression "regression" Numeric,150000 Numeric,10 Numeric,10 Integer,150000 Numeric,16 Numeric,8   
RF Expression "regression" Numeric,150000 Numeric,10 Numeric,10 Integer,150000 Numeric,16 Numeric,8   
RF Expression "regression" Numeric,150000 Numeric,10 Numeric,10 Integer,150000 Numeric,16 Numeric,8   
RF Expression "regression" Numeric,150000 Numeric,10 Numeric,10 Integer,150000 Numeric,16 Numeric,8   
RF Expression "regression" Numeric,150000 Numeric,10 Numeric,10 Integer,150000 Numeric,16 Numeric,8   
RF Expression "regression" Numeric,150000 Numeric,10 Numeric,10 Integer,150000 Numeric,16 Numeric,8   
RF Expression "regression" Numeric,150000 Numeric,10 Numeric,10 Integer,150000 Numeric,16 Numeric,8   
RF Expression "regression" Numeric,150000 Numeric,10 Numeric,10 Integer,150000 Numeric,16 Numeric,8   
   localImportance proximity ntree mtry forest  coefs y              test inbag
RF NULL            NULL      10    2    List,11 NULL  Integer,150000 NULL NULL 
RF NULL            NULL      10    2    List,11 NULL  Integer,150000 NULL NULL 
RF NULL            NULL      10    2    List,11 NULL  Integer,150000 NULL NULL 
RF NULL            NULL      10    2    List,11 NULL  Integer,150000 NULL NULL 
RF NULL            NULL      10    2    List,11 NULL  Integer,150000 NULL NULL 
RF NULL            NULL      10    2    List,11 NULL  Integer,150000 NULL NULL 
RF NULL            NULL      10    2    List,11 NULL  Integer,150000 NULL NULL 
RF NULL            NULL      10    2    List,11 NULL  Integer,150000 NULL NULL 
RF NULL            NULL      10    2    List,11 NULL  Integer,150000 NULL NULL 
RF NULL            NULL      10    2    List,11 NULL  Integer,150000 NULL NULL 

保存された情報が単一の RF オブジェクトと同じになるように、すべての RF オブジェクトを保存する方法またはそれらを呼び出す方法を知っている人はいますか? 提案をありがとう。

4

4 に答える 4

11

一度に 1 要素ずつベクトルまたはリストを大きくしないでください。それらを事前に割り当てて、オブジェクトを特定のパーツに割り当てます。

answers <- vector("list",10)
for (i in 1:10){
    answers[[i]] <- randomForest(training, training$data1, sampsize=c(100), 
                                 do.trace=TRUE, importance=TRUE, ntree=50,
                                 forest=TRUE)
}

ちなみに、ベクトルをrbinding しても別のベクトルやリストは作成されません。最初の例で出力を確認すると、1 列の行列であることがわかります。rbindこれは、 randomForest オブジェクトを一緒にしようとしたときに観察される奇妙な動作を説明しています。

于 2011-10-19T02:46:32.800 に答える
5

使用lapply

lapply(1:10,function(i) randomForest(<your parameters>))

ランダムフォレストオブジェクトのリストが表示されます。[[]]その後、演算子を使用してそれらのi番目にアクセスできます。

于 2011-10-19T09:09:04.987 に答える
3

リストを次のように初期化します。

mylist <- vector("list")  # technically all objects in R are vectors

それに追加します:

new_element <- 5
mylist <- c(mylist, new_element)

事前割り当てに関する @joran のアドバイスは、リストが大きい場合は適切ですが、リストが小さい場合は完全に必要というわけではありません。元のコードで作成したマトリックスにアクセスすることもできます。少し奇妙に見えますが、情報はすべてそこにあります。たとえば、そのリストのマトリックスの最初の要素は、次のように復元できます。

answers[1, ]
于 2011-10-19T03:04:40.050 に答える
0

他の回答では、ランダム フォレスト オブジェクトを に格納するソリューションが提供されてlistいますが、それらが機能している理由は説明されていません。

@ 42- が示唆しているように、これはここで問題を解決する事前割り当てステップではありません。

本当の問題は、randomForestオブジェクトが基本的にlist(check is.list(randomForest(...)) であることです。次のようなステートメントを書く場合:

list_of_rf = c()                                       # ... or list_of_rf = NULL
list_of_rf = rbind(list_of_rf, randomForest(...))      # ... or list_of_rf = c(list_of_rf, randomForest(...))

基本的に、空のオブジェクトとリストを連結するよう求めています。長さ 1 のリスト (ランダム フォレスト モデル) になる代わりに、このステートメントはすべてのランダム フォレスト モデル コンポーネントを含むリストになります! これを確認するには、R コンソールに次のように入力します。

> 長さ(list_of_rf)

[1] 19

R に必要な操作を強制的に実行させるには、いくつかの方法があります。

  1. リスト内の明示的な影響 (事前に割り当てる必要はありませんが、@joran の回答を参照):

    list_of_rf = NULL
    list_of_rf[[1]] = randomForest(...)
    
  2. lapply(または同様の)リストを作成します(@mbqの回答を参照):

    list_of_rf = lapply(..., function(i) randomForest(...))
    
  3. リスト内のランダム フォレストをカプセル化します。これは、連結中に簡略化されます。

    list_of_rf = NULL
    list_of_rf = c(list_of_rf, list(randomForest(...)))
    

最後に、間違って計算に 10 時間かかった randomForest モデルを非公開にした場合でも、次のようにして復元できます。

list_of_rf = NULL
list_of_rf = c(list_of_rf, randomForest(...)) # oups, mistake
rf = as.vector(list_of_rf)[1:19]
class(rf) = 'randomForest'
于 2015-12-10T01:42:08.757 に答える