IT/AI\ML

카테고리 변수를 다루는 네 가지 방법

개발자 두더지 2021. 6. 3. 00:26
728x90

 이번 포스팅에서는 기계 학습 모델을 사용할 때에 포인트가 되는 카테고리 변수의 수치화에 대해서 집중하고자 한다. 카테고리 변수는 신장이나 체중과 같이 수치로 표시할 수 있는 변수가 아닌, "좋아하는 색상"과 같이 구분의 척도에 관련된 변수를 의미한다. 또한 학교의 클래스와 같이 1반, 2반, .....과 같이 숫자 자체를 의미하지 않는 것도 카테고리변수가 된다.  

 기계 학습을 구현할 때 결정 나무 등은 카테고리 변수를 그대로 다루는 것이 가능하다. 그러나, 로지스틱 회귀나 뉴럴 네트워크에서는 그대로 사용하는 것이 불가능하기 때문에, 숫자형으로 변형해야할 필요가 있다. 또한, 결정 나무계의 기계 학습 모델에서도 수치로 변환하는 것이 정밀도 향상에 도움이 되는 경우가 많다.

 이번에는 대표적인 수치 변환 방법으로, One hot Encoding, Lable Encoding, Count Encoding, Target Encoding 네 가지 방법에 대해 살펴보고자 한다. 그리고 카테고리 변수를 다룰 때에 주의할 점에 대해서 다뤄볼 생각이다.

 

 

카테고리 변수를 다룰 때의 주의점


카테고리 변수를 다룰 때에 주의해야할 것은 굉장히 많다. 그 중의 하나로 카테고리의 "세밀함"에 대해 다뤄보고자한다. 예를 들어, 무언가를 예측할 때 사용하는 데이터로써, 소유하고 있는 차 개별의 이름이 있는 경우, 그대로 설명 변수로 사용하면 분류가 너무 세세하게 나눠져 있어서 잘 학습되지 않거나, 업무에서 기계 학습 모델을 몇 번이고 운영하고자할 때 새로 발매된 차량의 이름에 대응하지 못하는 등의 문제가 발생한다.

 이러할 때에, 예를 들어 단순히 차량 이름이 아닌 배기량을 카테고리 변수로 한다면 카테고리의 세밀함도 적당해져 목적 변수와의 관계도 알아보기 쉽게 된다. 어디까지나 케이스 바이 케이스이므로, 데이터를 찬찬히 살펴보면서 가설 검증을 반복해, 분석 결과에 따라 계속해서 능숙하게 가공하는 노력이 필요하다.

 

 

카테고리 변수의 수치화 방법(1) : One hot Encoding


 카텍도리 변수를 수치화하는 간단한 방법으로 One hot Encoding이라고 불리는 방법이 있다. 더미 변수화라고도 부르며, 단순히 그 카테고리에 해당하는가 아닌가를 0, 1 플래그로 작성하는 방법이다. 예를 들어 좋아하는 색의 선택지로 흰색, 빨간색, 파란색, 검은색이있다고 하자.

 이 때에 새로운 변수로써 "좋아하는 색이 흰색인 플래그', "좋아하는 색이 빨간색인 플래그", "좋아하는 색이 파란색인 플래그"를 작성하여, 해당하면 1, 그렇지 않으면 0을 넣는다. 좋아하는 색이 검은색인 경우에 대해서는 "좋아하는 색이 흰색인 플래그", "좋아하는 색이 빨간색인 플래그", "좋아흐는 색이 파란색인 플래그"가 전부 0인 경우로 표현할 수 있다. 이 방법에서는 변수가 카테고리의 수보다 1개 적은 개수로 나눠지므로 가로가 길고, 대부분 0인 데이터가 된다는 단점이 있다.

 

 

카테고리 변수의 수치화 방법(2): Label Encoding


 카테고리 변수를 수치화하는 다른 하나의 간단한 방법으로는 Label Encoding이 있다. 이것은 One hot Encoding과 달리 새롭게 작성된 변수는 1개로 정리할 수 있다. 구현 방법은 단순히 각 카테고리에 대응하는 숫자를 Label로 할당하는 것이다. 

 예를 들어 좋아하는 색에 따라 흰색은 1, 빨간색은 2, 파란색은 3, ....과 같이 ID와 같이 수치화하는 것이다. 이 방법으로는 수치의 크고 작음은 의미가 없으므로, 결정 나무의 분기나 로지스틱 회귀, 다중 회귀에서는 좋은 결과를 얻기 힘들다는 단점이 있다.

 

 

카테고리 변수의 수치화 방법(3) : Count Encoding


 카테고리 변수를 수치화하는 세 번째 방법으로는 Count Encoding이라는 방법이 있다. 이것은 각 카테고리의 데이터의 등장 횟수를 그 카테고리의 수치 부분에 할당하는 방법이다. 

 예를 들어, 좋아하는 색의 예로 계속 설명하자면, 데이터 전체에서 흰색이 좋아하는 색이라고 응답한 횟수가 356건, 빨간색을 좋아한다고 한 건이 2567건, 파란색은 1234건, 검은색이 17건이라고 한다고 한다면, 그대로 흰색에는 356, 빨간색에 2567, 파란색에 1234, 검은색은 17이라고 수치로 변환하는 것이다. 이 방법에서는 Label Encoding과 달리, 수치에 의미가 있으므로, 목적 변수와의 관계를 알아보기 쉬운 경우가 있다는 장점이 있다. Label Encoding과 비교해서 결정 나무의 분기나 로지스틱 회귀, 다중 회귀에서 좋은 결과를 얻을 수 있다.

 그러나, 어디까지나 데이터상에 등장 횟수일뿐이므로 목적 변수와의 관계를 확실히 알기는 그리 쉽지 않다.

 

 

카테고리 변수의 수치화 방법(4): Target Encoding


 카테고리 변수를 수치화하는 방법으로 마지막에 소개할 것은 Target Encoding이라고 불리는 방법이다. 이것은 지금까지 봤던 수치화 방법과 달리, 목적 변수의 정보를 제대로 사용하는 방법이다. 그러나 목적변수의 정보를 설명 변수에서 사용하므로, 뒤에서 설명할 leak에 주의할 필요가 있다. Target Encoding은 카테고리마다 목적 변수의 평균을 할당한다.

 예를 들어, 목적변수로는 어떤 판매 사이트의 1개월의 총 구매 금액으로 하고, (유저 회원가입시에 설정하도록 하는 방법)좋아하는 색상의 예를 계속해서 사용하다면, 흰색을 좋아하는 사람의 평균 구입 금액이 163만4424원, 빨간색을 좋아하는 사람의 평균 구입 금액은 234만4487원, 파란색을 좋아하는 사람의 평균 구입 금액은 763만 5424원, 검은색을 좋아하는 사람의 평균 구입 금액이 102만 3764원인 경우 그 금액을 각 해당 항목에 기재하는 것이다.

 여기서는 지금까지와의 방법과 달리 수치가 높을 수록 목적 변수도 높아지고, 수치가 낮으면 목적 변수도 낮아지는 경향이 있다는 것을 알 수 있다. 따라서 위의 세 가지 방법과 비교하여 결정 나무의 분기나 로지스틱 회귀, 다중 회귀에서도 좋을 결과를 내기 쉽다.

 앞서 말했듯, 이 방법은 leak에 대해 주의해야한다. leak란 상정하지 않았던 방법에 의해 목적 변수 또는 그것에 가까운 설명 변수에서 누락이 발생한 상태 그대로 기계 학습 모델이 학습하는 것을 의미한다. leak가 있으면, 실제의 운영시에 상정했던 것보다 정밀도가 낮은 기계 학습 모델이 생성되게 된다.

Target Encoding에서는 목적 변수의 정보를 "목적 변수의 평균"으로써 설명변수에 통합된다. 이로 인해 leak가 발생하기 쉬어져, 정밀도가 과도하게 높게 나오게 된다. 이러한 문제를 피하기 위해서는 Cross Validation방법을 응용하여 leak가 생기지 않도록 Target Encoding할 필요가 있다. 


참고자료

https://thefinance.jp/datascience/201109-2

728x90

'IT > AI\ML' 카테고리의 다른 글

[python/Tensorflow2.x] TFRecord의 사용법  (0) 2021.07.08
[python/openCV] openCV로 이미지 여백 삭제 (1)  (0) 2021.07.06
설명 변수와 목적 변수  (0) 2021.05.18
ipywidgets 사용법 (2)  (2) 2021.04.07
ipywidgets 사용법 (1)  (0) 2021.04.06