2014-12-13 5 views
2

저는 R에 익숙하지 않아이 문제에 부딪 혔습니다. 두 가지 예측 기술 (지원 벡터 머신과 신경망)을 일부 데이터에 적용하고 성능을 비교하고 싶습니다. 이렇게하려면 ROC 커브를 사용합니다. 이 코드는 ROC 곡선 아래의 영역을 계산하기로되어 있지만 작동하지 않습니다. 신경 네트워크 코드는 잘 작동하지만 SVM의 일부가 실행될 때이 오류가 발생했습니다R의 SVM : "예측자는 숫자 또는 순서 여야합니다."

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

Error in roc.default(response, predictor, auc = TRUE, ...) : Predictor must be numeric or ordered.

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

Error in roc.default((dtest$recid == "SI") * 1, lr.pred) : Predictor must be numeric or ordered.

이것은 내가 가지고있는 코드입니다.

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 곡선 분석 할 것입니다 열을 가져옵니다 내가 원하는 형식으로 데이터를 제공하지 않습니다 예측의 반환 값은 그래서 이것을 사용하는 데 필요한.

답변

0

오류 메시지에서 말하자면 숫자 벡터 또는 순서가 지정된 인수가 lr.pred에 있어야합니다. 여기서 문제는 예측 (svm)이 예측 클래스를 반환하므로 ROC 연습을 거의 쓸모 없게 만든다는 것입니다. 당신이 필요로하는 무엇

클래스 확률처럼, 내부 점수를 얻을 수 있습니다 :

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

(당신은 첫 번째 또는 두 번째 클래스, 얻을 수있는 확률을 선택해야합니다 또한 type = "response"이 무시됩니다. .)