nada

정규화 및 표준화 원 핫 인코딩 One Hot and Dummy[with R] 본문

DataScientist_Skill/MachineLearning

정규화 및 표준화 원 핫 인코딩 One Hot and Dummy[with R]

ds-nada 2023. 4. 3. 00:25

1. 정규화 & 표준화

  • 선형함수 정규화(Min-Max Scaling)
    • $X_{nrom} = {X-X_{min} \over X_{max}-X_{min}}$
    • 데이터에 대해 선형 변환 후 [0,1]범위로 변환
  • 표준 정규화(Z-score Normalization)
    • $Z = {{X - \mu} \over \sigma}$
    • 평균 = 0, 표준편차 = 1
    • 경사하강법을 사용하여 해를 구하는 모형들은 일반적으로 정규화가 필요
      • 선형 회귀, 로지스틱 회귀, 서포트 벡터 머신, 신경망 등
    • 의사 결정 트리 계열은 정규화가 필요 없음
      • 트리를 분할할 때 기준이 되는 것은 정보 이득비
      • 정규화는 피처에 대한 정보 이득을 바꿀 수 없다.

2. 범주형 피처

  • 범주형 피처
    • 많은 머신 러닝 알고리즘들은 모든 예측 변수들이 수치형이어야함
      • 범주형 예측변수를 수치형으로 변환하는 과정이 필요
    • 일부 R 패키지(h20, caret)에서는 자동적으로 변환되지만 그렇지 않은 패키지(glmnet, keras)도 있음
    • 범주형 예측 변수를 수칙형으로 변환하는 방법
      • 수치형 예측변수는 '0'과 '1'의 값만 가짐
        • One-Hot Encoding
        • Dummy Encoding
      • 수치형 예측변수는 '0', '1', '2', ... 범주 개수만큼 정수 값을 가짐
        • Label Encoding
        • Ordinal Encoding

2-1. 원-핫 인코딩(One-Hot Encoding)

  • 범주형 예측변수의 범주 개수만큼 수치형 예측변수를 생성
  • 해당 범주에 속하면 '1', 아니면 '0'값을 가짐
  • 'Less than full rank encoding'으로 불림

2-1-1. One-Hot Encoding_1

# install.packages('pacman')
# install.packages('caret')

pacman::p_load('caret')

data <- data.frame(id = c(1:4),
              color = as.factor(c('red','green','blue','red')))

str(data)
'data.frame':    4 obs. of  2 variables:
 $ id   : int  1 2 3 4
 $ color: Factor w/ 3 levels "blue","green",..: 3 2 1 3
# dummyVars(formula, data, fullRank)
one_hot1 <- dummyVars(~., data = data, fullRank = FALSE)

## Apply for 'newdata'(data), using the 'one_hot1'
data.one_hot1 <- predict(one_hot1, newdata = data)

str(data.frame(data.one_hot1))
'data.frame':    4 obs. of  4 variables:
 $ id         : num  1 2 3 4
 $ color.blue : num  0 0 1 0
 $ color.green: num  0 1 0 0
 $ color.red  : num  1 0 0 1
data <- data.frame(id = c(1:4),
                   color = as.factor(c('red','green','blue','red')))

str(data)
'data.frame':    4 obs. of  2 variables:
 $ id   : int  1 2 3 4
 $ color: Factor w/ 3 levels "blue","green",..: 3 2 1 3

2-1-2. One-Hot Encoding_2

pacman::p_load('recipes')

# Difine Preprocessing
one_hot2 <- recipe(~., data = data) %>%     # recipe(formula, data)
  step_dummy(all_nominal(), one_hot = TRUE) # all.nominal() : Select Charater and Factor Variables in data

# Calculate for 'training'(data) using the above-defined preprocessing process('one-hot2')
prep.one_hot <- prep(one_hot2, training = data)

# Apply the computation (prep.one_hot) to 'new_data'(data)
data.one_hot2 <- bake(prep.one_hot, new_data = data, composition = 'data.frame') # composition : format
glimpse(data.one_hot2)
Rows: 4
Columns: 4
$ id          <int> 1, 2, 3, 4
$ color_blue  <dbl> 0, 0, 1, 0
$ color_green <dbl> 0, 1, 0, 0
$ color_red   <dbl> 1, 0, 0, 1

2-1-3. One-Hot Encoding 단점

  • 범주형 예측변수가 범주 개수만큼 예측 변수를 생성하기 때문에 큰 차원을 요구
  • 범주형 예측변수로부터 생성된 수치형 예측변수들은 선형 관계를 가짐 -> 연관성이 높음

  • 범주형 예측변수의 '범주 개수 - 1'개 수치형 예측변수를 생성
    • ex) 'color'변수에 'red', 'green', 'blue', 범주가 있다면, 2개의 수치형 예측변수를 생성
  • 해당 범주에 속하면 '1', 아니면 '0'값을 가짐
  • 'Full-rank encoding'으로 불림

### Dumy Encoding
data <- data.frame(id = c(1:4),
                   color = as.factor(c('red','green','blue','red')))
str(data)
'data.frame':    4 obs. of  2 variables:
 $ id   : int  1 2 3 4
 $ color: Factor w/ 3 levels "blue","green",..: 3 2 1 3
# In Package 'caret'
pacman::p_load('caret')

# dummyVars(formula, data, fullRank)
dummy1 <- dummyVars(~., data = data, fullRank = TRUE)

# Apply for 'newdata'(data), using the 'dummy1'
data.dummy1 <- predict(dummy1, newdata = data)

str(data.frame(data.dummy1))
'data.frame':    4 obs. of  3 variables:
 $ id         : num  1 2 3 4
 $ color.green: num  0 1 0 0
 $ color.red  : num  1 0 0 1

2-2. Dummy

#### step_dummy
data <- data.frame(id = c(1:4),
                   color = as.factor(c('red','green','blue','red')))
str(data)
'data.frame':    4 obs. of  2 variables:
 $ id   : int  1 2 3 4
 $ color: Factor w/ 3 levels "blue","green",..: 3 2 1 3
### In Package 'recipes'
pacman::p_load('recipes')

# Dfine Preprocessing
dummy2 <- recipe(~., data = data) %>% # recipe(formula, data)
  step_dummy(all_nominal())           # all.nominal() : Select Charater and Factor Variables om data

# Calculate for 'trainig' (data), using the above-defined preprocessing process('dummy2')
prep.dummy <- prep(dummy2, training = data)

# Apply the computations (prep.dummy) to 'new_data'(data)
data.dummy2 <- bake(prep.dummy, new_data = data, composition = 'data.frame') # composition : format
glimpse(data.dummy2)
Rows: 4
Columns: 3
$ id          <int> 1, 2, 3, 4
$ color_green <dbl> 0, 1, 0, 0
$ color_red   <dbl> 1, 0, 0, 1

2-3. 원-핫 인코딩 vs 더미 인코딩

'DataScientist_Skill > MachineLearning' 카테고리의 다른 글

Scikit-Learn  (1) 2023.05.28
MachineLearning  (0) 2023.04.02