बहु-वर्ग समस्याओं के लिए 2-वर्ग मॉडल का विस्तार


11

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-वर्ग मॉडल के लिए काम करना चाहिए । ध्यान दें कि आपको एक्स और वाई घटकों को मैन्युअल रूप से विभाजित करना होगा, जो थोड़ा बदसूरत है, लेकिन एक सूत्र इंटरफ़ेस लिखना मेरे लिए इस समय से परे है।

क्या यह दृष्टिकोण सभी के लिए समझ में आता है? क्या कोई तरीका है जिससे मैं इसे सुधार सकता हूं, या इस मुद्दे को हल करने के लिए कोई मौजूदा पैकेज है?


2
वाह, जब तक आपने पूछा और मैंने देखा, मुझे यकीन है कि कुछ पैकेज (जैसे car, या पैकेज में से एक *lab) ने आपके लिए एक फ़ंक्शन प्रदान किया होगा। क्षमा करें, मैं मदद नहीं कर सकता। मैंने थोड़ा सा पढ़ा है कि किस तरह से एसवीएम काम करता है और ऐसा लगता है कि जैसा मैंने सोचा था उससे कहीं अधिक जटिल था।
वेन

1
@Wayne: मुझे भी! मुझे यकीन था कि कुछ सामान्य कार्य होंगे जो ऐसा करेंगे, बशर्ते मॉडल में एक predictविधि हो।
Zach

जवाबों:


1

सुधार करने का एक तरीका "सभी जोड़े भारित" दृष्टिकोण का उपयोग करना है जो कि अभी भी स्केलेबल है, जबकि "सभी के खिलाफ एक" से बेहतर है।

मौजूदा पैकेजों के लिए, glmnetबहुउद्देशीय लॉगिट का समर्थन करता है (नियमित) जो बहु-स्तरीय क्लासिफायरियर के रूप में इस्तेमाल किया जा सकता है।


मैं आर के कई पैकेजों से अवगत हूं, जो बहु-श्रेणी वर्गीकरण (जैसे कि ग्लेमनेट, यादृच्छिक वन, कर्नेलब, रापर, एननेट, आदि) का समर्थन करते हैं। मैं बाइनरी क्लासिफिकेशन पैकेजों (जैसे gbm) को बहुस्तरीय समस्याओं के विस्तार के बारे में अधिक उत्सुक हूँ। मैं "सभी जोड़े को भारित करूंगा"।
Zach

इसके अलावा, यह दिलचस्प है कि glmnetइसमें एक multinomialनुकसान फ़ंक्शन शामिल है । मुझे आश्चर्य है कि अगर यह नुकसान फ़ंक्शन आर में अन्य एल्गोरिदम में इस्तेमाल किया जा सकता है, जैसे adaया gbm?
Zach

हां, कुछ तरीकों को बहुराष्ट्रीय हानि फ़ंक्शन का समर्थन करने के लिए बढ़ाया जा सकता है। उदाहरण के लिए, कर्नेल लॉजिस्टिक रिग्रेशन को इस तरह बढ़ाया जाता है: books.nips.cc/papers/files/nips14/AA13.pdf जहाँ तक पता adaहै कि एक विशिष्ट (घातीय) हानि फ़ंक्शन के लिए "आरक्षित" है, लेकिन एक और बढ़ाया जा सकता है। बहु-आयामी हानि फ़ंक्शन का समर्थन करने के लिए -बेड विधि - जैसे मल्टी-क्लास GBM पर विवरण के लिए सांख्यिकीय लर्निंग के तत्वों के पृष्ठ 360 देखें - K बाइनरी ट्री प्रत्येक बूस्टिंग पुनरावृत्ति के लिए बनाए जाते हैं जहां K कक्षाओं की संख्या है (प्रति पेड़ सिर्फ एक पेड़) बाइनरी मामले में आवश्यक है)।
येवगेनी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.