ডেটামিনিংয়ের জন্য ফ্যাক্টর স্তরগুলির সংমিশ্রণের জন্য প্যাকেজ?


10

ভাবছেন যে কেউ যদি আর এর কোনও প্যাকেজ / ফাংশন জুড়ে চলেছে যা এমন কোনও ফ্যাক্টরের স্তরগুলিকে একত্রিত করবে যেটির উপাদানগুলির সমস্ত স্তরের অনুপাতটি কিছু প্রান্তিকের চেয়ে কম? বিশেষত, আমি প্রস্তুত ডেটা প্রস্তুতির প্রথম পদক্ষেপগুলির মধ্যে একটি হল বিরল স্তরের কারণগুলি একসাথে ('অন্যান্য' নামক একটি স্তরে বলুন) ভেঙে ফেলা যা কমপক্ষে মোট 2% বলে না। এটি নিষ্ক্রিয় করা হয় এবং যখন উদ্দেশ্য হয় বিপণনে কিছু ক্রিয়াকলাপ মডেল করা হয় (জালিয়াতি সনাক্তকরণ নয়, যেখানে খুব ছোট ঘটনাগুলি অত্যন্ত গুরুত্বপূর্ণ হতে পারে)। আমি এমন একটি ফাংশন খুঁজছি যা কিছু থ্রেশহোল্ড অনুপাত পূরণ না হওয়া অবধি স্তরে পতন ঘটবে।

হালনাগাদ:

এই দুর্দান্ত পরামর্শগুলির জন্য ধন্যবাদ আমি খুব সহজেই একটি ফাংশন লিখেছি। আমি অনুধাবন করেছিলাম যে অনুপাতের সাথে স্তরগুলি হ্রাস করা সম্ভব ছিল <ন্যূনতম এবং এখনও যে পুনরায় পুনঃনির্মাণের স্তরটি ন্যূনতম হতে হবে, অনুপাতের সাথে সর্বনিম্ন স্তরের সংযোজন প্রয়োজন> ন্যূনতম। সম্ভবত আরও দক্ষ হতে পারে তবে এটি কাজ করে বলে মনে হয়। পরবর্তী বর্ধিতাংশ হ'ল নতুন ডেটাতে (একটি বৈধতা সেট বা ভবিষ্যতের ডেটা) পতনের যুক্তি প্রয়োগ করার জন্য "বিধিগুলি" কীভাবে ক্যাপচার করবেন তা নির্ধারণ করা।

collapseFactors<- function(tableName,minPercent=5,fillIn ="RECODED" )
{
    for (i in 1:ncol(tableName))
        {   

            if(is.factor(tableName[,i]) == TRUE) #process just factors
            {


                sortedTable<-sort(prop.table(table(tableName[,i])))
                numberToCollapse<-length(sortedTable[sortedTable<(minPercent/100)])

                if (sum(sortedTable[1:numberToCollapse])<(minPercent/100))
                    {
                        numberToCollapse=numberToCollapse+1 #add next level if < minPercent
                    }

                if(numberToCollapse>1) #if not >1 then nothing to collapse
                {
                    lf <- names(sortedTable[1:numberToCollapse])
                    levels(tableName[,i])[levels(tableName[,i]) %in% lf] <- fillIn
                }
            }#end if a factor


        }#end for loop

    return(tableName)

}#end function

আর একটি পদ্ধতির জন্য: stats.stackexchange.com/questions/227125/…
kjetil b halvorsen

উত্তর:


11

দেখে মনে হচ্ছে এটি কেবল ফ্যাক্টরটিকে "পুনর্বিবেচনার" বিষয়; আংশিক অঙ্কগুলি গণনা বা মূল ভেক্টরের অনুলিপি তৈরি করার দরকার নেই। যেমন,

set.seed(101)
a <- factor(LETTERS[sample(5, 150, replace=TRUE, 
                           prob=c(.1, .15, rep(.75/3,3)))])
p <- 1/5
lf <- names(which(prop.table(table(a)) < p))
levels(a)[levels(a) %in% lf] <- "Other"

এখানে, মূল ফ্যাক্টর স্তরগুলি নিম্নরূপে বিতরণ করা হয়েছে:

 A  B  C  D  E 
18 23 35 36 38 

এবং তারপর এটি হয়ে যায়

Other     C     D     E 
   41    35    36    38 

এটি কোনও ফাংশনে সুবিধামতভাবে আবৃত হতে পারে। পুনরায় আকার প্যাকেজটিতে একটি combine_factor()ফাংশন রয়েছে , তাই আমার ধারণা এটিও কার্যকর হতে পারে।

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


ধন্যবাদ আমি ক্যারেট প্যাকেজটি অধ্যয়ন করেছি এবং এটি মেটা পরামিতিগুলি সুর করার জন্য ব্যবহার করেছি। খুব দরকারী!.
বি_মিনার

@ সিএল +1, দুর্দান্ত আমি আমার ফাংশনটি কেবলমাত্র লিখেছি কারণ কোড এ [লেভেল (ক)%% এফএফ তে] <- "অন্যান্য" কাজ করে না, তাই আমি ধরে নিয়েছি যে ফ্যাক্টর স্তর পরিবর্তন জটিল বিষয়। যথারীতি দেখা গেল, আর আর জটিল নয়, আমি :)
এমপিটকাস

@mpiktas Thx। উদাহরণস্বরূপ, আপনি ভেক্টর স্তরে কাজ করতে পারেন a[as.character(a) %in% lf] <- lf[1]; a <- factor(droplevels(a), labels=c("Other",LETTERS[3:5]))
chl

+1 টি। একটি [স্তর (ক)%% এলএফ মধ্যে%] <- "অন্যান্য" নিশ্চিত কোড লাইন একটি টন সংরক্ষণ করে। চালাক এবং দক্ষ!
ক্রিস্টোফার অ্যাডেন

তবে মনে রাখবেন যে একটি [a == "a"] <- "অন্যান্য" কাজ করবে না, যা আমার পক্ষে এটি অনুমান করা বেশ স্বাভাবিক। বিশেষত যেহেতু একটি [a == "a"] পুরোপুরি বৈধ।
এমপিটিকাস

5

ক্রিস্টোফার উত্তরের একমাত্র সমস্যা হ'ল এটি ফ্যাক্টরের মূল ক্রমটি মেশাবে। এখানে আমার সংশোধন:

 Merge.factors <- function(x, p) {
     t <- table(x)
     levt <- cbind(names(t), names(t)) 
     levt[t/sum(t)<p, 2] <- "Other"
     change.levels(x, levt)
 }

change.levelsনিম্নলিখিত ফাংশন যেখানে । আমি এটি কিছু সময় আগে লিখেছিলাম, তাই আমি সন্দেহ করি যে এটি কী করে তা অর্জনের আরও ভাল উপায় থাকতে পারে।

 change.levels <- function(f, levt) {
     ##Change the the names of the factor f levels from
     ##substitution table levt.
     ## In the first column there are the original levels, in
     ## the second column -- the substitutes
     lv <- levels(f)
     if(sum(sort(lv) != sort(levt[, 1]))>0)
     stop ("The names from substitution table does not match given level names")
     res <- rep(NA, length(f))

     for(i in lv) {
          res[f==i] <- as.character(levt[levt[, 1]==i, 2])
     }
     factor(res)
}

4

আমি একটি দ্রুত ফাংশন লিখেছি যা এই লক্ষ্যটি অর্জন করবে। আমি একজন শিক্ষানবিশ আর, তাই এটি বড় টেবিলগুলির সাথে ধীর হতে পারে।

Merge.factors <- function(x, p) { 
    #Combines factor levels in x that are less than a specified proportion, p.
    t <- table(x)
    y <- subset(t, prop.table(t) < p)
    z <- subset(t, prop.table(t) >= p)
    other <- rep("Other", sum(y))
    new.table <- c(z, table(other))
    new.x <- as.factor(rep(names(new.table), new.table))
    return(new.x)
}

কর্মের উদাহরণ হিসাবে:

> a <- rep("a", 100)
> b <- rep("b", 1000)
> c <- rep("c", 1000)
> d <- rep("d", 1000)
> e <- rep("e", 400)
> f <- rep("f", 100)
> x <- factor(c(a, b, c, d, e, f))
> summary(x)
   a    b    c    d    e    f 
 100 1000 1000 1000  400  100 
> prop.table(table(x))
x
         a          b          c          d          e          f 
0.02777778 0.27777778 0.27777778 0.27777778 0.11111111 0.02777778 
> 
> w <- Merge.factors(x, .05)
> summary(w)
    b     c     d     e Other 
 1000  1000  1000   400   200 
> class(w)
[1] "factor"

জন পর্যবেক্ষণের জন্য ধন্যবাদ। আমি এটিকে একটি ফ্যাক্টর তৈরি করতে এটি একটু পরিবর্তন করেছি। আমি যা করেছি তা হ'ল টেবিল থেকে আসল ভেক্টরটি পুনরায় তৈরি করা হয়েছিল, সুতরাং যদি সেই ধাপটি এড়িয়ে যাওয়ার কোনও উপায় থাকে তবে এটি দ্রুত হবে।
ক্রিস্টোফার অ্যাডেন

প্রতিক্রিয়া ধন্যবাদ সবাই কে. আমার আর দুর্বল তবে কোডের কয়েকটি লাইন দিয়ে এটি করার ক্ষমতা এটি কতটা শক্তিশালী এবং এটি আমাকে শিখতে চায় তা প্রমাণ করার জন্য ament
বি_মিনার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.