[R] 범주형 변수 변환하기 (One-Hot Encoding)

해당 포스트에서는 R에서 범주형 변수 변환을 위한 방법으로 One-Hot Encoding 을 소개합니다.

0. 배경

데이터 전처리는 모든 분석의 시작 단계로 전처리 수준에 따라 모델의 성능 차이가 크게 발생 할 수 있습니다. 특히 범주형 데이터의 경우, 머신 러닝 알고리즘에 적용하기 위한 전처리(변환)가 필수적이며 아래에서는 그 중 하나의 방법인 One-Hot Encoding을 소개합니다.

R에는 One-Hot Encoding을 지원하는 다수의 패키지들이 있지만, 이번 포스트에서는 제가 분석 업무를 수행하면서 자주 사용하는 3가지 패키지들을 예시로 설명드리겠습니다.

1. 데이터 준비

먼저 설명에 사용할 샘플 데이터를 생성하겠습니다.

# 샘플 데이터 생성

set.seed(555)
data <- data.frame(
  Outcome = seq(1,100,by=1),
  Variable = sample(c("Red","Green","Blue"), 100, replace = TRUE)
)

head(data)
##   Outcome Variable
## 1       1    Green
## 2       2     Blue
## 3       3     Blue
## 4       4    Green
## 5       5    Green
## 6       6      Red

대상 변수인 Variableas.factor()를 적용해 범주형 데이터로 변환하겠습니다.

# 범주형 데이터 변환

data$Variable <- as.factor(data$Variable)

str(data)
## 'data.frame':    100 obs. of  2 variables:
##  $ Outcome : num  1 2 3 4 5 6 7 8 9 10 ...
##  $ Variable: Factor w/ 3 levels "Blue","Green",..: 1 1 2 1 2 2 2 1 2 2 ...## 

2. One-Hot Encoding 예제

위에서 생성된 데이터를 이용하여 3개의 패키지 및 함수를 이용한 예제를 설명드리겠습니다. 사용법과 변환 결과를 확인하시어 자신에게 맞는 스타일을 이용하시면 됩니다.

Method 1: one_hot in mltools package

첫번째로 설명드릴 함수는 mltools 패키지의 one_hot() 함수입니다. one_hot() 함수는 데이터 내 범주형 데이터를 찾고 해당하는 변수를 새로운 컬럼으로 추가하여 출력해 줍니다. 참고로 해당 함수는 입력 데이터가 data.table 구조를 따라야 하기에 data.table::as.data.table() 함수를 이용하여 변환된 데이터로 적용하였습니다.

출력 결과를 보시면 기존 범주형 변수인 Variable이 사라지고 기존 변수명 Variable 뒤에 _범주명 이 붙은 새로운 변수들이 생기고 데이터는 0 또는 1로 채워진 것을 볼 수 있습니다.

library(mltools)
library(data.table)

newdata <- one_hot(as.data.table(data))

head(newdata)
##    Outcome Variable_Blue Variable_Green Variable_Red
## 1:       1             1              0            0
## 2:       2             1              0            0
## 3:       3             0              1            0
## 4:       4             1              0            0
## 5:       5             0              1            0
## 6:       6             0              1            0 

Method 2: dummyVars in caret package

두번째로 설명드릴 함수는 caret 패키지의 dummyVars() 함수입니다. caret패키지는 머신러닝에 자주 사용되는 패키지로 해당 패키지에서 제공하는 dummyVars() 함수는 개인적으로 활용도가 가장 높습니다.

출력 결과를 보시면 기존 범주형 변수인 Variable이 사라지고 기존 변수명 Variable 뒤에 .범주명 이 붙은 새로운 변수들이 생기고 데이터는 0 또는 1로 채워진 것을 볼 수 있습니다.

library(caret)

dummy <- dummyVars(" ~ .", data=data)
newdata <- data.frame(predict(dummy, newdata = data)) 

head(newdata)
##   Outcome Variable.Blue Variable.Green Variable.Red
## 1       1             1              0            0
## 2       2             1              0            0
## 3       3             0              1            0
## 4       4             1              0            0
## 5       5             0              1            0
## 6       6             0              1            0

Method 3: dcast in reshape2 package

세번째로 설명드릴 함수는 reshape2 패키지의 dcast() 함수입니다. reshape2패키지는 데이터 정제 및 변환에 유용한 패키키이며 해당 패키지에서 제공하는 dcast() 함수는 One-Hot Encoding 외에도 다양하게 활용되니 추가적인 공부를 해보시는걸 추천드립니다.

출력 결과를 보시면 기존 범주형 변수인 Variable이 사라지고 기존 범주명들이 새로운 변수로 생기고 데이터는 0 또는 1로 채워진 것을 볼 수 있습니다.

library(reshape2)

newdata <- dcast(data = data, Outcome ~ Variable, length)

head(newdata)
##   Outcome Blue Green Red
## 1       1    1     0   0
## 2       2    1     0   0
## 3       3    0     1   0
## 4       4    1     0   0
## 5       5    0     1   0
## 6       6    0     1   0

3. 정리

지금까지 범주형 데이터를 One-Hot 형태로 변환하는 패키지 및 함수들을 소개드렸습니다. 개인적으로는 caret 패키지를 자주 이용하고 있어 해당 패키지에서 제공하는 dummyVars() 함수를 주로 사용하고 있습니다. 각 함수의 사용법 및 출력 결과를 보시고 자신에게 맞는 함수를 선택하시면 될 것 같습니다.

추가로 위에서 소개드린 패키지 및 함수들은 One-Hot Encoding 외에도 활용도가 높은 패키지들이니, 해당 기능 외에 다른 기능들도 공부해보시면 좋을 것 같습니다.

4. 관련 링크

[1] One-hot encoding in R: three simple methods


banner-request-analysis