分類子のバランスが取れていないため、gbmモデル適合のカスタムメトリックとしてAUPRCを使用しようとしています。ただし、カスタムメトリックを組み込むと、コードに次のエラーが表示されます。私が間違っていることがわからない。
また、auprcSummary()は、インラインで実行するとそれ自体で機能します。train()に取り込もうとするとエラーが発生します。
library(dplyr) # for data manipulation
library(caret) # for model-building
library(pROC) # for AUC calculations
library(PRROC) # for Precision-Recall curve calculations
auprcSummary <- function(data, lev = NULL, model = NULL){
index_class2 <- data$Class == "Class2"
index_class1 <- data$Class == "Class1"
the_curve <- pr.curve(data$Class[index_class2],
data$Class[index_class1],
curve = FALSE)
out <- the_curve$auc.integral
names(out) <- "AUPRC"
out
}
ctrl <- trainControl(method = "repeatedcv",
number = 10,
repeats = 5,
summaryFunction = auprcSummary,
classProbs = TRUE)
set.seed(5627)
orig_fit <- train(Class ~ .,
data = toanalyze.train,
method = "gbm",
verbose = FALSE,
metric = "AUPRC",
trControl = ctrl)
これは私が得ているエラーです:
Error in order(scores.class0) : argument 1 is not a vector
pr.curve()が入力(スコア/確率)として数値ベクトルのみを受け取るためですか?
このアプローチにより、適切なカスタムサマリー関数が生成されると思います。
library(caret)
library(pROC)
library(PRROC)
library(mlbench) #for the data set
data(Ionosphere)
pr.curve
機能分類スコアは、いずれかとして、すなわち、クラスのそれぞれのデータポイントに対して別々に設けてもよいscores.class0
ポジティブ/前景クラスからとのようなデータポイントのscores.class1
負/背景クラスのデータ点について、または、すべてのデータポイントの分類スコアがとして提供されscores.class0
、ラベルが数値として提供されます(正のクラスの場合は1、負のクラスの場合は0)weights.class0
(不明な場合はお詫びする関数の助けを借りてこれをコピーしました) 。
私は後で提供することを選択しました-のすべての確率scores.class0
とクラスの割り当てweights.class0
。
キャレットは、trainControlオブジェクトのclassProbs引数がTRUEに設定されている場合、クラス確率を含むデータ内の追加の列が存在すると述べています。以下のためのだから、Ionosphere
データ列good
とbad
存在しなければなりません。
levels(Ionosphere$Class)
#output
[1] "bad" "good"
0/1ラベリングに変換するには、次のようにすることができます。
as.numeric(Ionosphere$Class) - 1
good
になり1
bad
ます0
これで、カスタム関数のすべてのデータが得られました
auprcSummary <- function(data, lev = NULL, model = NULL){
prob_good <- data$good #take the probability of good class
the_curve <- pr.curve(scores.class0 = prob_good,
weights.class0 = as.numeric(data$obs)-1, #provide the class labels as 0/1
curve = FALSE)
out <- the_curve$auc.integral
names(out) <- "AUPRC"
out
}
data$good
このデータセットだけで機能するwhichを使用する代わりに、クラス名を抽出し、それを使用して目的の列を取得できます。
lvls <- levels(data$obs)
prob_good <- data[,lvls[2]]
summaryFunctionを更新するたびに、trainControlオブジェクトを更新する必要があることに注意することが重要です。
ctrl <- trainControl(method = "repeatedcv",
number = 10,
repeats = 5,
summaryFunction = auprcSummary,
classProbs = TRUE)
orig_fit <- train(y = Ionosphere$Class, x = Ionosphere[,c(1,3:34)], #omit column 2 to avoid a bunch of warnings related to the data set
method = "gbm",
verbose = FALSE,
metric = "AUPRC",
trControl = ctrl)
orig_fit$results
#output
shrinkage interaction.depth n.minobsinnode n.trees AUPRC AUPRCSD
1 0.1 1 10 50 0.9722775 0.03524882
4 0.1 2 10 50 0.9758017 0.03143379
7 0.1 3 10 50 0.9739880 0.03316923
2 0.1 1 10 100 0.9786706 0.02502183
5 0.1 2 10 100 0.9817447 0.02276883
8 0.1 3 10 100 0.9772322 0.03301064
3 0.1 1 10 150 0.9809693 0.02078601
6 0.1 2 10 150 0.9824430 0.02284361
9 0.1 3 10 150 0.9818318 0.02287886
合理的なようです
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加