관리 메뉴

TEAM EDA

[Machine Learning Advanced] 2강. 머신러닝 강의 - 데이터 전처리 (변수의 인코딩, 임베딩 방법) 본문

EDA Study/Machine Learning Advanced

[Machine Learning Advanced] 2강. 머신러닝 강의 - 데이터 전처리 (변수의 인코딩, 임베딩 방법)

김현우 2023. 8. 7. 13:30

 

이전의 강의까지 해서 변수란 무엇인지, 변수에 결측치나 이상치가 있는 경우 어떻게 처리하는지, 연속형 변수의 값을 어떻게 변환하는지에 대해 살펴봤습니다. 이번 강의에서는 범주형 변수와 그 외 변수의 인코딩, 임베딩 방법에 대해 알아보도록 하겠습니다. 

 

범주형 변수는 무엇이며 왜 처리해야하는 것일까요? 

정형 데이터에서 범주형 변수를 처리하는 방법은 되게 까다롭습니다. 범주형 변수란 일종의 카테고리를 가지는 변수를 의미합니다. 예를들어 식물의 종도 일종의 카테고리가 되고 음식점의 종류 등 어떠한 집단을 의미하는 변수들을 의미합니다. 이러한 변수들은 컴퓨터가 인식할 수 없기에 인식할 수 있도록 해주는 작업이 필요합니다. 대표적으로 많이 알려진 방법으로는 One-Hot Encoding, Label Encoding, Frequency Encoding, Target Encoding 등이 있습니다.

 

One-Hot Encoding (OHE)

먼저 원-핫 인코딩에 대해 살펴보겠습니다. OHE는 일종의 변수를 1과 0으로 나누는 방법입니다. 해당 값이 존재하는 경우를 1로 그렇지 않은 경우를 0으로 표현하는 것입니다. 예를 한번 들어보겠습니다. 범주형 변수는 애완동물의 종이고 사람은 아래와 같이 5명이 있는 상황입니다. 

왼쪽과 같이 애완 동물의 종이라는 범주형 변수를 컴퓨터는 인식할 수 없습니다. 그렇기에 이를 숫자 형태로 바꿔서 컴퓨터가 인식 시켜줘야하는데, OHE 방법은 새로운 컬럼을 추가해서 해당 값이 있으면 1 그렇지 않으면 0을 부여하는 방식입니다. 위의 예시에서는 개가 개의 컬럼에 1, 고양이가 있으면 고양이의 컬럼에 1을 넣어주는 것입니다. (만일, 없다면 0을 넣어주면 됩니다) 

 

이와 같은 OHE의 장점은 컴퓨터가 변수의 의미를 "정확"하게 파악한다는 점입니다. 단순하게 변수가 "존재한다" vs "존재하지 않는다"의 의미를 가지니 원래 의미 그대로 컴퓨터에게 전달할 수 있는 장점이 있습니다. 이렇게 당연한 의미가 장점이 되는 이유는 컴퓨터에게 위와 같이 정확하게 전달하기 어렵기 때문입니다. 애완동물의 종이 2개인 경우에는 OHE을 수행하면 변수가 2개밖에 생성되지 않습니다. 하지만 종이 100개, 1000개, 10000개가 넘어면 생성되는 변수만 수백, 수만이 되게 되고 엄청나게 Sparse한 행렬이 만들어지게 될 것입니다. 이렇게되면 메모리의 측면에서 좋지 않고 모델도 돌기 쉽지 않을 것입니다. 

 

Label Encoding 

그래서 차선으로 나온 생각이 컬럼의 수는 1개로 유지하되 각각의 종이 다른 값을 가지고 있다라는 의미를 부여해보면 어떨까? 입니다. 즉, 개는 0번 고양이는 1번, 새는 2번, 거북이는 3번, ...., 무당벌레는 1000만번 이런 식으로 종마다 다른 번호를 부여해주면 하나의 컬럼으로도 모든 종을 표현할 수 있게 됩니다. 

 

이러한 방법은 각각의 값에 숫자를 부여해준다고 해서 Label Encoding 이라고 부릅니다. 하지만, 이러한 라벨인코딩의 단점은 모델이 이 숫자의 순서를 특징으로 인식할 수도 있다는 것입니다. 개와 고양이의 경우를 다시 보겠습니다. Tree 모델의 경우 모델을 Split할때 어떤 수치를 기준으로 왼쪽과 오른쪽으로 나누게 될 것입니다. 하지만, 이러한 수치는 단순 종을 분류한건데 1000만번 종의 왼쪽에 속하는 값은 ~~한 특징을 가지고 1000만번 종의 오른쪽에 속하는 값은 ~~한 특징을 가집니다. (혹은 회귀모델에서 w * x 에서 x의 크기에 따라 w가 의미를 가지는 형태) 물론 트리가 복잡해지면 복잡해질 수록 위와 같은 해석이 옳도록 트리가 깊어지고 가지가 분할될 것이긴 합니다. 하지만, 이렇게 되면 과적합 등의 문제가 생기는 이슈 또한 같이 발생할 것입니다. 또한, 학습셋에서 보지 못했던 거위라는 종이 미래에 나타나게 되어도 제대로된 예측을 하지 못하게 될 것입니다. (OHE에서는 모든 값에 0을 부여하는 식의 대처는 가능하지만, 학습에서는 보지 못한 형태일 것입니다.) 그리고 id 5번의 경우에 처럼 고양이와 개를 모두 키우는 경우에 대해서도 표현하기가 애매해집니다. 하지만, 이러한 라벨 인코딩에도 뚜렷한 장점이 있는데 첫째, 컬럼의 수가 1개로 줄어서 메모리의 관점에서 매우 효율적입니다. 둘째, 변수가 순서를 가지는 경우, 예를 들어서 수능 1등급 집단, 2등급 집단, 3등급 집단 ... 혹은 10대, 20대, ... , 90대와 같이 순서 자체가 진짜 의미가 있는 경우에는 라벨 인코딩이 효과적일 수 있습니다. 

Frequency Encoding 

이러한 라벨인코딩의 단점을 극복하고자 사람들은 이러한 생각을 합니다. 컬럼의 수를 1개로 유지하는 것은 좋지만 다른 값을 가지고 있다가 아니라 새로운 의미를 부여해보면 어떨까? 라는 생각에서 출발해서 "새로운 의미"를 다르게 한 방식이 Frequency Encoding과 Target Encoding 입니다. 여기서 Frequency Encoding은 해당 값이 "몇 번 등장했는지" , Target Encoding은 해당 값의 "Target의 Ratio가 얼마나 되는지"를 의미합니다. 한번 위의 예시를 조금 더 바꿔서 아래와 같이 해당 Id가 하루에 얼마나 많은 사료비를 쓰는지에 대한 Target을 만들어보겠습니다. 편의상 5번의 Id는 제외하고 새로운 id 5를 만들어서 문제를 풀겠습니다. 하나의 컬럼으로 표현하는 모든 인코딩 방법은 저러한 멀티 라벨의 경우 표현하기 어려움을 가지는게 동일하기 때문입니다. 

 

 

먼저 Frequency Encoding의 경우 각각의 종이 몇번이나 등장했는지로 인코딩을 하게됩니다. 위의 예시에서 개는 총 3번, 고양이, 거위는 총 1번이 등장하므로 위의 식은 아래와 같이 표현이 가능합니다. 이런 방식의 장점은 Label Encoding의 장점인 1개의 컬럼을 보유한 채로 인코딩이 가능하며, 등장 횟수라는 의미를 변수에 부여할 수 있습니다. 추가적으로 테스트의 새로운 종이 등장해도 테스트에서 0회 등장, 1회 등장 등 의미를 부여하기에 새로운 종의 등장에도 영향을 적게 받습니다. 하지만, 변수 자체의 구분이 모호해지기도 합니다. 예를들어, 거위와 고양이는 분명히 다른 종입니다. 하지만, 1이라는 등장 횟수만을 기반으로 인코딩하였기에 컴퓨터는 둘을 같은 종처럼 인식하고 적게 등장하는 종이구나 정도로 파악할 가능성이 높습니다. 그렇기에 대부분의 정형 대회의 솔루션을 보면 Frequency Encoding과 Label Encoding을 섞어서 다른 관점을 모델에게 학습시키는 시도를 많이 하고 있습니다. 

 

Target Encoding 

마찬가지로 Target Encoding의 경우 각각의 종이 가지는 타겟 변수(사료의 비용)의 평균으로 인코딩을 하게됩니다. 개의 경우에는 1000 + 1500 + 3500을 3으로 나눈 2000원, 고양이의 경우에는 10000000원을 1으로 나눈 10000000원, 거위의 경우에는 2000원을 1으로 나눈 2000원이 됩니다. Target Encoding의 경우에는 사람들이 이 종에 평균적으로 얼마만큼의 사료를 투입하는지? 에 대한 직관적인 이해를 컴퓨터에게 제공할 수 있습니다. 하지만, 대부분의 솔루션에서 Target Encoding은 거의 보지 못했습니다. 왜 그럴까요? 위의 ID 2번의 예를 다시 보겠습니다. 고양이를 키우는데 드는 사료의 비용을 값으로 매핑했기에 10000000의 값을 가지고 있습니다. 이게 정말 맞을까요? 고양이에게 하루에 천만원을 사료로 들인다는 시각은 전혀 일반적이지는 않을 것입니다. 이렇게 Target Encoding의 경우 오버피팅의 위험이 큰게 가장 큰 단점입니다. ID 2처럼 이상치가 있는 경우와 5번의 경우처럼 해당 종이 하나만 나온 경우에 대해서 해당 값들에 너무 오버피팅되기가 쉬운 문제가 있습니다. 그러한 문제를 해결하고자 노이즈를 추가한다는지 5폴드를 통해서 Target Encoding을 하는 방법도 있고, 미래의 정보를 보지 않게 하기 위해 순차적으로 Encoding 하는 방법도 존재합니다. 

 

요약

 

추후, 임베딩 방법론에 대한 자세한 글 작성하기 아래 부분 (실습 형태?)

Image Embedding

위의 카테고리 정보 이외에도 다른 추가적인 정보가 있을 수 있습니다. 그 중 하나가 이미지입니다. 위의 상황으로 다시 돌아가보겠습니다. 이때, 1번 ID의 개의 경우 사료의 비용이 상대적으로 적고 4는 상대적으로 높습니다.

이때, 위의 이미지 정보가 같이 있으면 어떨까요? 1번 사람의 개는 작은 강아지이고 4번 사람의 개는 상대적으로 큰 개입니다. 그렇기에 덩치 차이가 나서 사료의 비용이 차이가 난다는 것을 이미지를 통해 확인할 수 있습니다. 우리는 그러면 이러한 이미지 정보를 컴퓨터가 인식할 수 있도록 해야하고, 대표적인 방법으로는 Pretrained된 딥러닝 모델을 가져와서 사용하는 방법입니다. (해당 방법을 잘 모르셔도 상관없습니다. 그냥 이러한 방법이 있다 정도로만 이해하고 나중에 딥러닝 모델을 배웠을때 이런식의 적용법도 가능하다 정도로 넘어가셔도 무방합니다) 

이미지가 들어올 경우, 학습된 딥러닝 모델을 가져와서 이미지 벡터를 추출해서 이를 피쳐로 활용하는 형태입니다. (단, 이때 이미지 벡터가 보통 차원이 512, 768으로 크니 PCA, SVD와 같은 차원축소를 적용해주기도 합니다.)

 

Text Embedding

마찬가지로 이미지가 아닌 텍스트에 대한 정보가 있는 경우도 생각해볼 수 있습니다.

위의 예시에서 1번과 4번을 비교해보면, 크기 (작다 / 크다) , 종 (웰시코기, 리트리버) , 먹는 양 (많이 먹지 않는 편, 많은 양을 먹는 편)과 같은 유용한 정보를 담고 있습니다. 이런 정보는 사료의 비용을 알아보는데 유용한 정보이기도 합니다. 그렇기에, 위의 이미지처럼 이러한 텍스트도 임베딩을 해서 모델에게 건네주는 것이 의미가 있을 수 있습니다. 

 

대표적으로 많이 사용되는 방법은 TF-IDF와 Word2vec이 있으며 어떠한 자연어 처리 모델을 가져와서 임베딩한 후, 차원이 크면 차원 축소 후 변수로 사용한다 정도로만 이해하시고 넘어가면 될 것 같습니다. (해당 방법은 https://eda-ai-lab.tistory.com/525 링크를 참고하시기 바랍니다) 

 

[의견] 

- TF-IDF, Text Embedding, Word2vec Embedding, Image 파트 등은 추가자료로 따로 나가는게 좋을까요?

- 설명을 너무 간단하게 하고 넘어가는 것 같네요.