R中支持向量机和朴素贝叶斯分类器的可变重要性
我正在一个癌症数据集上构建R中的预测分类器。 我正在使用随机森林、支持向量机和朴素贝叶斯分类器。我无法计算SVM和NB模型的变量重要性 我最终收到以下错误 UseMethod(“varImp”)中出错: 没有适用于“c”类对象的“varImp”方法(“svm.formula”、“svm”) 如果有人能帮助我,我将不胜感激。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
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
}