Adaboost का यह पेपर 2-क्लास मॉडल को K- क्लास की समस्याओं के विस्तार के लिए कुछ सुझाव और कोड (पेज 17) देता है। मैं इस कोड को सामान्य बनाना चाहूंगा, जैसे कि मैं आसानी से विभिन्न 2-क्लास मॉडल में प्लग कर सकता हूं और परिणामों की तुलना कर सकता हूं। क्योंकि अधिकांश वर्गीकरण मॉडल में एक सूत्र इंटरफ़ेस और एक predict
विधि है, इसमें से कुछ अपेक्षाकृत आसान होना चाहिए। दुर्भाग्य से, मुझे 2-श्रेणी के मॉडल से कक्षा की संभावनाओं को निकालने का एक मानक तरीका नहीं मिला है, इसलिए प्रत्येक मॉडल को कुछ कस्टम कोड की आवश्यकता होगी।
यहाँ एक समारोह है जिसे मैंने K- वर्ग की समस्या को 2-वर्ग की समस्याओं में तोड़ने के लिए लिखा है, और K मॉडल को लौटाया है:
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)
}
यहाँ एक भविष्यवाणी विधि है जो मैंने प्रत्येक मॉडल पर पुनरावृति करने और भविष्यवाणियाँ करने के लिए लिखी है:
predict.oneVsAll <- function(object, newX=object$info$X, ...) {
stopifnot(class(object)=='oneVsAll')
lapply(object$models, function(x) {
predict(x, newX, ...)
})
}
और अंत में, यहां data.frame
भविष्यवाणियों की संभावनाओं को सामान्य करने और मामलों को वर्गीकृत करने का एक कार्य है । ध्यान दें कि data.frame
प्रत्येक मॉडल से संभावनाओं के K- कॉलम का निर्माण करना आपके ऊपर है , क्योंकि 2-क्लास मॉडल से कक्षा की संभावनाओं को निकालने का एक एकीकृत तरीका नहीं है:
classify <- function(dat) {
out <- dat/rowSums(dat)
out$Class <- apply(dat, 1, function(x) names(dat)[which.max(x)])
out
}
यहाँ एक उदाहरण का उपयोग कर रहा है 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
यहाँ एक उदाहरण का उपयोग किया गया है lda
(मुझे पता है कि lda कई वर्गों को संभाल सकता है, लेकिन यह सिर्फ एक उदाहरण है):
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
ये फ़ंक्शन सूत्र इंटरफ़ेस और predict
विधि के साथ किसी भी 2-वर्ग मॉडल के लिए काम करना चाहिए । ध्यान दें कि आपको एक्स और वाई घटकों को मैन्युअल रूप से विभाजित करना होगा, जो थोड़ा बदसूरत है, लेकिन एक सूत्र इंटरफ़ेस लिखना मेरे लिए इस समय से परे है।
क्या यह दृष्टिकोण सभी के लिए समझ में आता है? क्या कोई तरीका है जिससे मैं इसे सुधार सकता हूं, या इस मुद्दे को हल करने के लिए कोई मौजूदा पैकेज है?
predict
विधि हो।
car
, या पैकेज में से एक*lab
) ने आपके लिए एक फ़ंक्शन प्रदान किया होगा। क्षमा करें, मैं मदद नहीं कर सकता। मैंने थोड़ा सा पढ़ा है कि किस तरह से एसवीएम काम करता है और ऐसा लगता है कि जैसा मैंने सोचा था उससे कहीं अधिक जटिल था।