R MLR 包:停止 makeClassifTask 删除测试集的空因子水平
R MLR package: Stop makeClassifTask from dropping empty factor levels for testing set
我有一个涉及分类预测变量的二元分类问题 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: 我不是自己对测试数据进行重采样,它是一个外部数据集,我不知道其响应变量。
此外,在创建任务之前,我确实为测试集中的响应变量重新编码了虚拟值。
我会post这个作为答案,因为你不明白我的评论。这是一个使用来自 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):
'task' 断言失败:必须有 class 'Task',但有 class 'data.frame'.
因为函数假定数据框作为任务参数传递。
来自predict.WrappedModel
的帮助:
object [WrappedModel] Wrapped model, result of train.
task [Task] The task. If this is passed, data from this task is
predicted.
newdata [data.frame] New observations which should be predicted. Pass
this alternatively instead of task.
给出以下参数。您需要使用 check.data
和 fixup.data
。希望这会有所帮助:)
语法:
testtask = makeClassifTask(data = testdata, target = "response", positive = "1",fixup.data = "no",check.data = FALSE)
我有一个涉及分类预测变量的二元分类问题 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: 我不是自己对测试数据进行重采样,它是一个外部数据集,我不知道其响应变量。
此外,在创建任务之前,我确实为测试集中的响应变量重新编码了虚拟值。
我会post这个作为答案,因为你不明白我的评论。这是一个使用来自 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): 'task' 断言失败:必须有 class 'Task',但有 class 'data.frame'.
因为函数假定数据框作为任务参数传递。
来自predict.WrappedModel
的帮助:
object [WrappedModel] Wrapped model, result of train.
task [Task] The task. If this is passed, data from this task is predicted.
newdata [data.frame] New observations which should be predicted. Pass this alternatively instead of task.
给出以下参数。您需要使用 check.data
和 fixup.data
。希望这会有所帮助:)
语法:
testtask = makeClassifTask(data = testdata, target = "response", positive = "1",fixup.data = "no",check.data = FALSE)