获取使用插入符号进行预测的行号

Get row number for prediction with caret

提问人:Christoph 提问时间:12/10/2017 最后编辑:jmuhlenkampChristoph 更新时间:1/13/2018 访问量:1513

问:

我在 R 中经常使用插入符号来执行机器学习任务,我非常喜欢它。

但我面临以下问题:

  • 我在插入符号中训练一个模型,比如说线性回归lm()
  • 当我想对新数据进行评分时,我会:predict(model, new_data)
  • 当在我的预测变量中包含缺失值时,predict 返回 no prediction,而不是 saynew_dataNA

是否有可能:

  • 返回对 new_data 中所有行的预测,并预测何时不可能,或者NA
  • 返回预测 + 预测对应的数据帧的行号?

例如,就像 mlr-package 对显示预测对应于哪一行的 id-column 所做的那样:
enter image description here

以下是 mlr-predict 页面的链接,其中包含更多详细信息: mlr-package:使用 row-id 进行预测

任何帮助,非常感谢!

R-插入符号 预测

评论


答:

1赞 Len Greski 12/10/2017 #1

在运行之前,您可以通过使用数据集中的行名称创建新列来识别具有缺失值的案例,因为这些列默认为数据框中的行号。caret::train()

使用包中的数据集作为说明:Sonarmlbench

library(mlbench)
data(Sonar)
library(caret)
set.seed(95014)

# add row numbers
Sonar$rowId <- rownames(Sonar)
# create training & testing data sets

inTraining <- createDataPartition(Sonar$Class, p = .75, list=FALSE)
training <- Sonar[inTraining,]
testing <- Sonar[-inTraining,]
# set column 60 to NA for some values in test data
testing[48:51,60] <- NA
testing[!complete.cases(testing),"rowId"]

...和输出:

> testing[!complete.cases(testing),"rowId"]
[1] "193" "194" "200" "206"

然后,您可以对测试数据集中具有完整事例的行运行。再次使用具有随机森林模型和 3 倍交叉验证的数据集来加快处理速度:predict()Sonar

fitControl <- trainControl(method = "cv",number = 3)
fit <- train(x,y, method="rf",data=Sonar,trControl = fitControl)
predicted <- predict(fit,testing[complete.cases(testing),])

处理这种情况的另一种方法是使用插补策略来消除模型中自变量的缺失值。我在 Github 上的文章《处理缺失值的策略》链接到许多关于该主题的研究论文。

评论

0赞 Christoph 12/11/2017
嘿,谢谢你的回答!使用 complete.cases 当然是一种选择,但有时我的数据集包含包含缺失值的列,但这些列不用于训练。因此,我需要先删除这些列,然后才能使用您的解决方案。我更愿意知道给定的数据集 A,在不更改基础数据集的情况下,预测对应于 A 中的哪个行号。
0赞 Len Greski 12/11/2017
@Christoph - 您可以将测试数据集中的列子集用于输出模型,然后在其余列上使用,以避免从测试数据集中删除模型中不存在的列缺失的事例。colnames()complete.cases()
0赞 Christoph 12/14/2017
嘿,迟到的回复。是的,我可以这样做,但这需要相当多的额外代码,并且需要我提前过滤缺失的行,否则我可能无法正确匹配,例如日期列与所做的预测。当无法预测时,我宁愿获得与具有 NA 的输入数据长度相同的预测向量,或者获得显示预测对应于哪一行的 ID。
0赞 Len Greski 12/16/2017
@Christoph - 您可以在插入符号 Github 存储库的“问题”页面上请求插入符号中的新功能。如果这个功能真的很重要,你可以从插入符号存储库中分叉源代码并自己编写代码。
0赞 Christoph 12/16/2017
我会的。我担心该功能已经存在,我只是找不到它......感谢您的帮助!