이번 포스팅에서는 Categorical variables 즉, 범주형 변수들을 인코딩하는 여러가지 방법에 대해서 알아보려고 한다. 해당 내용은 포스팅 하단의 래퍼런스를 통해 학습했고 해당 래퍼런스에서 다루지 않는 다른 인코딩 방식이 존재한다면 댓글로 달아주시면 너무 감사할 것 같다.

범주형 자료에는 순서가 없는 명목형(nominal) 자료와 순서가 있는 순서형(ordinal) 자료로 나뉜다. 명목형 자료의 대표적인 사례로는 혈액형, 지역, 직업, 학교 등을 들 수 있다. 반면에 순서형 자료의 예시로는 생활수준, 만족도를 대표적으로 들 수 있겠다.

이러한 범주형 값들이 들어있는 데이터를 머신러닝, 딥러닝 모델의 input 데이터로 집어넣으려고 할 때 문자열 상태 그대로 모델에 넣을 수가 없다. 이러한 값들을 수치적인 값으로 인코딩을 해주어야 하는데 이 인코딩 하는 방법에는 여러가지가 있어 이에 대해 공부해보는 시간을 가졌다.

필자가 공부하기 이전에는 대표적인 one-hot encoding이나 label-encoding 같은 방법들만을 알고 있었다. 하지만 이번 기회를 통해 기존 방법 이외의 다른 여러가지 인코딩 방법들이 존재하고 인코딩 방법들도 상황에 따라 다르게 적용할 수 있다는 것을 알게 되었다.

이제 본격적으로 범주형 변수를 인코딩하는 방법들에 대해 알아보자.

https://blog.kakaocdn.net/dn/cltoRh/btqFONmp7Z7/7RzHP64o85mky7GJjnPra1/img.png

https://medium.com/analytics-vidhya/types-of-categorical-data-encoding-schemes-a5bbeb4ba02b

1. One-hot encoding

원-핫 인코딩은 각 범주형 변수의 값들을 1과 0으로 매핑시키는 것이다. 아래 그림을 보면 직관적으로 원-핫 인코딩이 어떻게 이루어지는 알 수 있을 것이다.

https://blog.kakaocdn.net/dn/THWZO/btqFNDZmTQB/G61ewlppdu4e8K5W4f0Gok/img.png

https://www.kaggle.com/dansbecker/using-categorical-data-with-one-hot-encoding

위 그림처럼 Categorical value인 Color의 값 종류가 3개 일 때, 원-핫 인코딩으로 변환하게 되면 특정 color값에 해당하는 값을 1로 하고 나머지는 0값으로 매핑시켜서 color 값 종류의 개수만큼 추가적인 변수(column)들을 만들어 낸다. 하지만 원-핫 인코딩은 범주형 변수 값들의 종류가 많아진다면 그 만큼 추가적으로 생기는 변수들이 많아지면서 모델링의 학습속도가 매우 느려진다. Python의 pandas에서는 get_dummies 함수로, scikit-learn에서는 one-hot encoding 함수를 개별적으로 각각 제공하고 있다.

원-핫 인코딩은 분류(Classification)와 회귀(Regression)문제 둘 다에도 자주 사용된다. 하지만 각 문제 종류에 따라 원핫-인코딩을 사용 시 차이점이 존재한다. 먼저 분류문제에서는 n개의 카테고리 값이 존재할 때 n개 카테고리 모두 인코딩을 해준다. 반면에 회귀문제에서는 n-1개의 카테고리값들을 인코딩해준다. 왜냐하면 자유도(degree of freedom)를 반영해주기 위함 때문이다. 선형 회귀(Linear regression)식은 학습되는 동안 모든 변수에 접근을 하게 된다. 이는 모든 정보를 선형회귀 모델에 전달한다는 것을 의미한다. 따라서 학습시간동안 모든 변수들(feature)을 동시에 접근을 하게되는 학습 알고리즘에 사용된다. 보통 SVM(Support vector machine)이나 ANN(Artificial neural network), 그리고 Clustering 알고리즘에 주로 사용이 된다.

2. Label-encoding

레이블 인코딩은 범주형 변수의 n개 종류의 값들을 1에서 n값으로 숫자를 부여한다. 이렇게 부여하게 된 숫자들 사이에서는 관계가 존재한다. 따라서 범주형 자료 중에서도 순서형 자료에 적합할 것이다. Python의 pandas에서는 factorize 함수를, scikit-learn 에서는 LabelEncoder 함수를 제공하면서 레이블 인코딩을 적용시킬 수 있다.

https://blog.kakaocdn.net/dn/bU4owq/btqFOhBiTig/QoJScp2oIAdxzNzjcRMcEk/img.png

https://towardsdatascience.com/know-about-categorical-encoding-even-new-ones-c266227b9cbd

3. Ordinal-encoding

순서형 자료에 매우 적합한 인코딩 방식이다. 레이블 인코딩과 비슷할 수 있지만 레이블 인코딩은 인코딩을 하기 위해 들어오는 범주형 자료값들이 순서형 자료인지 아닌지 고려하지 않고 단순히 연속적인 숫자를 부여한다. 하지만 Ordinal 인코딩은 해당사항을 고려하게 된다.

그리고 데이터의 범주형 변수중 순서뿐만 아니라 알파벳 순서까지도 고려할 수 있다. Pandas를 사용하여 인코딩을 해줄 수 있긴 하지만 사용자가 주어진 범주형 변수를 보고 직접 변수 값들 간의 순서(order)를 dictionary 형태로 정의해주어야 한다. 그래서 직관적이긴 하지만 추가적인 코딩을 해야하는 수고가 필요하다.