2

免責事項: このプロジェクトは、他の誰かのコードとして開始されました。最適ではない設計上の決定があると確信していますが、自分のプロジェクトよりも私の手は少し縛られています。

トレーニング済みのモデル オブジェクトを一連のスコアリング データと組み合わせて使用​​し、スコアリングされたデータのデータ フレームを作成する機械学習アルゴリズムがあります。モデル オブジェクトは、数式とデータ フレームを含むリストです。

モデルのデータ フレームの役割の 1 つは、スコアリング データ フレームに、モデルが期待するものと同じ列があり、それらの列の因子レベルが同じであることを確認することです。これを達成するために、トレーニング データの任意の 1 行をmodel$df(データ フレーム) に保存します。次に、ややぎこちない線を使用します

scoring.set$df <- rbind(model$df, scoring.set$df)[-1, ]

これにより、値は同じですが因子レベルが拡張されたスコアリング データ フレームが生成されます。私の理解ではrbind、両方のデータ フレームの因子変数のレベルが 2 つの個々のフレームのレベルの結合と等しくなるように強制するので、これはまさに私が必要とすることを行います。

しかし、それが正しい方法ではないことは確かです。推奨事項はありますか?

事前に感謝します。詳しく説明するために待機します。

4

1 に答える 1

1

サンプル データセットを作成する

set.seed(23452)

##create 5 variables with 15 levels and 5 variables with 20 levels
nrowd <- 100
full <- data.frame(
    replicate(5,letters[sample(sample(1:24,15),nrowd,replace=TRUE) ]),
    replicate(5,LETTERS[sample(sample(1:24,20),nrowd,replace=TRUE) ])
)

###the following code represents a process that creates a dataframe with variables 
###that have no more levels than full but may have fewer levels
scoring.set <- data.frame(sapply(full[sample(1:nrow(full),10),],as.character))

#factor levels are not the same
identical(sapply(full,levels),sapply(scoring.set,levels))

因子水準を修正する方法は次のとおりです。

##make it so the levels of scoring.set variables have the levels of full
scoring.set2 <- data.frame(
    mapply(scoring.set,lapply(full,levels), SIMPLIFY=FALSE,
       FUN=function(scoring.var, full.level){     
        factor(scoring.var, levels=union(full.level,levels(scoring.var))) 
     }) 
)

変数は以前と同じで、フルと同じレベルになりました。

all(
    mapply(scoring.set,scoring.set2, FUN=function(x,y){
        identical(as.character(x),as.character(y))
    })
)

    identical(sapply(full,levels),sapply(scoring.set2,levels))

非因子変数の導入は物事を複雑にしますが、一般的な考え方は、因子変数のみにサブセット化してから、すべてを同じ順序に戻すfactor.vars <- scoring.set[,sapply(scoring.set, is.factor)]ようなことを行うことです。data.frame(fixed.factor.vars, scoring.set[,!sapply(scoring.set,is.factor)])[,names(scoring.set)]

于 2012-08-23T19:47:26.753 に答える