R中支持向量机和朴素贝叶斯分类器的可变重要性

R中支持向量机和朴素贝叶斯分类器的可变重要性,r,machine-learning,svm,naivebayes,R,Machine Learning,Svm,Naivebayes,我正在一个癌症数据集上构建R中的预测分类器。 我正在使用随机森林、支持向量机和朴素贝叶斯分类器。我无法计算SVM和NB模型的变量重要性 我最终收到以下错误 UseMethod(“varImp”)中出错: 没有适用于“c”类对象的“varImp”方法(“svm.formula”、“svm”) 如果有人能帮助我,我将不胜感激。 library(e1071) model <- svm(Species ~ ., data = iris) class(model) # [1] "svm.formul

我正在一个癌症数据集上构建R中的预测分类器。 我正在使用随机森林、支持向量机和朴素贝叶斯分类器。我无法计算SVM和NB模型的变量重要性

我最终收到以下错误

UseMethod(“varImp”)中出错: 没有适用于“c”类对象的“varImp”方法(“svm.formula”、“svm”)

如果有人能帮助我,我将不胜感激。

library(e1071)
model <- svm(Species ~ ., data = iris)
class(model)
# [1] "svm.formula" "svm"     

library(caret)
varImp(model)
# Error in UseMethod("varImp") : 
#   no applicable method for 'varImp' applied to an object of class "c('svm.formula', 'svm')"

methods(varImp)
#  [1] varImp.bagEarth      varImp.bagFDA        varImp.C5.0*         varImp.classbagg*   
#  [5] varImp.cubist*       varImp.dsa*          varImp.earth*        varImp.fda*         
#  [9] varImp.gafs*         varImp.gam*          varImp.gbm*          varImp.glm*         
# [13] varImp.glmnet*       varImp.JRip*         varImp.lm*           varImp.multinom*    
# [17] varImp.mvr*          varImp.nnet*         varImp.pamrtrained*  varImp.PART*        
# [21] varImp.plsda         varImp.randomForest* varImp.RandomForest* varImp.regbagg*     
# [25] varImp.rfe*          varImp.rpart*        varImp.RRF*          varImp.safs*        
# [29] varImp.sbf*          varImp.train*  
库(e1071)

模型如果使用R,可以使用rminer包中的重要性方法计算变量的重要性。这是我的示例代码:

library(rminer)
M <- fit(y~., data=train, model="svm", kpar=list(sigma=0.10), C=2)
svm.imp <- Importance(M, data=train)
库(rminer)

M我创建了一个循环,该循环一次迭代删除一个预测器,并在数据帧中捕获来自混淆矩阵的各种性能度量。这不是一个一刀切的解决方案,我没有时间,但应用修改应该不难

确保预测变量是数据帧中的最后一个。

我主要需要模型中的特异性值,通过一次删除一个预测值,我可以评估每个预测值的重要性,即通过删除一个预测值,模型的最小特异性(减去预测值数量I)意味着预测值具有最大的重要性。你需要知道你将在什么指标上赋予重要性

您还可以在内核之间添加另一个for循环,即线性、多项式、径向,但您可能需要考虑其他参数,例如gamma。用目标变量更改“label_fake”,用数据框更改df_final

支持向量机版本:

set.seed(1)
varimp_df <- NULL # df with results
ptm1 <- proc.time() # Start the clock!
for(i in 1:(ncol(df_final)-1)) { # the last var is the dep var, hence the -1
  smp_size <- floor(0.70 * nrow(df_final)) # 70/30 split
  train_ind <- sample(seq_len(nrow(df_final)), size = smp_size)
  training <- df_final[train_ind, -c(i)] # receives all the df less 1 var
  testing <- df_final[-train_ind, -c(i)]

  tune.out.linear <- tune(svm, label_fake ~ .,
                          data = training,
                          kernel = "linear",
                          ranges = list(cost =10^seq(1, 3, by = 0.5))) # you can choose any range you see fit

  svm.linear <- svm(label_fake ~ .,
                    kernel = "linear",
                    data = training,
                    cost = tune.out.linear[["best.parameters"]][["cost"]])

  train.pred.linear <- predict(svm.linear, testing)
  testing_y <- as.factor(testing$label_fake)
  conf.matrix.svm.linear <- caret::confusionMatrix(train.pred.linear, testing_y)
  varimp_df <- rbind(varimp_df,data.frame(
                     var_no=i,
                     variable=colnames(df_final[,i]), 
                     cost_param=tune.out.linear[["best.parameters"]][["cost"]],
                     accuracy=conf.matrix.svm.linear[["overall"]][["Accuracy"]],
                     kappa=conf.matrix.svm.linear[["overall"]][["Kappa"]],
                     sensitivity=conf.matrix.svm.linear[["byClass"]][["Sensitivity"]],
                     specificity=conf.matrix.svm.linear[["byClass"]][["Specificity"]]))
  runtime1 <- as.data.frame(t(data.matrix(proc.time() - ptm1)))$elapsed # time for running this loop
  runtime1 # divide by 60 and you get minutes, /3600 you get hours
    }
set.seed(1)

欢迎来到StackOverflow。请阅读(1)、(2)和(3)。然后相应地编辑和改进您的问题。例如,通过使用内置示例数据集,提供再现错误的代码。
varimp_nb_df <- NULL
ptm1 <- proc.time() # Start the clock!
for(i in 1:(ncol(df_final)-1)) {
  smp_size <- floor(0.70 * nrow(df_final))
  train_ind <- sample(seq_len(nrow(df_final)), size = smp_size)
  training <- df_final[train_ind, -c(i)]
  testing <- df_final[-train_ind, -c(i)]

  x = training[, names(training) != "label_fake"]
  y = training$label_fake

  model_nb_var = train(x,y,'nb', trControl=ctrl)

  predict_nb_var <- predict(model_nb_var, newdata = testing )

  confusion_matrix_nb_1 <- caret::confusionMatrix(predict_nb_var, testing$label_fake)  

  varimp_nb_df <- rbind(varimp_nb_df, data.frame(
    var_no=i,
    variable=colnames(df_final[,i]), 
    accuracy=confusion_matrix_nb_1[["overall"]][["Accuracy"]],
    kappa=confusion_matrix_nb_1[["overall"]][["Kappa"]],
    sensitivity=confusion_matrix_nb_1[["byClass"]][["Sensitivity"]],
    specificity=confusion_matrix_nb_1[["byClass"]][["Specificity"]]))
  runtime1 <- as.data.frame(t(data.matrix(proc.time() - ptm1)))$elapsed # time for running this loop
  runtime1 # divide by 60 and you get minutes, /3600 you get hours
}