ขยายโมเดล 2 ระดับไปสู่ปัญหาหลายระดับ


11

บทความเกี่ยวกับ Adaboostนี้จะให้คำแนะนำและรหัส (หน้า 17) สำหรับการขยายโมเดล 2-class ไปสู่ปัญหา K-class ฉันต้องการที่จะพูดคุยรหัสนี้เพื่อที่ฉันสามารถเสียบรุ่น 2 ระดับที่แตกต่างกันได้อย่างง่ายดายและเปรียบเทียบผลลัพธ์ เนื่องจากโมเดลการจำแนกประเภทส่วนใหญ่มีอินเตอร์เฟสสูตรและpredictวิธีการบางอย่างนี้จึงค่อนข้างง่าย น่าเสียดายที่ฉันไม่พบวิธีการแยกความน่าจะเป็นแบบคลาสจากแบบจำลอง 2 ระดับดังนั้นแต่ละรุ่นจะต้องใช้รหัสที่กำหนดเอง

นี่คือฟังก์ชั่นที่ฉันเขียนเพื่อแบ่งปัญหา K-class ออกเป็นปัญหา 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ความน่าจะเป็นที่คาดการณ์ไว้เป็นมาตรฐานและจำแนกกรณี โปรดทราบว่ามันขึ้นอยู่กับคุณที่จะสร้างคอลัมน์ K data.frameของความน่าจะเป็นจากแต่ละรุ่นเนื่องจากไม่มีวิธีแบบรวมที่จะแยกความน่าจะเป็นของคลาสออกจากโมเดล 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

ฟังก์ชั่นเหล่านี้ควรใช้ได้กับโมเดล 2 คลาสที่มีอินเตอร์เฟสสูตรและpredictเมธอด โปรดทราบว่าคุณต้องแยกส่วนประกอบ X และ Y ด้วยตัวเองซึ่งน่าเกลียดนิดหน่อย แต่การเขียนอินเตอร์เฟสสูตรอยู่นอกเหนือฉันในขณะนี้

วิธีการนี้เหมาะสมกับทุกคนหรือไม่ มีวิธีใดบ้างที่ฉันสามารถปรับปรุงหรือมีแพคเกจที่มีอยู่เพื่อแก้ไขปัญหานี้หรือไม่?


2
ว้าวจนกว่าคุณจะถามและฉันดูฉันแน่ใจว่าแพ็กเกจ (เช่นcarหรือ*labแพ็คเกจใดแพ็คเกจหนึ่ง) จะให้ฟังก์ชั่นเหมือนของคุณ ขอโทษฉันไม่สามารถช่วยได้ ฉันได้อ่านเล็กน้อยเกี่ยวกับวิธีการทำงานของ SVM แบบ k-way และดูเหมือนว่ามันซับซ้อนกว่าที่ฉันคิด
เวย์น

1
@Wayne: ฉันด้วย! ฉันมั่นใจว่าจะมีฟังก์ชั่นทั่วไปที่จะทำเช่นนี้หากโมเดลมีpredictวิธีการ
Zach

คำตอบ:


1

วิธีหนึ่งในการปรับปรุงคือการใช้วิธี"ถ่วงน้ำหนักทุกคู่"ซึ่งควรจะดีกว่า "หนึ่งต่อทั้งหมด" ในขณะที่ยังสามารถปรับขนาดได้

สำหรับแพคเกจที่มีอยู่glmnetรองรับ logit multinomial (ปกติ) ซึ่งสามารถใช้เป็นลักษณนามหลายระดับ


ฉันตระหนักถึงแพ็คเกจจำนวนมากใน R ที่สนับสนุนการจำแนกประเภทหลายคลาส (เช่น glmnet, ฟอเรสต์แบบสุ่ม, kernlab, rpart, nnet เป็นต้น) ฉันอยากรู้เพิ่มเติมเกี่ยวกับการขยายแพ็คเกจการจำแนกประเภทไบนารี (เช่น gbm) เป็นปัญหาแบบหลายคลาส ฉันจะดูเป็น "ถ่วงน้ำหนักทุกคู่"
Zach

นอกจากนี้ยังเป็นที่น่าสนใจที่glmnetมีmultinomialฟังก์ชั่นการสูญเสีย ฉันสงสัยว่าฟังก์ชั่นการสูญเสียนี้สามารถนำมาใช้ในขั้นตอนวิธีการอื่น ๆ ในการวิจัยเช่นadaหรือgbm?
Zach

ใช่สามารถขยายวิธีการบางอย่างเพื่อรองรับฟังก์ชั่นการสูญเสียหลายส่วน ตัวอย่างเช่นการถดถอยของเคอร์เนลลอจิสติกส์จะขยายออกมาด้วยวิธีนี้: books.nips.cc/papers/files/nips14/AA13.pdf เท่าที่ทราบadaคือ "สงวน" ไว้สำหรับฟังก์ชันการสูญเสีย (เอกซ์โปเนนเชียล) ที่เฉพาะเจาะจง ตามวิธีการเพื่อสนับสนุนฟังก์ชั่นการสูญเสีย multinomial - เช่นดูหน้า 360 ขององค์ประกอบการเรียนรู้ทางสถิติสำหรับรายละเอียดเกี่ยวกับ GBM หลายคลาส - ต้นไม้ไบนารี K ถูกสร้างขึ้นสำหรับการทำซ้ำแต่ละครั้งที่ K คือจำนวนชั้นเรียน เป็นสิ่งจำเป็นในกรณีไบนารี)
Yevgeny
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.