【问题标题】:No applicable method for 'predict' applied to an object of class "c('ksvm', 'vm')" for iml::Predictor in R对于 R 中的 iml::Predictor,没有适用于“c('ksvm','vm')”类对象的“预测”方法
【发布时间】:2020-11-07 00:40:53
【问题描述】:

我在 R 中有以下代码段,我尝试在其中训练基于 SVM 的模型:

library(base)
library(caret)
library(iml)
library(tidyverse)

dataset <- read_csv("https://gist.githubusercontent.com/dmpe/bfe07a29c7fc1e3a70d0522956d8e4a9/raw/7ea71f7432302bb78e58348fede926142ade6992/pima-indians-diabetes.csv", col_names=FALSE)
X = dataset[, 1:8]
Y = as.factor(ifelse(dataset$X9 == 1, 'diabetes', 'nondiabetes'))

set.seed(88)

nfolds <- 3
cvIndex <- createFolds(Y, nfolds, returnTrain = T)

fit.control <- trainControl(method="cv",
                            index=cvIndex,
                            number=nfolds,
                            classProbs=TRUE,
                            savePredictions=TRUE,
                            verboseIter=TRUE,
                            summaryFunction=twoClassSummary,
                            allowParallel=FALSE)

model <- caret::train(X, Y,
                      method = "svmLinear",
                      trControl = fit.control,
                      preProcess=c("center","scale"),
                      tuneLength=10)

pred <- Predictor$new(model$finalMode, data=dataset)
pdp <- FeatureEffect$new(pred, "X1", method="pdp")

但是,预测器会抛出标题上显示的错误。任何想法为什么会发生这种情况以及如何克服它?

【问题讨论】:

    标签: r machine-learning r-caret iml


    【解决方案1】:

    您不需要选择模型$finalModel(您在该行中有错字吗?您有 $finalMode - 没有 l)。你运行如下一行:

    pred &lt;- predict(model, newdata, type = "prob")

    并且 Caret 将自动使用得分最高的模型。如果您选择 type = "prob",则输出将为您提供糖尿病(第 1 列)或非糖尿病(第 2 列)的互补概率。如果您想从插入符号“模型”对象中获取特定模型,那么我相信您可以选择它(从您之前的折叠问题中) - 但我从未这样做过,也不知道如何。

    对于你的部分依赖图,好吧,我使用 pdp 包,所以这样的东西应该可以工作:

    library(pdp)
    varname = 'X1' # Change this to whatever your first variable is called, or subsequently variables you are interested in.
    partial(model, pred.var = varname, 
            train = X, chull=T, prob = T, progress = "text")
    

    X 是你训练模型的数据(我认为是 X?)

    【讨论】:

    • 我只想说 R 是一种函数式语言;所以你调用一个函数(例如部分)然后添加你的函数参数。在我公认的有限经验中,我发现 Python 的不同之处在于,您通常指定一个对象然后添加“.method”——这看起来有点像您在 pdp 和模型调用中使用的语法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-27
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    • 2017-01-10
    • 2021-08-17
    相关资源
    最近更新 更多