Categorical Data For Machine Learning
기계 학습이나 데이터 분석을 하다 보면 단순 수치형 데이터가 아닌 문자형 데이터인 범주형 데이터를 많이 만나게 된다. 이러한 데이터들은 일반적인 숫자형 데이터들과 다르게 이를 바로 기계가 인식할 수는 없으므로 기계가 인식할 수 있는 형태로 바꾸어 보아야 한다.
예를 들어 웹로그를 기계를 이용하여 분석을 해보고자 한다. 이럴때 Key를 Unique IP로 잡는다고 한다면 하나의 IP에서 접속한 횟수, User-Agent, 레퍼러, 접속 스트링 등으로 분류 될수 있을 것이다. 여기서 접속한 횟수의 경우 숫치형 데이터이므로 기계는 이를 인식 할수 있고 분류가 가능하다. 즉 접속 횟수가 단지 100번 이상인 IP들을 보고 싶다거나 할 경우 이를 정확하게 산출 할수 있을 것이다.
하지만 User-Agent와 레퍼러, 접속 스트링은 어떠한가 ? 이를 기계가 인식할 수 있을까 ? 기계가 이를 분류하거나 인식하기 위해서는 이를 수치형 데이터로 변경해 주어야 할것이다.
이를 해결 할 수 있는 방법으로 One-Hot Encoding을 사용할 수 있다.
One-Hot Encoding은 One-Out-of-N Encoding이라고도 하고 가변수라고도 이야기 하며 범주형 변수를 이진 벡터로 표시 한다. 즉 모든 범주형 변수를 정수인 1과 0의 이진형 벡터로 표시하며 범주형 변수를 열거하여 해당하지 않는 모든 항목은 0으로 해당하는 항목은 1로 표시하는 것이다.
위의 표에서 User-Agent를 One-Hot Encoding으로 변경하면 아래와 같이 변경할 수 있습니다.
간단하게 모든 IP에 대해서 User-Agent들이 0과 1으로만 표기된것을 볼수 있다.
그렇다면 Python의 Scikit-Learn 라이브러리를 이용하여 직접 이를 적용해서 Encoding 해 보도록 하겠다. 아래의 예제는 위의 4가지 User-Agent를 넣고 이를 변경해 본 것이다. 우선 입력된 데이터에 대해서 이를 정수 형식으로 변경하여서 이를 이진 형태로 나타낼수 있도록 변경하게 했다.
위의 코드의 결과는 아래와 같다.
결론
위와 같이 범주형 데이터를 기계가 인식 하기 위해서 One-Hot Encoding을 사용할 수 있고 이를 사용하기 위해서는 먼저 범주형 데이터에 어느정도의 범주로 나누어 지는지를 알아 보는것이 좋다. 가령 예를 들어 위의 User-Agent를 범주화 시킨다면 전체 웹 로그에서 어느정도의 User-Agent를 가지는지를 먼저 살펴 보아야 한다. 아마도 소량의 웹로그에 적은 양의 접속 로그만을 가지고 있다면 범주는 100개 수준으로 충분할 것이다. 하지만 다량의 웹 로그에 다수의 User-Agent가 접속했다면 어떠한가, 예를 들어 Mozilla/5.0 이 있다면 각각의 버전별로 다 나누어 질것이고 뒷부분에 OS 유형으로 모두 나누어 진다면 심하게는 수천개에 달할 수도 있다. User-Agent가 아니라 접속 스트링이나 레퍼러는 또한 어떠할까 ?
수많은 레퍼러를 통해서 접속이 가능한 웹페이지일 경우 그 숫자는 10만, 100만에 달할 것이다. 이를 One-Hot Encoding으로 변경한다면 100만개의 차원이 만들어 질것이다. 거기에 IP가 10만개라면 계산이 거의 힘든 수준이라고 생각된다. 이럴 경우에는 One-Hot Encoding을 사용한다기 보다는 구글에서 발표한 Word2Vec을 사용하는것을 고려해 보아야 할 것이다. 범주가 작은 경우라면 당연히 One-Hot Encoding을 사용하는것이 더 빠르게 적용이 가능할 것이다.
이제 다음장에서는 이를 이용하여 실제로 기계 학습에 적용하는 방법을 알아 보도록 하고 One-Hot Encoding으로 표현이 불가능한 수준의 범주형 데이터를 Word2Vec와 Doc2Vec를 사용하여 적용해 보도록 하겠다.
참고자료
https://machinelearningmastery.com/how-to-one-hot-encode-sequence-data-in-python/
참고 도서
http://www.hanbit.co.kr/store/books/look.php?p_code=B6119391002