Adaboost'taki bu çalışma , 2 sınıf modellerin K sınıfı sorunlara genişletilmesi için bazı öneriler ve kodlar (sayfa 17) sunmaktadır. Bu kodu genelleştirmek istiyorum, böylece kolayca farklı 2 sınıf modelleri takabilir ve sonuçları karşılaştırabilirim. Çoğu sınıflandırma modeli bir formül arayüzüne ve bir predictyönteme sahip olduğundan, bunların bazıları nispeten kolay olmalıdır. Ne yazık ki, 2 sınıf modellerden sınıf olasılıklarını çıkarmanın standart bir yolunu bulamadım, bu yüzden her model bazı özel kodlar gerektirecektir.
İşte bir K-sınıfı problemini 2-sınıf problemlerine ayırmak ve K modellerini döndürmek için yazdığım bir fonksiyon:
oneVsAll <- function(X,Y,FUN,...) {
models <- lapply(unique(Y), function(x) {
name <- as.character(x)
.Target <- factor(ifelse(Y==name,name,'other'), levels=c(name, 'other'))
dat <- data.frame(.Target, X)
model <- FUN(.Target~., data=dat, ...)
return(model)
})
names(models) <- unique(Y)
info <- list(X=X, Y=Y, classes=unique(Y))
out <- list(models=models, info=info)
class(out) <- 'oneVsAll'
return(out)
}
İşte her model üzerinde yineleme yapmak ve tahminler yapmak için yazdığım bir tahmin yöntemi:
predict.oneVsAll <- function(object, newX=object$info$X, ...) {
stopifnot(class(object)=='oneVsAll')
lapply(object$models, function(x) {
predict(x, newX, ...)
})
}
Ve son olarak, data.frametahmin edilen olasılıkları bir normalize etme ve vakaları sınıflandırma işlevi . data.frameİki sınıflı bir modelden sınıf olasılıklarını elde etmenin birleşik bir yolu olmadığından, her modelden olasılıkların K sütununu oluşturmanın size bağlı olduğunu unutmayın :
classify <- function(dat) {
out <- dat/rowSums(dat)
out$Class <- apply(dat, 1, function(x) names(dat)[which.max(x)])
out
}
İşte bir örnek adaboost:
library(ada)
library(caret)
X <- iris[,-5]
Y <- iris[,5]
myModels <- oneVsAll(X, Y, ada)
preds <- predict(myModels, X, type='probs')
preds <- data.frame(lapply(preds, function(x) x[,2])) #Make a data.frame of probs
preds <- classify(preds)
>confusionMatrix(preds$Class, Y)
Confusion Matrix and Statistics
Reference
Prediction setosa versicolor virginica
setosa 50 0 0
versicolor 0 47 2
virginica 0 3 48
İşte bir örnek lda(Ben lda birden çok sınıf işleyebilir biliyorum, ama bu sadece bir örnek):
library(MASS)
myModels <- oneVsAll(X, Y, lda)
preds <- predict(myModels, X)
preds <- data.frame(lapply(preds, function(x) x[[2]][,1])) #Make a data.frame of probs
preds <- classify(preds)
>confusionMatrix(preds$Class, Y)
Confusion Matrix and Statistics
Reference
Prediction setosa versicolor virginica
setosa 50 0 0
versicolor 0 39 5
virginica 0 11 45
Bu işlevler, formül arabirimi ve predictyöntemi olan her 2 sınıf model için çalışmalıdır . Biraz çirkin olan X ve Y bileşenlerini manuel olarak ayırmanız gerektiğini unutmayın, ancak şu anda bir formül arayüzü yazmak benim dışımda.
Bu yaklaşım herkese mantıklı geliyor mu? Bunu geliştirebilmemin bir yolu var mı veya bu sorunu çözmek için mevcut bir paket var mı?
predictyöntemi olması şartıyla, bunu yapacak bazı genel işlevlerin olacağından emindim .
carveya*labpaketlerden biri gibi) sizinki gibi bir işlev sağlayacağından emin olabilirdim. Üzgünüm yardım edemem. K-yönlü SVM'nin nasıl çalıştığı hakkında biraz okudum ve düşündüğümden daha karmaşık gibi görünüyor.