বহু-শ্রেণীর সমস্যাগুলিতে 2-শ্রেণির মডেলগুলি প্রসারিত করা হচ্ছে


11

অ্যাডাবোস্টের এই কাগজটি কে-শ্রেণির সমস্যাগুলিতে 2-শ্রেণির মডেলগুলি বাড়ানোর জন্য কিছু পরামর্শ এবং কোড (পৃষ্ঠা 17) দেয়। আমি এই কোডটি সাধারণীকরণ করতে চাই, যেমন আমি সহজেই বিভিন্ন 2-শ্রেণির মডেলগুলিতে প্লাগ করতে পারি এবং ফলাফলগুলি তুলনা করতে পারি। কারণ বেশিরভাগ শ্রেণিবদ্ধকরণের মডেলগুলির একটি সূত্র ইন্টারফেস এবং একটি predictপদ্ধতি রয়েছে, এর কয়েকটি অপেক্ষাকৃত সহজ হওয়া উচিত। দুর্ভাগ্যক্রমে, আমি 2-শ্রেণীর মডেলগুলি থেকে শ্রেণীর সম্ভাব্যতাগুলি বের করার কোনও মানক উপায় খুঁজে পাইনি, সুতরাং প্রতিটি মডেলের জন্য কিছু কাস্টম কোডের প্রয়োজন হবে।

আমি এখানে একটি ফাংশন লিখেছি যাতে আমি কে-ক্লাসের সমস্যাটিকে 2-শ্রেণির সমস্যাগুলিতে বিভক্ত করতে এবং কে মডেলগুলি ফিরিয়ে দিতে:

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-শ্রেণির মডেল থেকে শ্রেণিবদ্ধ সম্ভাবনাগুলি বের করার জন্য একীভূত উপায় নেই:

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(আমি জানি এলডিএ একাধিক ক্লাস পরিচালনা করতে পারে তবে এটি কেবল একটি উদাহরণ):

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-শ্রেণির মডেলের জন্য কাজ করা উচিত । মনে রাখবেন যে আপনাকে এক্স এবং ওয়াই উপাদানগুলি ম্যানুয়ালি বিভক্ত করতে হবে যা কিছুটা কুরুচিপূর্ণ তবে সূত্রের ইন্টারফেসটি লেখার মুহূর্তে আমার বাইরে beyond

এই দৃষ্টিভঙ্গি কি সবার কাছে অর্থবোধ করে? আমি কীভাবে এটি উন্নত করতে পারি, বা এই সমস্যাটি সমাধান করার জন্য কোনও প্যাকেজ রয়েছে?


2
বাহ, আপনি যতক্ষণ না জিজ্ঞাসা করলেন এবং আমি ততক্ষণ তাকালাম, আমি নিশ্চিত হয়েছি যে কিছু প্যাকেজ (যেমন car, বা *labপ্যাকেজগুলির মধ্যে একটি) আপনার মতো একটি কার্য সরবরাহ করেছিল। দুঃখিত আমি সাহায্য করতে পারি না। কে-ওয়ে এসভিএম কীভাবে কাজ করে সে সম্পর্কে আমি কিছুটা পড়েছি এবং মনে হয় এটি ভাবনার চেয়ে আরও জটিল।
ওয়েইন

1
@ ওয়াইন: আমিও! আমি নিশ্চিত ছিলাম যে কোনও সাধারণ ক্রিয়াকলাপ হবে যা এটি করবে, শর্ত থাকে যে মডেলটির কোনও predictপদ্ধতি আছে has
জাচ

উত্তর:


1

উন্নত করার একটি উপায় হ'ল "ওয়েটড অল পেয়ার" পদ্ধতির ব্যবহার করা যা সম্ভবত স্কেলযোগ্য অবস্থায় "সকলের বিরুদ্ধে একটি" এর চেয়ে ভাল।

বিদ্যমান প্যাকেজগুলির হিসাবে, glmnetবহুজাতিক শ্রেণিতে শ্রেণিবদ্ধ হিসাবে ব্যবহৃত হতে পারে (নিয়মিত) মাল্টিনোমিয়াল লজিট সমর্থন করে।


আমি আর-তে অনেকগুলি প্যাকেজ সম্পর্কে সচেতন যা বহু শ্রেণীর শ্রেণিবিন্যাসকে সমর্থন করে (যেমন গ্ল্যামনেট, এলোমেলো বন, কর্নলব, আরপার্ট, নেট ইত্যাদি) etc. বাইনারি শ্রেণিবদ্ধকরণ প্যাকেজগুলি (যেমন জিবিএম) মাল্টিক্লাস সমস্যার ক্ষেত্রে বাড়ানো সম্পর্কে আমি আরও আগ্রহী। আমি "সমস্ত জোড় ভারীড" যাব।
Zach

এছাড়াও, এটি আকর্ষণীয় যা glmnetএকটি multinomialক্ষতি ফাংশন অন্তর্ভুক্ত । আমি ভাবছি এই হারের ফাংশন যেমন আর অন্য আলগোরিদিম, এ ব্যবহার করা যেতে পারে যদি adaবা gbm?
Zach

হ্যাঁ, বহুজাতিক লোকসান ফাংশন সমর্থন করার জন্য কিছু পদ্ধতি বাড়ানো যেতে পারে। উদাহরণস্বরূপ, কার্নেল লজিস্টিক রিগ্রেশনটি এখানে সেভাবে প্রসারিত করা হয়েছে: Books.nips.cc/papers/files/nips14/AA13.pdf যতদূর জানি adaনির্দিষ্ট ( ক্ষতিকারক ) ক্ষতি ফাংশনের জন্য "সংরক্ষিত" রয়েছে, তবে একজন আরেকটি উত্সাহ বাড়িয়ে দিতে পারে বহু-ক্ষতির ক্ষতি ফাংশন সমর্থন করার জন্য ভিত্তিক পদ্ধতি - যেমন মাল্টি-ক্লাস জিবিএম সম্পর্কিত বিশদগুলির জন্য পরিসংখ্যান শিক্ষার উপাদানগুলির পৃষ্ঠা 360 দেখুন - কে বাইনারি গাছগুলি প্রতিটি উত্সাহিত পুনরাবৃত্তির জন্য তৈরি করা হয়েছে যেখানে কে শ্রেণি সংখ্যা (পুনরাবৃত্তির জন্য কেবল একটি গাছ) বাইনারি ক্ষেত্রে প্রয়োজন)।
ইয়েভজেনি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.