더북(TheBook)

원 핫 인코딩

지금까지 하나의 범주형 데이터는 하나의 팩터Factor 데이터 변수로만 표현해왔다. 범주형 변수의 레벨(수준)level 수가 적다면 하나의 팩터 변수로 여러 레벨을 표현해도 문제가 없지만, 범주 레벨의 수가 많다면 경우에 따라 표현 방식을 다르게 해야 한다.

예를 들어, 랜덤 포레스트 알고리즘(‘10.3.4 랜덤 포레스트’ 절 참고)의 경우 범주형 변수의 레벨 수를 32로 제한하고 있다. 이를 확인해보기 위해 많은 수의 레벨을 가진 범주형 변수를 포함한 데이터를 작성해보자. 아래 코드에서는 all에 총 52개 레벨을 가진 범주형 변수를 저장하고, value에는 임의의 수를 저장했다.

> (all <- factor(c(paste0(LETTERS, "0"), paste0(LETTERS, "1"))))
 [1] A0 B0 C0 D0 E0 F0 G0 H0 I0 J0 K0 L0 M0 N0 O0 P0 Q0 R0 S0 T0
[21] U0 V0 W0 X0 Y0 Z0 A1 B1 C1 D1 E1 F1 G1 H1 I1 J1 K1 L1 M1 N1
[41] O1 P1 Q1 R1 S1 T1 U1 V1 W1 X1 Y1 Z1
52 Levels: A0 A1 B0 B1 C0 C1 D0 D1 E0 E1 F0 F1 G0 G1 H0 ... Z1

> (data <- data.frame(lvl=all, value=rnorm(length(all))))
   lvl       value
1  A0 -2.03998512
2  B0 -0.39505084
3  C0  0.06381953
4  D0 -0.94488257
5  E0  0.49949404
...

이 데이터를 랜덤 포레스트 알고리즘에 입력으로 주면 다음과 같이 32개 이상의 레벨은 처리할 수 없다는 에러 메시지가 출력된다. 32개 이상의 레벨을 한 번의 가지치기로 나누는 경우의 수는 약 232에 달해 지나치게 계산양이 많기 때문이다.

> install.packages("randomForest")
> library(randomForest)
> m <- randomForest(value ~ lvl, data=data)
Error in randomForest.default(m, y, ...) :
  Can not handle categorical predictors with more than 32 categories.

이를 해결하기 위해 발생 빈도가 낮은 레벨들을 하나로 묶거나, 범주형 변수의 레벨을 숫자로 취급하는 방법을 생각해볼 수 있다. 또 다른 방법은 여러 개의 가변수dummy variables를 사용해 범주형 변수를 재표현하는 것으로, 원 핫 인코딩One Hot Encoding이라고 부른다. 원 핫 인코딩은 model.matrix( )를 사용해 구할 수 있다.

표 9-5 원 핫 인코딩

model.matrix : 디자인 행렬(모델 행렬)을 생성한다.

model.matrix(
  object,  # formula 객체
  data     # formula를 적용할 객체
)

반환 값은 디자인 행렬이다.

다음은 A, B, C 3개 레벨을 저장한 lvl이라는 팩터를 3개의 변수로 재표현한 예다. model.matrix( )의 결과를 보면 A는 (0, 0), B는 (1, 0), C는 (0, 1)로 변환된 것을 알 수 있다.

> (x <- data.frame(lvl=factor(c("A", "B", "A", "A", "C")),
+                  value=c(1, 3, 2, 4, 5)))
  lvl value
1   A     1
2   B     3
3   A     2
4   A     4
5   C     5

> model.matrix(~ lvl, data=x)[, -1]
  lvlB lvlC
1    0    0
2    1    0
3    0    0
4    0    0
5    0    1
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.