3

私は R を初めて使用し、この問題に遭遇しました。2 つの予測手法 (サポート ベクター マシンとニューラル ネットワーク) をいくつかのデータに適用して比較し、それらのパフォーマンスを比較したいと考えています。これを行うには、ROC 曲線を使用します。コードは ROC 曲線の下の領域を計算するはずですが、機能していません。ニューラル ネットワーク コードは正常に動作しますが、SVM 部分を実行すると、次のエラーが発生しました。

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

roc.default(response, predictor, auc = TRUE, ...) のエラー: Predictor は数値または順序付けされている必要があります。

> 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 のアイデアに基づいていました。predict の戻り値は、必要な形式のデータを提供しないため、これを使用する必要がありました。

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

文は、ROC 曲線で分析される列を取得します。

4

1 に答える 1

3

エラー メッセージが示すように、lr.pred には数値ベクトルまたは順序付けられた因子が必要です。ここでの問題は、predict (svm の場合) が予測されたクラスを返すため、ROC の演習がほとんど役に立たないことです。

必要なのは、クラスの確率などの内部スコアを取得することです。

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

(1 番目または 2 番目のクラスのどちらの確率を取得するかを選択する必要があります。type = "response"無視されることにも注意してください。)

于 2014-12-13T15:02:41.977 に答える