1

我有一个涉及分类预测变量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)

因此,即使测试数据不包含-1在其记录中,也确实存在空白因子水平。

但是当我尝试使用以下方法为测试集创建任务时:

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

我收到一条警告,指出已删除列的空因子级别: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.

PS:我不是自己重新采样测试数据,它是我不知道响应变量的外部数据集。

此外,在创建任务之前,我确实为测试集中的响应变量重新编码了虚拟值。

4

2 回答 2

2

由于您不理解我的评论,因此我将其发布为答案。这是使用来自 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,]

train.Sonar 和 test.Sonar 是数据帧。

制作任务、学习者和训练:

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)

然后是您提到的错误:预测错误(mod,test.Sonar):“任务”断言失败:必须具有“任务”类,但具有“数据帧”类。

因为函数假定数据帧作为任务参数传递。

在以下帮助下predict.WrappedModel

object [WrappedModel] 包裹模型,训练的结果。

任务 [任务] 任务。如果通过,则预测来自该任务的数据。

newdata [data.frame] 应该预测的新观察结果。交替传递这个而不是任务。

于 2018-01-26T18:45:37.517 回答
1

给出以下参数。您需要check.datafixup.data. 希望这可以帮助 :)

句法:

testtask = makeClassifTask(data = testdata, target = "response", positive = "1",fixup.data = "no",check.data = FALSE)
于 2019-05-26T12:18:42.193 回答