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
2 클래스 모델에서 클래스 확률을 추출하는 통일 된 방법이 없기 때문에 각 모델에서 K 열 확률 을 구성하는 것은 사용자의 책임입니다.
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 클래스 모델에서 작동합니다 . 약간 추악한 X 및 Y 구성 요소를 수동으로 분할해야하지만 수식 인터페이스를 작성하는 것은 현재로서는 불가능합니다.
이 접근법은 모든 사람에게 합리적입니까? 개선 할 수있는 방법이 있습니까, 아니면이 문제를 해결하기위한 기존 패키지가 있습니까?
predict
메소드 가있는 경우이 작업을 수행하는 일반적인 기능이있을 것이라고 확신했습니다 .
car
또는*lab
패키지 중 하나 )가 당신과 같은 기능을 제공했을 것이라고 확신했을 것입니다. 도와 드릴 수 없어서 미안 해요 k-way SVM의 작동 방식에 대해 조금 읽었으며 생각했던 것보다 더 복잡해 보입니다.