R中的SVM:"预测变量必须是数字或有序。"

时间:2014-12-13 13:44:48

标签: r svm roc

我是R的新手,我遇到了这个问题:我想比较两种预测技术(支持向量机和神经网络)将它们应用于某些数据,我想比较它们的性能。为此,我使用ROC曲线。该代码应该计算ROC曲线下的面积,但它不起作用。神经网络代码工作正常,但当SVM部分执行时出现此错误:

  

> aucs< - auc((dtest $ recid ==“SI”)* 1,lr.pred)

     

roc.default中的错误(response,predictor,auc = TRUE,...):     预测变量必须是数字或有序。

     

> obj.roc< - roc((dtest $ recid ==“SI”)* 1,lr.pred)

     

roc.default中的错误((dtest $ recid ==“SI”)* 1,lr.pred):     预测变量必须是数字或有序。

这是我的代码。

library(stats)
library(pROC)
library(nnet)
library(e1071)
library(rpart)

data <- read.table("data.csv", header=T)

set.seed(1234)
ind    <- sample(2, nrow(data), replace=TRUE, prob=c(0.8, 0.2))
dtrain <- data[ind==1,]
dtest  <- data[ind==2,]

# Variables for storing comparison results #
bestAuc = 0
bestIdx = 0

# Support Vector Machines
lr.fit  <- svm(recid~., data=dtrain, cost=1000, gamma=1, probability=TRUE)
lr.pred <- predict(lr.fit, dtest, type="response")
aucs    <- auc((dtest$recid=="SI")*1, lr.pred)
obj.roc <- roc((dtest$recid=="SI")*1, lr.pred)

print("SVN (default)")
bestAuc = aucs # Initialize


# Neural networks
lr.fit  <- nnet(recid~., data=dtrain, size=4, maxit=500, decay=1, trace=FALSE)
lr.pred <- predict(lr.fit, dtest, type="raw")
aucs    <- auc((dtest$recid=="SI")*1, lr.pred)
obj.roc <- roc((dtest$recid=="SI")*1,  lr.pred )

if(aucs > bestAuc) {
  bestAuc <- aucs
  bestIdx <- 1
  print("Neural networks")
}

我一直在寻找信息,但似乎关于我正在使用的方法几乎没有。我看到一个名为ROCR的软件包,我认为它可能很有用,但我也会遇到性能函数错误。我对所有这些库有点迷失,所以我试着坚持我的初始解决方案而没有任何改进。我该怎么办?


修改

解决方案基于Calimo的想法。预测的返回值不会以我想要的格式提供数据,因此我需要使用它:

lr.pred <- attr(lr.pred,"probabilities")[,c("SI")]

该句子获取将在ROC曲线中分析的列。

1 个答案:

答案 0 :(得分:3)

如错误消息所示,您需要lr.pred中的数字向量或有序因子。这里的问题是预测(对于svm)返回预测的类,使得ROC练习几乎没用。

您需要的是获得内部分数,例如课程概率:

lr.pred <- predict(lr.fit, dtest, probability = TRUE)

(您必须为第一或第二课选择获得的概率。另请注意,type = "response"将被忽略。)