1. ホーム
  2. r

[解決済み] 予測との誤差 - ROCRパッケージ(確率を使用)

2022-02-11 08:55:48

質問

svmで"rfe"関数を使い、特徴を減らしたモデルを作成しました。その後、テストデータに対して "predict" を使用したところ、クラスラベル(バイナリ)、0クラス確率、1クラス確率が出力されました。その後、ROCRパッケージのpredictation関数を使って、予測された確率と真のクラスラベルを出力してみましたが、以下のようなエラーが発生し、2つの配列の長さが等しいため、原因がよくわかりません。

> pred_svm <- prediction(pred_svm_2class[,2], as.numeric(as.character(y)))
Error in prediction(pred_svm_2class[, 2], as.numeric(as.character(y))) : 
Number of predictions in each run must be equal to the number of labels for each run.

私は以下のコードを持っていて、入力はここにあります。 クリックミー .バイナリ分類の小さなデータセットなので、コードは高速に動作します。

library("caret")
library("ROCR")
sensor6data_2class <- read.csv("/home/sensei/clustering/svm_2labels.csv")
sensor6data_2class <- within(sensor6data_2class, Class <- as.factor(Class))

set.seed("1298356")
inTrain_svm_2class <- createDataPartition(y = sensor6data_2class$Class, p = .75, list = FALSE)
training_svm_2class <- sensor6data_2class[inTrain_svm_2class,]
testing_svm_2class <- sensor6data_2class[-inTrain_svm_2class,]
trainX <- training_svm_2class[,1:20]
y <- training_svm_2class[,21]

ctrl_svm_2class <- rfeControl(functions = rfFuncs , method = "repeatedcv", number = 5, repeats = 2, allowParallel = TRUE)
model_train_svm_2class <- rfe(x = trainX, y = y, data = training_svm_2class, sizes = c(1:20), metric = "Accuracy", rfeControl = ctrl_svm_2class, method="svmRadial")

pred_svm_2class = predict(model_train_svm_2class, newdata=testing_svm_2class)
pred_svm <- prediction(pred_svm_2class[,2], y)

ありがとうございます、よろしくお願いします。

どのように解決するのですか?

これは、行の中の

pred_svm <- prediction(pred_svm_2class[,2], y)

pred_svm_2class[,2] はテストデータでの予測値、y はトレーニングデータのラベルです。このようにテスト用のラベルを別の変数に生成するだけです。

y_test <- testing_svm_2class[,21]

とすると、今度は

pred_svm <- prediction(pred_svm_2class[,2], y_test)

エラーは発生しません。以下、完全なコード -。

# install.packages("caret")
# install.packages("ROCR")
# install.packages("e1071")
# install.packages("randomForest")
library("caret")
library("ROCR")
sensor6data_2class <- read.csv("svm_2labels.csv")
sensor6data_2class <- within(sensor6data_2class, Class <- as.factor(Class))

set.seed("1298356")
inTrain_svm_2class <- createDataPartition(y = sensor6data_2class$Class, p = .75, list = FALSE)
training_svm_2class <- sensor6data_2class[inTrain_svm_2class,]
testing_svm_2class <- sensor6data_2class[-inTrain_svm_2class,]
trainX <- training_svm_2class[,1:20]
y <- training_svm_2class[,21]
y_test <- testing_svm_2class[,21]

ctrl_svm_2class <- rfeControl(functions = rfFuncs , method = "repeatedcv", number = 5, repeats = 2, allowParallel = TRUE)
model_train_svm_2class <- rfe(x = trainX, y = y, data = training_svm_2class, sizes = c(1:20), metric = "Accuracy", rfeControl = ctrl_svm_2class, method="svmRadial")

pred_svm_2class = predict(model_train_svm_2class, newdata=testing_svm_2class)
pred_svm <- prediction(pred_svm_2class[,2], y_test)