0

r のランダム フォレストに基づいて分類器を構築しようとしています。

これを再現するコード:

    library(quantmod)
    library(randomForest)

    getSymbols('^GSPC', from="2002-01-01") 
    GSPC <- GSPC[,1:5] # remove adjusted close
    GSPC$wkret <- lag(GSPC$GSPC.Close,-5)/GSPC$GSPC.Close # build weekly future return
    GSPC$wkret <- GSPC$wkret * 100 -100 # build index

    cutoff <- floor(dim(GSPC)[1]/4) # select the row at 25%
    cutoffbreak <- sort(abs(as.data.frame(GSPC$wkret)[,1]),decreasing=T)[cutoff] # get the top 25% return in absolute terms
    y <- cut(GSPC$wkret, breaks=c('-100',-cutoffbreak,cutoffbreak ,'100'),labels=c('down','','up')) # build factors 
    randomForest(GSPC[1:100],y[1:100]) # select first 100 to exclude NA's, dimension problems.

これは機能します:

y[1:100]
[1]                                                                                      down      down down
 [22]                up   up        down      down                          up   up   up   up 
=== zip ===

> is.factor(y)
[1] TRUE

> x[1:100]
              open    high     low   close     volume
2002-01-02 1148.08 1154.67 1136.23 1154.67 1171000000
2002-01-03 1154.67 1165.27 1154.01 1165.27 1398900000
2002-01-04 1165.27 1176.55 1163.42 1172.51 1513000000
2002-01-07 1172.51 1176.97 1163.55 1164.89 1308300000
=== zip ===

> class(x)
[1] "xts" "zoo"

これは機能します(もちろん意味はありません):

lm(y[1:100] ~ .,data=x[1:100])

しかし、ランダムフォレストを構築すると、次のようになります。

> rf <- randomForest(y[1:100] ~ .,data=x[1:100])
Error in randomForest.default(m, y, ...) : subscript out of bounds

> traceback()
4: randomForest.default(m, y, ...)
3: randomForest(m, y, ...)
2: randomForest.formula(y[1:100] ~ ., data = x[1:100])
1: randomForest(y[1:100] ~ ., data = x[1:100])

グーグルで調べてみると、これは寸法の問題ですが、理由/方法がわかりません。

バージョン:

R.version _
platform i686-pc-linux-gnu
arch i686
os linux-gnu
system i686, linux-gnu
status
major 2
minor 15.1
year 2012
month 06
day 22
svn rev 59600
language R
version.string R version 2.15.1 (2012 -06-22) 愛称 焼きマシュマロ

ライブラリのバージョン:

    randomForest version: "2.15.1"
    quantmod version: "2.15.1"
4

2 に答える 2

2

y を作成したときに何か問題がありました。これを追加すると、コードは正常に実行されます。

    y <- as.factor(as.numeric(y))

y 値の何が問題だったのかわかりませんが、これは完全なコードを提供した場合にのみ再現可能であることがわかりました。

    > randomForest(na.omit(GSPC),y[1:2713])
    Error in randomForest.default(na.omit(GSPC), y[1:2713]) : 
      subscript out of bounds
    > y <- as.factor(as.numeric(y))
    > randomForest(na.omit(GSPC),y[1:2713])

    Call:
     randomForest(x = na.omit(GSPC), y = y[1:2713]) 
                   Type of random forest: classification
                         Number of trees: 500
    No. of variables tried at each split: 2

            OOB estimate of  error rate: 0.07%
    Confusion matrix:
        1    2   3 class.error
    1 348    1   0 0.002865330
    2   0 2034   0 0.000000000
    3   0    1 329 0.003030303
于 2012-10-16T17:33:25.620 に答える
1

数式とデータパラメータを使用してrandomForestを呼び出すことはごく普通のことx[1:100]ですが、行列ではなくベクトルです。私はあなたが意味すると思いますx[1:100,]

さらに、データのパラメータは、行列ではなくデータフレームである必要があります。xは(データフレームではなく)行列であると想定しx[1:100]ます。そうしないと、次のエラーメッセージが返されるためです。

Error in `[.data.frame`(x, 100) : undefined columns selected

または、コメントで示唆されているように、実行することもできます

randomForest( x[ 1:100, ], y[ 1:100 ] )
于 2012-10-15T16:58:56.583 に答える