R MLR包:停止MakeClasstTask删除测试集的空因子级别

R MLR包:停止MakeClasstTask删除测试集的空因子级别,r,mlr,R,Mlr,我有一个二进制分类问题,涉及分类预测变量Var1&Var2: > head(traindata) # ID Var1 Var2 response # 1 101 -2 0 0 # 2 201 0 -1 1 # 3 301 0 -2 0 # 4 401 -1 0 0 # 6 501 0 -1 1 训练集包括所有-2,-1,0作为Var1的级别,但测试集不包括-1作为Var1的输入 我确实确保V

我有一个二进制分类问题,涉及分类预测变量
Var1
&
Var2

> head(traindata)

#  ID   Var1 Var2 response
# 1 101   -2   0      0
# 2 201    0  -1      1
# 3 301    0  -2      0
# 4 401   -1   0      0
# 6 501    0  -1      1
训练集包括所有
-2,-1,0
作为
Var1
的级别,但测试集不包括
-1
作为
Var1
的输入

我确实确保
Var1
包含测试集中的所有级别:

testdata$Var1 <- factor(testdata$Var1, levels = levels(traindata$Var1)
我收到一条警告,说明已删除列的空因子级别:
Var1

我还尝试设置了
fixup.data=“no”
参数。它给出了以下错误:

testtask <- makeClassifTask(data = testdata, target = "response", positive = "1", fixup.data = "no")

# Error in (function (cn, x)  :
#   Column 'Var1' contains empty factor levels.

testtask由于您不理解我的评论,因此我将此作为答案发布。以下是使用mlbench数据集Sonar的可复制示例:

library(mlr)
library(mlbench)
library(caret)

data(Sonar)
拆分为训练集和测试集:

ind <- createDataPartition(Sonar$Class, p = 0.8, list = FALSE)
train.Sonar <- Sonar[ind,]
test.Sonar <- Sonar[-ind,]

ind给出以下参数。您需要使用
check.data
fixup.data
。希望这有帮助:)

语法:

testtask = makeClassifTask(data = testdata, target = "response", positive = "1",fixup.data = "no",check.data = FALSE)

为什么要用测试数据来做任务?为什么要保持空因子水平?它不会改变任何东西,一些学习者会打破空因子级别。@如果我没有弄错的话,使用mlr包预测对象需要属于“任务”类。如果我尝试使用带有
predict()
函数的数据帧,它会抛出断言错误。@Larskothoff我需要测试数据集中的级别相同,否则当我尝试使用删除级别的测试任务进行预测时,会出现以下错误:
predict.randomForest中的错误(.model$learner.model,newdata=.newdata,:新数据中的预测值类型与训练数据的类型不匹配。
使用mlr获取预测值不需要任务对象,可以使用数据帧。通常,使用单个任务和重采样描述,按您喜欢的方式对数据进行分区。啊!这是一个愚蠢的错误。感谢您的澄清是的,它现在开始工作了。这是因为
predict()
函数本身。我应该在列出参数值时包含“newdata”。
task <- makeClassifTask(data = train.Sonar, target = "Class",  positive = "R")
lrn <- makeLearner("classif.rpart", predict.type = "prob")
mod <- mlr::train(lrn, task) #caret trains masks mlr train 

pred <- predict(mod, newdata = test.Sonar)
pred
#output
Prediction: 41 observations
predict.type: prob
threshold: M=0.50,R=0.50
time: 0.00
   truth     prob.M    prob.R response
2      R 0.86956522 0.1304348        M
3      R 0.86956522 0.1304348        M
6      R 0.86956522 0.1304348        M
13     R 0.07692308 0.9230769        R
22     R 0.11111111 0.8888889        R
25     R 0.07692308 0.9230769        R
... (#rows: 41, #cols: 4)
pred <- predict(mod, test.Sonar)
testtask = makeClassifTask(data = testdata, target = "response", positive = "1",fixup.data = "no",check.data = FALSE)