nada
정규화 및 표준화 원 핫 인코딩 One Hot and Dummy[with R] 본문
DataScientist_Skill/MachineLearning
정규화 및 표준화 원 핫 인코딩 One Hot and Dummy[with R]
ds-nada 2023. 4. 3. 00:251. 정규화 & 표준화
- 선형함수 정규화(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
- 수치형 예측변수는 '0'과 '1'의 값만 가짐
- 많은 머신 러닝 알고리즘들은 모든 예측 변수들이 수치형이어야함
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 |