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.frame2 클래스 모델에서 클래스 확률을 추출하는 통일 된 방법이 없기 때문에 각 모델에서 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 구성 요소를 수동으로 분할해야하지만 수식 인터페이스를 작성하는 것은 현재로서는 불가능합니다.

이 접근법은 모든 사람에게 합리적입니까? 개선 할 수있는 방법이 있습니까, 아니면이 문제를 해결하기위한 기존 패키지가 있습니까?


2
와우, 당신이 물어보고 내가 볼 때까지, 나는 어떤 패키지 (와 같은 car또는 *lab패키지 중 하나 )가 당신과 같은 기능을 제공했을 것이라고 확신했을 것입니다. 도와 드릴 수 없어서 미안 해요 k-way SVM의 작동 방식에 대해 조금 읽었으며 생각했던 것보다 더 복잡해 보입니다.
Wayne

1
@ 웨인 : 저도 요! 모델에 predict메소드 가있는 경우이 작업을 수행하는 일반적인 기능이있을 것이라고 확신했습니다 .
Zach

답변:


1

개선 할 수있는 한 가지 방법은 "확장 된 모든 쌍"접근 방식을 사용 하는 것인데, 이는 여전히 확장 가능하지만 "모두에 대한 것"보다 낫습니다.

기존 패키지 glmnet는 다중 클래스 분류 자로 사용할 수있는 지원 (정규화 된) 다항 로짓을 지원합니다.


다중 클래스 분류를 지원하는 R의 많은 패키지 (glmnet, random forests, kernlab, rpart, nnet 등)를 알고 있습니다. 바이너리 분류 패키지 (예 : gbm)를 멀티 클래스 문제로 확장하는 것이 더 궁금합니다. "모든 가중치를 적용한 가중치"를 살펴 보겠습니다.
Zach

또한 손실 함수 를 glmnet포함하는 것도 흥미 롭습니다 multinomial. 이 손실 함수를 R의 다른 알고리즘 (예 : ada또는 gbm?) 에서 사용할 수 있는지 궁금합니다 .
Zach

예, 다항식 손실 함수를 지원하기 위해 일부 방법을 확장 할 수 있습니다. 예를 들어, 커널 로지스틱 회귀 분석은 다음과 같이 확장됩니다 : books.nips.cc/papers/files/nips14/AA13.pdf ada특정 (지수) 손실 함수에 대해 "보존"된 한, 다른 부스팅을 확장 할 수 있습니다 다항식 손실 함수를 지원하는 기반 방법-예 : 멀티 클래스 GBM에 대한 자세한 내용은 통계 학습 요소 360 페이지 참조-K 이진 트리는 각 부스팅 반복마다 빌드됩니다. 여기서 K는 클래스 수입니다 (반복 당 하나의 트리). 이진 경우에 필요합니다).
예브게니
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.