2017-07-10 8 views
2

mlrパッケージを使用して新しいデータを予測する場合、元のデータの前処理で必要な情報が使用されるように新しいデータを前処理する方法。例えば。小さな因子レベルをマージし、新しいデータセットの頻度が最初のデータセットと異なる場合、結果の因子レベルは異なる可能性があり、予測は不可能です。注:ここではモデルのトレーニング時に新しいデータがまだ利用できないと仮定していますが、これはテストデータではなく、新しいデータの予測に関するものです。それでは、新しいデータの前処理はどのようにmlrで行われるはずですか?ここで私は前処理にエラーにつながる新しいデータセットを新しいタスクを作成した例です。mlrパッケージを使用して予測のためのnewdataを事前処理する方法

library(mlr) 
a <- data.frame(y=factor(c(1,1,1,1,1,1,1,1,0,0,1,0)), 
       x1=rep(c("a","b", "c"), times=c(10,1,1))) 
# most frequent x1 factor is "a" 
aTask <- makeClassifTask(data = a, target = "y", positive="1") 
aTask <- mergeSmallFactorLevels(aTask, cols=c("x1"), min.perc=0.1) 
# combines "b" and "c" into factor ".merged" 
getTaskData(aTask) 

aLearner <- makeLearner("classif.rpart", predict.type = "prob") 
model <- train(aLearner, aTask) 

b <- data.frame(y=factor(c(1,0,1,1,1,1,1,1,0,0,1,0)), 
       x1=rep(c("a","b", "c"), times=c(1,10,1))) 
# most frequent x1 factor is "b" 
# target would be made up, because at this stage there would be now target 
# variable availabel 
newdataTask <- makeClassifTask(data = b, target = "y", positive="1") 
newdataTask <- mergeSmallFactorLevels(newdataTask, cols="x1", 
             min.perc = 0.1) 
# combines "a" and "c" into factor ".merged" 
getTaskData(newdataTask) 

pred <- predict(model, newdataTask) 

#Error in model.frame.default(Terms, newdata, na.action = na.action, 
#        xlev = attr(object, : 
#Faktor 'x1' hat neue Stufen b (= factor 'x1' has new level b) 

私の解決策の別の問題は、新しいタスクが利用できないでしょうターゲット変数を必要としているようだということです新しいデータセットの場合

答えて

2

mlrは自動的にこれを行うには何もありませんが、あなたは簡単に交換されている要因のレベルをチェックして、新しいデータに応じて名前を変更することができます

library(plyr) 
to.replace = setdiff(levels(b$x1), levels(getTaskData(aTask)$x1)) 
b$x1 = mapvalues(b$x1, from = to.replace, to = rep(".merged", times = length(to.replace))) 

コンプリート例:

library(mlr) 
a = data.frame(y=factor(c(1,1,1,1,1,1,1,1,0,0,1,0)), 
       x1=rep(c("a","b", "c"), times=c(10,1,1))) 
aTask = makeClassifTask(data = a, target = "y", positive="1") 
aTask = mergeSmallFactorLevels(aTask, cols=c("x1"), min.perc=0.1) 

aLearner = makeLearner("classif.rpart", predict.type = "prob") 
model = train(aLearner, aTask) 

b = data.frame(y=factor(c(1,0,1,1,1,1,1,1,0,0,1,0)), 
       x1=rep(c("a","b", "c"), times=c(1,10,1))) 
library(plyr) 
to.replace = setdiff(levels(b$x1), levels(getTaskData(aTask)$x1)) 
b$x1 = mapvalues(b$x1, from = to.replace, to = rep(".merged", times = length(to.replace))) 

newdataTask = makeClassifTask(data = b, target = "y", positive="1") 

pred = predict(model, newdataTask) 

このような場合は、前処理と学習者を融合させて、訓練と予測の際に透過的かつ自動的に行われる方がよい場合があります。この場合、完全な例は次のようになります。

lrn = makeLearner("classif.rpart", predict.type = "prob") 
trainfun = function(data, target, args) { 
    task = makeClassifTask(data = data, target = target, positive = "1") 
    new.task = mergeSmallFactorLevels(task, cols = c("x1"), min.perc = 0.1) 
    return(list(data = getTaskData(new.task), control = list(levels(getTaskData(new.task)$x1)))) 
} 
predictfun = function(data, target, args, control) { 
    library(plyr) 
    to.replace = setdiff(levels(data$x1), control[[1]]) 
    data$x1 = mapvalues(data$x1, from = to.replace, to = rep(".merged", times = length(to.replace))) 
    return(data) 
} 
lrn = makePreprocWrapper(lrn, train = trainfun, predict = predictfun) 

a = data.frame(y=factor(c(1,1,1,1,1,1,1,1,0,0,1,0)), 
       x1=rep(c("a","b", "c"), times=c(10,1,1))) 
aTask = makeClassifTask(data = a, target = "y", positive="1") 
model = train(lrn, aTask) 

b = data.frame(y=factor(c(1,0,1,1,1,1,1,1,0,0,1,0)), 
       x1=rep(c("a","b", "c"), times=c(1,10,1))) 
newdataTask = makeClassifTask(data = b, target = "y", positive = "1") 
pred = predict(model, newdataTask) 

これは概念の唯一の証拠である - あなたは、おそらく機能は、処理すべきとしきい値がどうあるべきか指定するための引数を持つようにしたいと思います任意の数の処理されたフィーチャを処理するようにpredictfunコードを適合させることができる。

関連する問題