텍스트 분류를 BERT와 같은 언어모델로 풀고자 할 때 흔하게 발생하는 이슈는 특정 클래스들의 데이터 수가 상대적으로 적은 Imbalance 문제이다. 이를 어떤 방법으로 해결할 수 있을 지 살펴보자.
참고 :
www.researchgate.net/publication/336538175_Dealing_with_Data_Imbalance_in_Text_Classification
towardsdatascience.com/how-i-handled-imbalanced-text-data-ba9b757ab1d8
텍스트를 분류하고자 할 때 텍스트를 벡터형태로 바꾼 representation을 생성해내는 것이 우선적이다.
텍스트를 Representation하는 데에는 여러 방법들이 있다.
대표적으로 몇가지를 살펴보자면,
1. Bag of Words(BoW)
2. TF-IDF
3. GLOVE
단어 등장 수를 표현한 행렬을 Fatorization 등의 방법으로 차원을 줄인 후 사용하는 방법이다.
4. DOC2VEC
Word2Vec을 기반으로 만들어진 embedding 방법으로 단어들간의 관계, 예를 들면 동의어와 반의어와 같은 관계들을 잡아낼 수 있다.
5. Word2Vec with char n-grams(fastText)
Class등의 수가 너무 불균형할 때 일반적인 classifiers는 제대로 작동을 하지 못하게 된다.(수가 많은 class로 예측하면 정확도가 높아지기 때문에 치우쳐서 예측하게 됨)
그렇기 때문에 precision과 recall간의 trade-off를 잘 처리하기 위한 방법들이 필요하다.
이를 위해 두 가지 방법을 생각할 수 있는데, 첫번째는 분류 전에 전처리를 하는 방식이고 두번째는 분류 알고리즘 자체를 수정해서 수가 적은 class에 가중치를 주는 방법이다.
이 두가지 방법을 차례로 알아보자.
1> Resampling methods
리샘플링은 데이터셋을 수정해서 클래스의 사이즈 간의 차이를 줄이는 방법이다.
이러한 관점에서 두 가지 시나리오를 생각해볼 수 있는데, 첫번째는 majority class(data수가 많은 class)의 데이터를 삭제하는 방식(undersampling) 과 minority class(data수가 적은 class)의 데이터를 만들어내는 방식(oversampling) 이다.
Random undersampling은 이전 실험들에서 좋지 않은 결과를 내는 것으로 밝혀졌으므로 oversampling방법에 대해 더 알아보자.
1) Random oversampling
가장 간단하게 생각해볼 수 있는 방법으로 minority class에서 샘플을 랜덤으로 뽑아서 복사하는 방법이다.
2) SMOTE(= Synthetic Minority Over-sampling Technique)
SMOTE는 합성을 기반으로 하는 방법으로, minority class의 샘플을 가져와 이들을 잇는 선에서 중간값을 택하여 만들어내는 방식이다.(아래 GIF참고)
이를 통해 모델이 minority class에 대해 더 학습할 수 있게 된다.
3) SMOTE-SVM
이 방법은 SVM classifier에 의해 만들어진 support vectors(경계선과 가까운 vectors)에 속하는 인스턴스들에만 SMOTE algorithm을 적용하는 방법이다. 맨 처음, SVM를 학습시키고 support vectors에 속하는 샘플들이 나오면 SMOTE를 이용하여 oversampling하는 방식이다. Support vectors를 사용하기 때문에 클래스간의 경계선을 좀 더 뚜렷하게 만드는 효과가 있다.
4) WEMOTE/CWEMOTE
일반적인 SMOTE는 minority class 샘플들의 nearest neighbours를 결정해야 한다. 이는 $O(n^2)$의 시간이 소모되는데, 이와 달리 WEMOTE를 통해 좀 더 효율적으로 샘플들을 만들어낼 수 있다. WEMOTE는 두 개의 랜덤 벡터를 뽑아내고 평균을 계산하는 방식이다.
하지만 같은 class라 하더라도 데이터들의 특성은 제각각이기에 in-class imbalance가 있다. 이를 위해 CWEMOTE는 minority class 내에서 학습 샘플들을 clustering한 후 WEMOTE를 적용하는 것이다. clustering은 k-means를 사용한다.
각 oversampling을 사용하여 classification을 했을 때의 F-measure는 다음과 같다.
사실 결과를 보기 전에는 CWEMOTE가 잘되겠거니 생각했는데 random sampling보다 못한 경우도 있어서 좀 놀랍다.
clustering을 통해 유사한 데이터끼리 사용해서 새로운 데이터를 만들어내는 것보다 random으로 만들어내는 것이 모델에게 좀 더 많은 정보를 줘서 그렇지 않나 싶기도 한다.
한 번 소스코드를 봐서 실제 도메인에서의 데이터에도 적용해봐야겠다.
댓글