2

私はこれに十分長く取り組んできたので、a) おそらくこれを行う簡単な方法があり、b) 新しい目で見ると、おそらく私より先にそれがわかるでしょう。だからここに行く..

項目を 2 つ以上のカテゴリに分類するために、2 つ以上のテストが実行されました。分類器を組み合わせて使用​​することで、より信頼性の高い測定値が得られると仮定しています。これをテストするには、個々のテストの結果を単に集計するのではなく、予測が相互に連携してどのように機能するかを確認する必要があります。この分析の最初のステップは、テスト結果を観察にグループ化することによって、すべてのテストから同時に得られる測定値をシミュレートすることです。

set.seed(103)
test1 <- data.frame(trueClass=rep(c('A','B','C'), times=c(2,3,4)), score=rpois(9,10))
test2 <- data.frame(trueClass=rep(c('A','B','C'), times=c(3,3,3)), score=rpois(9,5))
test3 <- data.frame(trueClass=rep(c('A','B','C'), times=c(4,2,3)), score=rpois(9,2))

all.data <- list(test1=test1, test2=test2, test3=test3)

score観測を、同じ の各テストからの1 つを含む順序付けられたトリプルとして定義しますtrueClass。理想的には、最終的にdata.frame次のような整理ができます

>observation.df
  test1 test2 test3 trueClass
1    11     6     2         A
2    16     4     4         A
3     6     9     2         B
4   ...

問題は、観測の数がテスト内のクラスの表現の最小数によって制限されることです。この場合、最小値は

mins <- c(A=2, B=2, C=3)

trueClass = Aしたがって、各テストから 2 つのテスト結果を、2 をtrueClass = B、および 3 を使用してサンプリングし、trueClass = Cそれらを に保存したいと思いobservation.dfます。

明らかに、観測を作成する関数は、テストとクラスの名前を から学習する必要がありますall.data

test.names <- names(all.data)
class.names <- unique(as.vector(sapply(all.data, function(i) i$trueClass)))

サンプリングする各クラスの数を取得するには:

library(plyr)
count.table <- laply(all.data, function(i) table(i$trueClass))
mins <- apply(count.table, 2, min)

byここから (おそらくまたは関数を使用して) かなり簡単な方法があるはずですがplyr、問題を複雑にする以外に成功していません。

4

2 に答える 2

2

かなり複雑な答えになる可能性がありますが、仕事は完了します。

cutlist <- lapply(all.data,
  function(x)
  do.call(rbind,
    sapply(names(mins), function(y) {
       subs <- x[x$trueClass==y,]
       subs[sample(1:nrow(subs),mins[y]),]
       },
    simplify=FALSE
    )
  )
)

cbind(cutlist[[1]]["trueClass"] , sapply(cutlist,"[[","score",simplify=TRUE))

結果:

    trueClass  1 2 3
A.1         A  7 8 2
A.2         A 10 5 5
B.5         B  8 4 4
B.4         B  4 9 2
C.7         C  6 3 3
C.9         C  7 8 0
C.8         C  8 8 3
于 2013-08-20T23:34:09.943 に答える