パブリケーションでランダムフォレストを表示する最良の方法は?


75

私は、ランダムフォレストアルゴリズムを、1000種類の特徴を持つマイクロアレイ研究の2つのグループの堅牢な分類子として使用しています。

  • ランダムフォレストを提示して、それを論文で再現可能にするのに十分な情報があるようにする最良の方法は何ですか?
  • フィーチャの数が少ない場合、実際にツリーをプロットするRのプロットメソッドはありますか?
  • エラー率のOOB推定は、引用するのに最適な統計ですか?

2
単一のツリーはありません...しかし、説明のためにそれらの1つをプロットする@Shaneの応答を参照してください。
-chl

randomForest :: partialPlot、stats.stackexchange.com
Soren Havelund Welling

1
私のランダムな森林可視化パッケージ、forestFloor- forestfloor.dk
Soren Havelund Welling

回答:


48

それを再現可能にすることに関して、最良の方法は、論文とともに再現可能な研究(すなわち、コードとデータ)を提供することです。Webサイトまたはホスティングサイト(githubなど)で利用できるようにします。

視覚化に関しては、Leo Breimanがこれについていくつかの興味深い研究を行っています(彼のホームページ、特にグラフィックスセクションを参照)。

しかし、Rを使用している場合、randomForestパッケージにはいくつかの便利な機能があります。

data(mtcars)
mtcars.rf <- randomForest(mpg ~ ., data=mtcars, ntree=1000, keep.forest=FALSE,
                           importance=TRUE)
plot(mtcars.rf, log="y")
varImpPlot(mtcars.rf)

そして

set.seed(1)
data(iris)
iris.rf <- randomForest(Species ~ ., iris, proximity=TRUE,
                        keep.forest=FALSE)
MDSplot(iris.rf, iris$Species)

実際にツリーをプロットする簡単な方法を知りませんが、このgetTree関数を使用してツリーを取得し、それを個別にプロットできます。

getTree(randomForest(iris[,-5], iris[,5], ntree=10), 3, labelVar=TRUE)

「なぜ、どのようにランダムフォレスト変数重要度指標(とどのようにすべきでない)を使用する」にシュトローブル/ Zeileisプレゼンテーションは、このようにして製造されている必要があります木の例があります。ツリーモデルに関するこのブログ投稿には、たとえば使用できるCARTツリープロットの良い例がいくつかあります。

@chlがコメントしたように、単一のツリーはこのコンテキストでは特に意味がありません。そのため、ランダムフォレストとは何かを説明するためにそれを使用する以外は、これを論文に含めません。


4
プロットに関する小さな拡張:plot.randomForestツリーの数が増えるにつれてOOBエラーとクラス内OOBエラーがどのように進化したかを示します。varImpPlotMDSplot、RFオブジェクトの近接度測定の2D投影でプロットされた最上位の属性とすべてのオブジェクトの属性重要度を示しています。

MDSplot()関数を引用するための+1 。最適な機能を選択するのではなく、RFを個人のクラスター(RF近接度測定に基づいて)を強調する方法としてよく使用することを認めなければなりません。臨床医は多くの場合、varのドットプロットよりもこのようなプロットを非常に簡単に読み取ります。重要
...-chl

18
  1. シェーンが書いたように。RFは確率的であるため、再現可能な研究に加えて、ランダムシードを含めます。
  2. まず、RFを形成する単一のツリーをプロットするのはナンセンスです。これはアンサンブル分類器であり、全体としてのみ意味があります。しかし、フォレスト全体をプロットすることはナンセンスです。これはブラックボックス分類子であるため、データをその構造で説明することを目的としておらず、むしろ元のプロセスを複製することを目的としています。代わりに、シェーンが提案したプロットをいくつか作成してください。
  3. 実際には、OOBは非常に優れたエラー近似です。しかし、これは広く受け入れられている事実ではないため、公開するためには、履歴書を作成して確認することをお勧めします。

したがって、CVを実行するときの@mbqは、最初にすべてのサンプルが選択されたランダムフォレストを実行するのに有効です。すべてで2回、次に上位10個の変数で2回実行します(論文で引用できます)。次に、残余交差検証(各試行で上位10個の遺伝子を選択)を実行し、そこからCVエラーを引用しますか?
ダニエルズブリューワー

1
@danielsbrewer他の方法でこれを行います(機能の選択にもっと注意を払います)が、これは正しいです。それでも、生物学的問題に最適なマーカーを選択するというよりも、RF機能選択のベンチマークのトピックに関するものです。

2
主な問題は、2つのモデル(model = learning method + feature selection method)を比較するのが本当に難しいことですが、簡単にするために、何かを仮定して(RFを使用して上位10個の属性を選択するなど)、あなたが知っていることを認めますこれは最適ではないかもしれないが、例えば正確さに満足している間にあなたはそれに同意する。その場合、あなたの唯一の問題は属性選択の偏りを取り除くことです。tbc。

2
そこで、単純なバギングを行います:オブジェクトのランダムサブサンプルを10個(または優れたコンピューターをお持ちの場合は30個)作成し(置き換えでランダムに選択してみましょう)、それぞれのRFをトレーニングし、重要度を取得し、それぞれのランクを返しますすべての繰り返しで平均化された属性(最高の属性はランク1、2番目に良い2などを取得します。1回目の12倍と2回目の18倍の属性は1.6のランクになるように平均化できます)あなたのマーカー。次に、CV(LOO、10倍またはできればランダムサンプリング)を使用して、マーカーを使用してRFの誤差近似を取得します。tbc。

2
ランク(うまくいけば1,2,3 ...にかなり近いはずです)、偏差のあるCVエラー(各CVラウンドの結果の標準偏差を数えるだけです)、およびOOBエラー(おそらくCVエラーと同じです)を報告します。免責事項:これは、最適な数の属性を選択する方法ではありません。そのためには、RFEとネストされたCVが必要です。免責事項2:私はそのようなデータを扱ったことがないので、あなたの審判がそれで満足することを保証しません(彼らはそうすべきだと思いますが)。

13

プロットが必然的に意味を持つことに関する他の回答の警告に留意してください。しかし、説明/教育目的のプロットが必要な場合は、次のRのスニペットが役に立つかもしれません。必要に応じて、エッジテキストに「スプリットポイント」を追加するのは難しくありません。

to.dendrogram <- function(dfrep,rownum=1,height.increment=0.1){

  if(dfrep[rownum,'status'] == -1){
    rval <- list()

    attr(rval,"members") <- 1
    attr(rval,"height") <- 0.0
    attr(rval,"label") <- dfrep[rownum,'prediction']
    attr(rval,"leaf") <- TRUE

  }else{##note the change "to.dendrogram" and not "to.dendogram"
    left <- to.dendrogram(dfrep,dfrep[rownum,'left daughter'],height.increment)
    right <- to.dendrogram(dfrep,dfrep[rownum,'right daughter'],height.increment)
    rval <- list(left,right)

    attr(rval,"members") <- attr(left,"members") + attr(right,"members")
    attr(rval,"height") <- max(attr(left,"height"),attr(right,"height")) + height.increment
    attr(rval,"leaf") <- FALSE
    attr(rval,"edgetext") <- dfrep[rownum,'split var']
    #To add Split Point in Dendrogram
    #attr(rval,"edgetext") <- paste(dfrep[rownum,'split var'],"\n<",round(dfrep[rownum,'split point'], digits = 2),"=>", sep = " ")
  }

  class(rval) <- "dendrogram"

  return(rval)
}

mod <- randomForest(Species ~ .,data=iris)
tree <- getTree(mod,1,labelVar=TRUE)

d <- to.dendrogram(tree)
str(d)
plot(d,center=TRUE,leaflab='none',edgePar=list(t.cex=1,p.col=NA,p.lty=0))

1
コードは非常に良いツリープロットを生成します。ただし、値は表示されていません。おそらく、最後の(プロット)ステートメントの後にtext()関数を追加する必要があります。
-rnso
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.