บทความเกี่ยวกับ 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 ด้วยตัวเองซึ่งน่าเกลียดนิดหน่อย แต่การเขียนอินเตอร์เฟสสูตรอยู่นอกเหนือฉันในขณะนี้
วิธีการนี้เหมาะสมกับทุกคนหรือไม่ มีวิธีใดบ้างที่ฉันสามารถปรับปรุงหรือมีแพคเกจที่มีอยู่เพื่อแก้ไขปัญหานี้หรือไม่?
predict
วิธีการ
car
หรือ*lab
แพ็คเกจใดแพ็คเกจหนึ่ง) จะให้ฟังก์ชั่นเหมือนของคุณ ขอโทษฉันไม่สามารถช่วยได้ ฉันได้อ่านเล็กน้อยเกี่ยวกับวิธีการทำงานของ SVM แบบ k-way และดูเหมือนว่ามันซับซ้อนกว่าที่ฉันคิด