One Hot Encoding 과 Label Encoding 을 비교해보자

2020. 9. 3. 23:11Data Science

One-Hot Encoding이란 무엇인가.

 

언제 우리는 Label Encoding 대신 One-Hot Encoding을 써야하는가?

 

데이터 과학에 일반적인 인터뷰 질문이며, 데이터 과학자는 반드시 알아야 하는 내용이다.

 

결론적으로 당신은 이 두가지중에 하나를 데이터 과제에 써야하는 선택의 기로에 서게 될 것이기 때문이다.

 

머신은 숫자를 이해하지 텍스트를 이해하진 못한다.

 

우리는 텍스트로 이루어진 개별 Category를 머신이 알아먹고 수학적인 식을 통해서 연산 할수 있도록 변환

 

해줘야 하는 것 이라고 이해하면 빠르겠다.

 

그렇다면 어떻게 이걸 할수 있고, 방법은 어떻게 다른지 보도록 하자!!~

 


 

Label Encoding과 One-Hot Encoding이 그림속에 있는 걸 알수 있다. 

 

이번 포스트에서는 이 두가지에 대해서 알아보고 이해하고 맛보고 다른점도 챙겨 보자~

 


목 차

  1. Categorical Encoding이란 무엇인가??
  2. Categorical Encoding의 두가지 방법.
    1. Label Encoding
    2. One-Hot Encoding
  3.  그럼 어떻게 선택해 ?? Label Encoding vs. One-Hot Encoding?

 


 

 

Categorical Encoding은 대체 머냐

일반적으로 카테고리 값 뿐만 아니라 숫자의 조합과 같은 여러 컬럼을 포함한 형태의

 

데이터셋이라고 할수 있다.

 

기계는 그냥 숫자만 이해한다. 서두에서 말한 것과 같이 텍스트는 이해하지 못한다.

 

그래서 이 작업은 필수라고 할 수 있겠다.

이게 우리가 categorical (text) 데이터를 numerical 데이트로(숫자 정보)로 바꿔야 하는

 

주된 이유가 된다.

 

즉, 머신러닝 알고리즘이 데이터를 이해하기 위해서, 그래서 이 처리 과정을

 

categorical encoding이라 부른다.

 

Categorical encoding 쉽고 간단히 이야기 해서 카테고리를 숫자로 바꿔주는 작업.

 

 

그럼 다음에는 그럼 방법론으로는 어떤게 있는지 알아보자.

 

 

Categorical Encoding의 두가지 방법

 

그럼 어떻게 하면되는데??

 

대승적으로 아래 두가지 방법이 대 분류라고 보면 되겠다.

 

  • Label Encoding
  • One-Hot Encoding

 

상세하게 보자. 

 

 

Label Encoding

 

Label Encoding 이란 알파벳 오더순으로 숫자를 할당해주는 것을 말한다.

 

 

글자니까 당연히 알파벳순으로 정렬이 가능 할 것이고... 그 정렬된 기준으로 번호를 매긴다는 뜻.

 

각설하고 위에 Country 열의 정보를 숫자로 바꾸면 다음과 같아진다. (알파벳 순)

하지만 적용이 쉽지만은 않은 Label Encoding.

 

위 시나리오에서 Country라는 데이터는 순서나 랭크가 없다. 그러나 Label Encoding을

 

수행하면 결국엔 알파벳 순으로 랭크가 되는 것이고, 그로 인해서 랭크된 숫자정보가

 

모델에 잘못 반영될수가 있겠다. 

 

당연히 이건 우리가 바라는게 아니다. !!

 

그래서 머가 있냐면...

 

One-Hot Encoding

요놈이다. 쉽게 이야기해서 목록화해서 개별로 그 목록값에 대한 이진값으로 만드는 방법이다. 

 

구두로는 어렵다 예시로 보자.

 

One-Hot Encoding은 더미변수를 만든 것을 처리하는 방법이다.

 

아래와 같다. 인디아가 100, 일본이 001, 미국이 002 이런 느낌.. 이런 간지.

 

0

위 예시에서 보는 것과 같이 3개의 새로운 feature가 추가되었다. 

 

 

One-Hot Encoding은 적용에 문제가 없을까 ?? : Dummy Variable Trap

Dummy Variable Trap은 One-Hot Encoding한 변수 하나의 결과가 다른 변수의 도움으로 쉽게

 

예측되어 질수 있다는 것이다.  

 

Dummy Variable Trap 변수들이 각각 다른 변수들과 상관성이 있다는 것.

 

The Dummy Variable Trap은 multicollinearity. 라는 문제를 야기 시킨다.

 

Multicollinearity 는 독립적인 Feature간에 의존성이 있을때 발생한다.

 

(Multicollinearity은 선형 회귀나, 로지스틱 회귀에서 심각한 이슈가 됨.)

 

이걸 극복하기 위해서는 dummy variables 중 하나를 버려야 된다. 

 

Onehot Encoding후 이 문제를 해결하는 예시를 하나 같이 검토해보자. 

 

일반적으로 multicollinearity를 체크하는 방법중 하나는 Variance Inflation Factor를

 

활용하는 것이다.

 

  • VIF=1, Very Less Multicollinearity
  • VIF<5, Moderate Multicollinearity
  • VIF>5, Extreme Multicollinearity (이건 피하자.)

 

계산하는 코드도 간단히 발췌했다.

 

# Function to calculate VIF
def calculate_vif(data):
vif_df = pd.DataFrame(columns = ['Var', 'Vif'])
x_var_names = data.columns
for i in range(0, x_var_names.shape[0]):
y = data[x_var_names[i]]
x = data[x_var_names.drop([x_var_names[i]])]
r_squared = sm.OLS(y,x).fit().rsquared
vif = round(1/(1-r_squared),2)
vif_df.loc[i] = [x_var_names[i], vif]
return vif_df.sort_values(by = 'Vif', axis = 0, ascending=False, inplace=False)

X=df.drop(['Salary'],axis=1)
calculate_vif(X)

 

 

위에서 보면 VIF가 5보다 큰데 이게 multicollinearity Issue가 발생한 걸로 생각하면 되겠다. 

 

하나의 더미 변수를 갖다 버리면 해결 된다.

 

해보자.

 

df = df.drop(df.columns[[0]], axis=1)
calculate_vif(df)

VIF가 줄었네. 해결 완료다. 이제 모델을 만들 준비가 완료되었다라고 표현해도 되겠다.

 

이제 이 둘러보는건 얼쭈 되었고, Label Encoding과 One Hot Encoding을 어떻게 선택해서 써야할까?

 

결론을 내보자. 

 

 

그럼 어떻게 선택해 ?? Label Encoding vs. One-Hot Encoding?

사실 원론적으로 어떤 데이터셋을 쓸것인가.. 그리고 어떤 모델 기법을 적용하고 싶은가에 달렸지만,

 

몇가지 선택에 기준이 있다. 

 

One-Hot Encoding은 언제?

 

  1. 순서가 없을 때 (예, 국가명 )
  2. 그리고 고유값의 개수가 많지 않으면 효율적

 

Label Encoding은 언제?

 

  1. 순서의 의미가 있을때 (유치원, 초등학교, 대학교 같은 등급, 사원, 대리, 과장, 부장 같은 직급?? )
  2.  고유값의 개수가 많은데 One-hot Encoding은 당연히 메모리 소비가 많으므로 효율적이진 못하다.