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 predict
yö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.frame
tahmin 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 predict
yö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ı?
predict
yöntemi olması şartıyla, bunu yapacak bazı genel işlevlerin olacağından emindim .
car
veya*lab
paketlerden 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.