Rのメモ
- 学習者作文データ13000件の最も頻度の高い脱落・余剰エラー50種類の頻度を各作文毎に抽出
- 作文の CEFR レベル推定にこれらのエラーが効いてくるかどうかを判別したい
- 今回はランダム・フォレストを使用
- 特に変数の重要度グラフが有効と期待できる
library(gdata)
lc <- read.xls("lcr2011data.xls")
install.packages("randomForest")
library(randomForest)
# データ形式として factor 変数のレベルが32以上あってはいけない。
# 被験者のIDデータを読み込まないようにしないとエラーが出る
> lc.rf <-randomForest(Grade~.,data=lc)
以下にエラー randomForest.default(m, y, ...) :
Can not handle categorical predictors with more than 32 categories.
> str(gtec1)
'data.frame': 100 obs. of 58 variables:
$ Subject : Factor w/ 12278 levels "A1090723176071L-O.xml",..: 1 2 3 4 5 6 7 8 9 10 ...
$ Score : int 95 97 101 82 97 111 94 111 113 95 ...
$ Grade : Factor w/ 5 levels "A1","A2","B1",..: 2 1 2 1 2 2 2 3 2 3 ...
$ a.add : int 0 0 0 0 1 0 0 0 1 0 ...
$ a.om : int 0 0 1 1 0 0 1 0 0 1 ...
$ am.add : int 0 0 0 0 0 0 0 0 0 0 ...
$ and.add : int 0 0 0 0 0 0 0 0 0 0 ...
$ and.om : int 0 0 0 0 0 0 0 0 0 0 ...
$ are.add : int 0 0 0 0 0 0 0 0 0 0 ...
$ are.om : int 0 0 0 0 0 0 0 0 0 0 ...
#被験者部分をカットしてデータをセットし直す
lc2 <-lc[,2:58]
> str(lc2)
'data.frame': 100 obs. of 57 variables:
$ Score : int 95 97 101 82 97 111 94 111 113 95 ...
$ Grade : Factor w/ 5 levels "A1","A2","B1",..: 2 1 2 1 2 2 2 3 2 3 ...
$ a.add : int 0 0 0 0 1 0 0 0 1 0 ...
$ a.om : int 0 0 1 1 0 0 1 0 0 1 ...
$ am.add : int 0 0 0 0 0 0 0 0 0 0 ...
今度は大丈夫
> lc2.rf = randomForest(lc2,ntree=200)
> lc2.rf
Call:
randomForest(x = lc2, ntree = 200)
Type of random forest: unsupervised
Number of trees: 200
No. of variables tried at each split: 7
MDSplot(lc2.rf, fac=lc2[,2], cex=2, pch=as.numeric(lc2[,2]))
- 100件のテストでは動いたが,13000件のデータでは 1.1GB のベクトルになって割り当てができないというエラーメッセージが出た
> lc2.rf = randomForest(lc2,ntree=200)
エラー: サイズ 1.1 Gb のベクトルを割り当てることができません
R(1016,0xa055b540) malloc: *** mmap(size=1205997568) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
set.seed(1)
sam<-sample(1:12278,2000) #12278件からランダムに2000件
sam2<-sample(1:12278,2000) #同様のルールでもう1回
train<-lc2[sam,] #トレーニング用
test<-lc2[sam2,] #テスト用
train<-na.omit(train) #サンプリングすると NA の行が出ることがあるので欠損値行をカット
train.rf = randomForest(Grade ~ ., data=train)
> train.rf
Call:
randomForest(formula = Grade ~ ., data = train)
Type of random forest: classification
Number of trees: 500
No. of variables tried at each split: 7
OOB estimate of error rate: 35.59%
Confusion matrix:
A1 A2 B1 B2 C1 class.error
A1 173 72 30 0 0 0.3709091
A2 37 225 197 0 0 0.5098039
B1 6 104 800 16 1 0.1370011
B2 0 2 160 28 5 0.8564103
C1 0 0 39 14 10 0.8412698
- 教師ありの結果をプロットしたい場合には以下のように proximity の指定が必要,ただしメモリを食う。今回1万回の木の作成では 250MB のベクトルになったが割り当てられずエラーを吐いた
train.rf = randomForest(Grade ~ ., data=train, ntree=10000, proximity=T)
- importance=Tで変数の重要度を返すことができる
test.rf = randomForest(Grade ~ ., data=test, importance=TRUE)