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がどのように機能するかについて少し読んだところ、思ったよりも複雑だったようです。
ウェイン

1
@ウェイン:私も!モデルにpredictメソッドがある場合、これを行う一般的な関数がいくつかあると確信していました。
ザック

回答:


1

改善する1つの方法は、「すべてに対して1つ」よりも優れていると思われる「すべてのペアの重み付け」アプローチを使用することです。

既存のパッケージとglmnet同様に、マルチクラス分類器として使用できる(正規化された)多項ロジットをサポートします。


マルチクラスの分類をサポートするRの多くのパッケージ(glmnet、ランダムフォレスト、kernlab、rpart、nnetなど)を知っています。バイナリ分類パッケージ(gbmなど)をマルチクラスの問題に拡張することに興味があります。「すべてのペアの重み付け」を調べます。
Zach

また、損失関数がglmnet含まれているのも興味深いですねmultinomial。この損失関数は、Rなどの他のアルゴリズムで使用できますadagbm
Zach

はい、いくつかの方法を拡張して多項損失関数をサポートできます。たとえば、カーネルロジスティック回帰はここでそのように拡張されます。books.nips.cc/ papers / files / nips14 / AA13.pdf既知の限りada、特定の(指数)損失関数に「予約」されていますが、別のブースティングを拡張することもできます多項損失関数をサポートするためのベースの方法-たとえば、マルチクラスGBMの詳細については、統計学習の要素の360ページを参照-Kはクラスの数であるブースティング反復ごとにKバイナリツリーが構築されます(反復ごとに1つのツリーのみ)バイナリの場合に必要です)。
Yevgeny 2012年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.