데이터 마이닝을위한 요소 수준을 결합하기위한 R 패키지?


10

팩터의 모든 레벨의 비율이 임계 값보다 작은 팩터의 레벨을 결합하는 패키지 / 함수를 R에서 실행했는지 궁금하십니까? 구체적으로, 내가 수행하는 데이터 준비의 첫 번째 단계 중 하나는 전체의 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

답변:


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()관측 값에 매우 불균형 분포를 갖는 예측 변수에 플래그를 지정할 수있는 것과 같은 기능을 포함하여 데이터 전처리에 유용한 기능이 많이 있습니다 ( 예 : 비 네트, 예제 데이터, 전처리 기능, 시각화 및 기타 기능 , p. 5 참조). 사용).


@CHI 감사합니다. 캐럿 패키지를 연구하고 메타 매개 변수를 조정하는 데 사용했습니다. 매우 유용한!.
B_Miner

@chl +1, 좋습니다. 코드 a [levels (a) % in % lf] <- "Other"가 작동하지 않기 때문에 함수를 작성 했으므로 요인 수준 변경이 복잡하다고 가정했습니다. 평소처럼 R이 복잡하지 않다는 것이 밝혀졌습니다. :)
mpiktas

@mpiktas Thx. 예를 들어 다음과 같이 벡터 수준에서 작업 할 수 있습니다 a[as.character(a) %in% lf] <- lf[1]; a <- factor(droplevels(a), labels=c("Other",LETTERS[3:5])).
chl

+1. a [levels (a) % in % lf] <- "기타"는 많은 톤의 코드를 저장합니다. 영리하고 효율적입니다!
Christopher Aden

그러나 a [a == "a"] <- "기타"는 작동하지 않을 것입니다. 특히 a [a == "a"]는 완벽하게 유효하기 때문에.
mpiktas

5

Christopher 답변의 유일한 문제는 요인의 원래 순서를 혼합한다는 것입니다. 여기 내 수정이 있습니다.

 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

이 목표를 달성 할 수있는 빠른 기능을 작성했습니다. 저는 초보자 R 사용자이므로 큰 테이블에서는 느릴 수 있습니다.

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"

관찰 해 주셔서 감사합니다, 존 나는 그것을 고려하기 위해 조금 변경했습니다. 내가 한 것은 테이블에서 원래 벡터를 다시 만드는 것이므로 해당 단계를 건너 뛸 수있는 방법이 있으면 더 빠릅니다.
Christopher Aden

응답 한 모든 사람에게 감사합니다. 내 R은 약하지만 몇 줄의 코드 로이 작업을 수행 할 수있는 능력은 그것이 얼마나 강력한 지 입증하고 배우고 싶습니다.
B_Miner
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.