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)