https://mz-moonzoo.tistory.com/103
[NLP] 기업명으로 특정 산업군 분류 : RNN 구조만을 사용하여 성능 개선 (feat. Tensorflow / Keras)
https://mz-moonzoo.tistory.com/80 [DL] RNN - Recurrent Neural Networks 이론 정리0. RNN (Recurrent Neural Network) RNN(Recurrent Neural Network)은 시간적으로 순차적인 데이터를 처리할 수 있도록 설계된 인공신경망으로, 과거
mz-moonzoo.tistory.com
안녕하세요! 지난 1편에서는 '업체명'이라는 단일 텍스트 정보만을 사용하여 산업군을 분류하는 RNN 모델의 성능을 개선하기 위해 다양한 데이터 전처리, 불균형 처리 기법, 그리고 모델 구조 변경까지 시도해보았습니다. 그 결과, 모델이 이전에는 전혀 인식하지 못했던 소수 클래스들을 조금이나마 인지하기 시작하는 긍정적인 신호를 발견했지만, 동시에 '기업명'만으로는 다양한 산업군을 정교하게 분류하는 데 명백한 정보 부족의 한계가 있음을 절감했습니다.
이번 2편에서는 바로 이 "정보 부족"이라는 핵심 문제를 해결하기 위해, 모델에 더 풍부하고 직접적인 단서를 제공하고자 합니다. 1차 실험의 결론에서 예고해 드린 대로, 데이터 셋에 존재하는 기업의 '주생산품' 정보를 '업체명'과 함께 입력으로 사용하여 RNN 모델의 성능을 끌어올려보겠습니다. 과연 새로운 정보의 추가가 모델 성능에 어떤 영향을 주는지? 왜 영향을 주는지? 생각하시면서 과정을 같이 보시면 좋을 것 같습니다.
코드는 1편에서 사용한 코드와 크게 다를 것이 없어 일부 중요한 것들만 첨부하겠습니다. 전체 코드가 궁금하시다면 마지막에 제공해드린 깃허브 링크에서 확인하시면 됩니다!
2차 실험 목표
1차 실험을 통해 우리는 모델 구조나 학습 기법 개선만으로는 넘기 어려운 '입력 정보의 정보 부족'이라는 벽을 마주했습니다. 따라서 2차 실험의 주된 목표는 다음과 같습니다.
- 정보량 확대: '주생산품' 정보를 '업체명'과 결합하여, 모델이 산업군을 판단하는 데 필요한 핵심적이고 구체적인 키워드를 제공합니다.
- 분류 성능 향상: 추가된 정보를 바탕으로 전체적인 분류 정확도뿐만 아니라, 특히 1차 실험에서 어려움을 겪었던 소수 클래스에 대한 예측 능력을 실질적으로 개선합니다.
- 다양한 방법론 검증: 새로운 입력 데이터 환경에서 기존에 시도했던 모델 구조(SimpleRNN, Bidirectional RNN) 및 불균형 처리 기법(Focal Loss, 오버샘플링)들이 어떤 시너지를 내거나 다른 양상을 보이는지 비교 분석합니다.
실험 데이터 준비: '업체명'과 '주생산품' 결합
df_filtered['combined_input'] = df_filtered['업체명'].fillna('') + ' [SEP] ' + df_filtered['주생산품'].fillna('')
가장 먼저, 모델에 입력할 새로운 텍스트 데이터를 생성했습니다. 각 기업의 '업체명'과 '주생산품' 정보를 단순히 합치는 것보다, 두 정보가 구분될 수 있도록 특별한 구분자 토큰 [SEP] (Separator)를 사이에 넣어 결합했습니다.
- 예시: 업체명이 "브랜드하우스"이고 주생산품이 "콘텐츠"라면, 결합된 입력 텍스트는 "브랜드하우스 [SEP] 콘텐츠"와 같은 형태가 됩니다.
이렇게 결합된 텍스트는 이전보다 길이가 길어지고, 업종과 직접적으로 관련된 키워드(예: '플랫폼', '게이밍의자', '금속구조물')를 포함하게 되어 모델이 업종을 유추하는 데 훨씬 더 명확한 단서를 제공할 것으로 기대했습니다.
결합된 텍스트에 대한 토큰화(음절 단위), 정수 인코딩, 패딩 등의 전처리 과정은 1차 실험의 음절 단위 처리 방식과 동일하게 적용했습니다. 다만, 입력 텍스트의 평균 길이가 늘어남에 따라 max_len과 같은 일부 파라미터는 데이터 분포를 확인 후 적절히 조정했습니다.
기본 실험 환경 (1차 실험과 동일)
- Early Stopping, Epochs: 50, Optimizer: Adam (learning_rate=0.001), Seed: 42, Batch Size: 64
이제 '업체명 + 주생산품' 통합 입력을 사용하여 1차 실험에서 시도했던 여러 모델 조합과 불균형 처리 기법들을 다시 한번 적용하고 그 성능 변화를 면밀히 살펴보겠습니다.
1. SimpleRNN + CrossEntropy (업체명 + 주생산품 통합 입력)
가장 먼저 기본적인 SimpleRNN 모델에 새로운 통합 입력을 적용하여 성능을 측정했습니다. 이 결과는 '주생산품' 정보 추가의 순수한 효과를 가늠하는 새로운 Baseline이 됩니다.
결과:
- 테스트 손실(Test loss): 0.8508, 테스트 정확도(Test Accuracy): 0.7452 (1차 실험 최고 성능 0.60 대비 큰 폭 향상)
- Macro avg F1-score: 0.30 (1차 실험 0.19~0.23 대비 큰 폭 향상)
- Weighted avg F1-score: 0.71 (1차 실험 0.53 대비 큰 폭 향상)
- 분석 및 의의:
- 예상대로 '주생산품' 정보의 추가는 모델 성능에 매우 긍정적인 영향을 미쳤습니다. 전체 정확도가 약 14%p 이상 상승했으며, 이는 모델이 단순히 더 많은 정답을 맞히기 시작했음을 의미합니다.
- 특히 주목할 점은, 클래스 불균형을 고려하는 Macro avg F1-score가 0.19~0.23 수준에서 0.30로 크게 상승했다는 것입니다. 이는 모델이 이전에는 거의 예측하지 못했던 소수 클래스들에 대해서도 유의미한 수준으로 식별하기 시작했음을 강력하게 시사합니다. '주생산품'에 포함된 업종과 직접 관련된 키워드(예: '콘텐츠', '금속구조물', '플랫폼')들이 기업명의 모호성을 해소하고 명확한 분류 단서를 제공했기 때문으로 분석됩니다.
- 하지만, 여전히 극소수 클래스(예: '농,어,임,광업', '도소매업')의 재현율(Recall)은 0에 머물러, 이들 클래스를 안정적으로 분류하기에는 정보가 더 필요하거나 다른 전략이 요구됨을 알 수 있었습니다. 그럼에도 불구하고, 전반적인 성능 향상이 매우 긍정적이였습니다.
실제 데이터 예측 결과 :
레이블과 일치한 '두진테크'와 '트렌드잇플'의 경우 높은 신뢰도를 보였지만, 레이블과 불일치한 '로코모스튜디오'(실제 레이블: 기타, 모델 예측: 정보처리S/W)는 상대적으로 낮은 신뢰도를 보였습니다.
'로코모스튜디오'의 주생산품 'VR 애니메이션 영상'은 소프트웨어 기술과 창작(디자인/미디어) 역량이 결합된 분야입니다. 현재 7개 산업 대분류 중에서는 모델이 예측한 '정보처리S/W'가 그나마 가장 가까워 보이지만, 실제 레이블은 '기타'로 되어 있습니다. 이는 현재 사용 중인 7개 대분류 카테고리가 매우 광범위하여, '로코모스튜디오'와 같이 특정 융복합적이거나 세부적인 업종을 명확히 표현하는 데 한계가 있음을 시사합니다. 즉, 모델 예측의 정확성 문제라기보다는 분류 기준 자체의 모호함에서 오는 한계일 가능성을 엿볼 수 있습니다.
2. SimpleRNN + Focal Loss (alpha 파라미터로 클래스 가중치 조절)
다음으로, 정보량이 늘어난 새로운 입력 데이터 환경에서 Focal Loss의 효과를 다시 한번 검증했습니다. gamma=2.5를 사용하고, alpha 파라미터에는 class_weight를 기반으로 조정된 값을 사용했습니다.
결과:
- 테스트 손실(Test loss): 0.2213, 테스트 정확도(Test Accuracy): 0.6988 (Baseline 대비 정확도는 5%감소)
- Macro avg F1-score: 0.34 (Baseline 대비 4% 상승)
- Weighted avg F1-score: 0.66 (Baseline 대비 5% 감소)
- 분석 및 의의:
- 긍정적인 측면: 모델이 이전 Baseline 상태(다수 클래스 위주로만 예측하던 상태)에서 벗어나, 소수 클래스들을 더 잘 탐지하고 분류하기 시작했다는 중요한 진전을 이루었습니다. 이는 Macro avg F1-score의 상승으로 명확히 드러납니다. 만약 모든 클래스를 균형 있게 예측하는 것이 중요하다면, 이는 의미 있는 개선입니다. 기존에 전혀 탐지하지 못했던 "농,어,임,광업", "도소매업"을 탐지하기 시작하면서 다른 클래스도 탐지하기 시작한 것을 확인하실 수 있습니다.
- 고려해야 할 측면: 소수 클래스에 대한 성능을 얻는 대신, 전체적인 정확도와 다수 클래스의 성능(Accuracy 및 Weighted avg F1-score 감소)은 다소 희생되었습니다.
- Focal Loss의 역할: alpha 파라미터를 통한 클래스 가중치 조절은 분명히 모델이 소수 클래스에 더 많은 "주의"를 기울이도록 만들었습니다. 하지만 그 가중치의 강도나 다른 하이퍼파라미터(gamma, 학습률 등)와의 조합에 따라, 이러한 트레이드오프의 정도가 달라질 수 있습니다. 현재 결과는 특정 파라미터 조합에서의 한 지점을 보여주는 것입니다. (Focal Loss를 사용할 때는 학습률을 낮게하는 것이 경험적으로 더 좋은 결과가 나오더라구요)
Focal Loss의 파라미터 조합을 찾는 것도 중요하겠지만, 정확히 어떤 클래스에서 성능이 향상되고 어떤 클래스에서 하락했는지 상세히 분석하는 것이 중요합니다.
'농업', '도소매업'과 같은 극소수 클래스의 성능이 잘 나오지 않는 가장 큰 이유는 학습 데이터에 해당 클래스의 샘플 수가 절대적으로 부족하여, 모델이 해당 클래스를 대표할 만큼 충분하고 다양한 특징을 학습하지 못하기 때문입니다. 이로 인해 평가 데이터에 등장하는 (같은 클래스라도) 조금 다른 패턴의 샘플들을 제대로 일반화하여 예측하지 못하는 것입니다.
'기업명'에 '주생산품' 정보를 추가한 것은 분명 전체적인 정보량을 늘려 다른 클래스들의 성능을 향상시키는 데 기여했지만, 여전히 이들 극소수 클래스에게는 그 정보조차 충분하지 않았거나, 해당 정보가 다른 클래스와 구분될 만큼 충분히 독특하지 않았을 가능성이 큽니다.
3. Bidirectional RNN + CrossEntropy
'주생산품' 정보를 '업체명'과 통합하여 정보량이 풍부해진 통합 입력을 바탕으로, 모델 구조 역시 양방향 문맥을 이해할 수 있는 Bidirectional RNN으로 변경하여 실험했습니다.
결과:
- 테스트 손실 : 0.7696, 테스트 정확도: 0.77
- Macro avg F1-score: 0.38
- Weighted avg F1-score: 0.73
- 분석 및 의의:
- 정보량 증가와 Bidirectional RNN의 시너지: '주생산품' 정보가 추가되면서 입력 텍스트의 길이가 길어지고 문맥 정보가 풍부해지자, Bidirectional RNN이 그 장점을 발휘하기 시작하며 가장 높은 전체 테스트 정확도를 기록했습니다. 이는 주생산품 설명에 나타나는 단어의 순서나 앞뒤 문맥이 업종을 판단하는 데 중요한 역할을 했을 가능성을 시사합니다.
- 그러나... Cross Entropy
- 표준 Cross Entropy를 사용했을 때 전체 정확도는 가장 높았지만, Classification Report를 자세히 살펴보면 여전히 소수 클래스들의 정밀도(precision)와 재현율(recall)은 매우 낮거나 0에 가까웠습니다. 즉, 높은 전체 정확도는 여전히 다수 클래스를 잘 맞추는 데서 비롯된 것이며, 모델의 예측은 다수 클래스에 편향되어 있었습니다.
4. Bidirectional RNN + Focal Loss (alpha 파라미터로 클래스 가중치 조절)
이번에는 모델 구조를 Bidirectional RNN으로 변경하고 클래스 가중치 기반의 Focal Loss를 적용했습니다.
결과 :
- 테스트 손실 : 0.2222, 테스트 정확도: 0.73
- Macro avg F1-score: 0.43 (최고 성능!)
- Weighted avg F1-score: 0.73 (최고 성능과 동일!)
- 분석 및 의의:
- Cross Entropy vs Focal Loss:
- Focal Loss를 적용했을 때, 전체 테스트 정확도는 Cross Entropy와 거의 유사한 수준(0.77 vs 0.73)을 유지하면서도 소수 클래스들을 이전보다 더 잘 분류하기 시작했습니다. 예를 들어, 이전에는 재현율이 0이었던 특정 소수 클래스의 재현율이 높아지는 등, 모델이 소수 클래스를 "인지"하기 시작한 것입니다. 이는 Focal Loss가 의도한 대로 예측하기 어려운 샘플(주로 소수 클래스)에 모델이 더 집중하도록 유도했음을 보여줍니다.
- Cross Entropy vs Focal Loss:
4. 오버샘플링 (Over-sampling) 적용 (Bidirectional RNN + Cross Entropy 기반)
클래스 불균형 문제 해결을 위한 가장 직접적인 방법 중 하나인 오버샘플링(여기서는 RandomOverSampler 사용)을 가장 성능이 좋았던 Bidirectional RNN + Cross Entropy 조합에 적용해보았습니다. (오버샘플링을 통해 클래스가 균형을 이루기에 Focal Loss보다는 여기선 Cross Entropy를 사용했습니다.)
- 근거: 소수 클래스의 샘플 수를 인위적으로 늘려(단순 복제) 학습 데이터 내에서 다수 클래스와의 비율을 강제로 맞춤으로써, 모델이 소수 클래스의 특징을 더 많이 학습할 기회를 제공합니다.
결과:
- 테스트 손실 : 1.6638, 테스트 정확도: 0.70
- Macro avg F1-score: 0.43
- Weighted avg F1-score: 0.70
- 분석 및 의의: 오버샘플링을 적용한 결과, 몇 가지 주목할 만한 변화와 함께 명확한 장단점을 확인할 수 있었습니다.
- 전체 정확도 하락 vs. Macro F1-score 유지: 가장 높은 전체 정확도(0.7701)를 보였던 오버샘플링 미적용 모델(Bidirectional RNN + Cross Entropy)과 비교하면, 오버샘플링 적용 후 전체 테스트 정확도는 0.70로 약 7% 하락했습니다. 하지만 Macro avg F1-score는 0.43으로, Focal Loss + Bidirectional RNN 조합과 동일한 수준을 달성했습니다. Weighted avg F1-score는 0.70으로 Focal Loss 조합(0.72)보다는 다소 낮았습니다. 이는 오버샘플링이 다수 클래스의 성능을 일부 희생시키면서 소수 클래스에 대한 균형을 맞추려 했음을 시사합니다.
- 주요 소수 클래스 재현율(Recall)의 변화 – 엇갈린 결과:
- '도소매업' 클래스의 극적인 개선: 이전 Focal Loss + Bidirectional RNN 실험에서 재현율이 0.03으로 매우 낮았던 '도소매업' 클래스가 오버샘플링 후 재현율 0.28, F1-score 0.19를 기록하며 눈에 띄게 개선되었습니다. 이는 오버샘플링이 해당 클래스의 부족한 샘플 수를 보충하여 모델이 이 클래스의 특징을 학습하는 데 크게 기여했음을 보여줍니다.
- '건설운수', '연구개발서비스'의 꾸준한 개선: 이들 클래스 역시 오버샘플링을 통해 재현율이 각각 0.45, 0.44로 Focal Loss + Bidirectional RNN (각각 0.43, 0.31)보다 향상되거나 유사한 높은 수준을 유지했습니다.
- 하지만, '농,어,임,광업' 클래스 성능 저하: Focal Loss + Bidirectional RNN에서 재현율 0.48이라는 인상적인 결과를 보였던 극소수 클래스 '농,어,임,광업'은 오버샘플링 적용 후 재현율이 0.35, F1-score가 0.06으로 오히려 성능이 하락했습니다. 이는 단순 복제를 통한 오버샘플링이 모든 소수 클래스에 일관되게 긍정적인 효과를 주는 것은 아니며, 특정 클래스에 대해서는 오히려 학습을 방해하거나 일반화 성능을 떨어뜨릴 수 있음을 보여줍니다.
오버샘플링 적용 후 학습 데이터에 대한 정확도(Train Accuracy)가 90% 이상으로 매우 높게 나타났습니다. 이는 모델이 학습 데이터 내의 패턴을 매우 잘 "암기"했음을 의미합니다. 이는 과적합(overfitting)의 신호로 보일 수 있지만, 특정 관점에서는 이를 전략적으로 활용하는 것을 고려해볼 수도 있습니다. 예를 들어, 서비스 대상 기업의 정보가 자주 변경되지 않고, 이미 시스템에 등록된 기업에 대한 정확한 분류가 매우 중요한 경우라면, 학습 데이터의 기업들을 확실하게 맞추는 것이 단기적인 서비스 품질 향상에 기여할 수 있습니다. 즉, '알고 있는 데이터는 반드시 맞춘다'는 목표 하에 어느 정도의 과적합을 의도하는 것입니다.
하지만 이러한 접근은 새로운 기업 정보나 기존 정보의 미세한 변화에 대한 모델의 일반화 성능 저하라는 명확한 위험을 동반합니다. 학습 데이터와 조금이라도 다른 패턴의 데이터가 입력될 경우 예측 정확도가 크게 떨어질 수 있으며, 장기적으로 데이터 분포가 변할 때 모델 성능이 급격히 저하될 수 있습니다.
해당 실험에서는 검증 데이터의 Macro F1-score가 함께 상승하여 일반화 가능성에 대한 긍정적인 신호도 있었지만, RandomOverSampler가 데이터를 단순 복제하는 방식임을 고려할 때, 이것이 실제 미지의 데이터에 대한 강인한 일반화 성능을 완전히 보장한다고 보기는 어렵습니다. 따라서 이러한 높은 학습 정확도는 잠재적인 과적합의 위험성을 인지하면서, 서비스의 특성과 요구사항에 따라 신중하게 해석하고 활용해야 할 부분입니다.
실험 결과
실험 방법 | 정확도 | Macro Avg F1-score | Weighted Avg F1-score |
주요 소수 클래스 Recall (농업/도소매)
|
1. SimpleRNN + CE (Baseline) | 0.7452 | 0.3 | 0.71 | 0.00 / 0.00 |
2. SimpleRNN + Focal Loss | 0.6988 | 0.34 | 0.66 | 0.48 / 0.03 |
3. Bidirectional RNN + CE | 0.77 | 0.38 | 0.73 | 0.02 / 0.00 |
4. Bidirectional RNN + Focal Loss | 0.73 | 0.43 | 0.73 | 0.48 / 0.03 |
5. Bidirectional RNN + CE + 오버샘플링 | 0.70 | 0.43 | 0.70 | 0.35 / 0.28 |
가장 의미 있는 성과를 거둔 실험: "Bidirectional RNN + Focal Loss"
다양한 실험 결과들을 종합적으로 고려했을 때, 단순히 전체 정확도가 가장 높은 것을 넘어, 클래스 불균형 문제에 효과적으로 대응하면서도 전반적인 안정성을 유지한 "Bidirectional RNN + Focal Loss" 방법이 현재까지 가장 균형 잡히고 의미 있는 성과를 거두었다고 판단됩니다.
그 이유는 다음과 같습니다.
- 클래스 불균형 상황에서의 뛰어난 균형감 (높은 Macro Avg F1-score):
- 이 방법은 Macro Avg F1-score에서 0.43이라는 가장 높은 수치를 기록했습니다 (오버샘플링 방법과 동일). 이는 모델이 특정 다수 클래스에 치우치지 않고, 샘플 수가 적은 소수 클래스들을 포함한 모든 클래스에 대해 전반적으로 가장 균형 잡힌 예측 능력을 보여주었음을 의미합니다. 정확도만 높고 소수 클래스를 전혀 예측하지 못하는 모델보다 실질적인 활용 가치가 높습니다.
- 전체적인 성능 안정성 유지 (높은 Weighted Avg F1-score 및 준수한 정확도):
- Weighted Avg F1-score 역시 0.73으로 가장 높은 수준을 기록했으며, 테스트 정확도도 0.73으로 Cross Entropy를 사용한 Bidirectional RNN(0.77)에 비해 큰 손실 없이 높은 수준을 유지했습니다. 이는 소수 클래스에 대한 성능을 개선하면서도, 데이터셋의 다수를 차지하는 클래스들에 대한 예측 성능을 비교적 잘 보존했음을 의미합니다. 오버샘플링 방법이 전체 정확도와 Weighted Avg F1-score에서 상대적으로 더 큰 하락을 보인 것과 대비됩니다.
- 극소수 클래스에 대한 높은 민감도 유지 ('농,어,임,광업' 사례):
- Focal Loss를 적용했을 때, 샘플 수가 매우 적은 '농,어,임,광업' 클래스에 대해 꾸준히 높은 재현율(Recall 약 0.48)을 기록했습니다. 이는 오버샘플링 적용 시 해당 클래스의 재현율이 0.35로 다소 낮아진 것과 비교됩니다. Focal Loss는 데이터 자체를 변경하지 않고 손실 함수를 통해 어려운 샘플(주로 소수 클래스)에 집중하는 방식으로, 매우 희귀한 패턴이라도 놓치지 않으려는 학습을 효과적으로 유도한 것으로 보입니다.
- 데이터 왜곡 없는 학습 방식:
- RandomOverSampler와 같은 오버샘플링 기법은 데이터를 직접 복제하여 학습 데이터의 분포를 변경시키고, 이로 인해 특정 샘플에 대한 과적합 위험을 높일 수 있습니다. 반면, Focal Loss는 손실 함수를 조정하여 학습 방식을 변경하므로, 원본 데이터의 분포를 유지하면서 모델이 소수 클래스의 특징을 더 잘 학습하도록 유도합니다. 이는 잠재적으로 더 나은 일반화 성능을 기대할 수 있게 합니다.
물론, 오버샘플링 방법도 '도소매업'과 같이 Focal Loss만으로는 충분히 개선되지 않았던 특정 소수 클래스에 대해 눈에 띄는 재현율 향상을 가져오는 등 분명한 장점을 보여주었습니다. 이는 각 방법론이 데이터의 특정 측면에 다르게 반응하며, 서로 다른 강점을 가질 수 있음을 시사합니다.
하지만 현재까지의 실험 결과를 종합했을 때, "Bidirectional RNN + Focal Loss" 조합이 전체적인 예측 안정성, 모든 클래스를 아우르는 균형감, 그리고 극소수 클래스에 대한 민감도 측면에서 가장 발전적이고 유망한 결과를 보여주었다고 판단됩니다. 이는 향후 모델 개선시 기준점으로 사용할 수 있습니다.
추가 고려 사항 : 오버샘플링과 Focal Loss의 시너지 탐색 (Bidirectional RNN 기반):
- 기법 : 오버샘플링(예: RandomOverSampler 또는 더 정교한 기법)으로 소수 클래스의 샘플 수를 일정 수준까지 늘려 기본적인 학습 기회를 제공하고, 동시에 Focal Loss를 적용하여 여전히 예측하기 어려운 샘플이나 클래스 간 미묘한 경계에 모델이 더 집중하도록 유도할 수 있습니다.
- 기대 효과: 각 방법의 장점을 결합하여, 소수 클래스에 대한 전반적인 재현율을 높이면서도 Focal Loss가 학습 안정성을 잡아주는 효과를 기대할 수 있습니다.
- 고려 사항: 오버샘플링 비율을 어떻게 설정할지(모든 소수 클래스를 다수 클래스만큼? 아니면 특정 비율까지만?), Focal Loss의 alpha 및 gamma 값을 어떻게 최적화할지, 학습률은 어떻게 조정할지 등 매우 세심한 하이퍼파라미터 튜닝이 필요하니 다양한 실험이 필요합니다.
결론 및 첨언
이번 2차 실험을 통해 '업체명'에 '주생산품'이라는 구체적인 정보를 추가함으로써, 1차 실험에서 마주했던 '정보 부족'이라는 큰 벽을 상당 부분 넘어설 수 있었습니다. 특히 "Bidirectional RNN + Focal Loss" 조합은 전체적인 예측 안정성을 유지하면서도, 클래스 불균형 상황에서 비교적 모든 클래스를 아우르는 균형감(비교적 높은 Macro Avg F1-score)과 극소수 클래스에 대한 민감도를 보여주며 가장 의미 있는 성과를 거두었습니다. 이는 모델이 단순히 데이터를 암기하는 것을 넘어, 추가된 정보 속에서 업종을 구분하는 유의미한 패턴을 학습하기 시작했음을 보여주는 희망적인 결과입니다.
하지만, 여러 기법을 적용하여 소수 클래스에 대한 예측 능력을 끌어올렸음에도 불구하고, 여전히 서비스로 활용하기엔 부족한 모델입니다. 현재 상황에서 몇 가지 한계점과 개선 방안을 생각해봤습니다.
- 극소수 클래스의 낮은 성능: '도소매업'이나 '농,어,임,광업'과 같이 학습 데이터의 샘플 수가 절대적으로 부족한 클래스들은 여전히 만족스러운 수준의 예측 성능을 보여주지 못했습니다. 이는 아무리 정교한 모델링 기법이나 불균형 처리 전략을 사용하더라도, 모델이 학습할 수 있는 최소한의 데이터 양과 질이 확보되지 않으면 일반화 가능한 패턴을 찾기 어렵다는 근본적인 문제를 시사합니다.
- 타겟 변수 자체의 모호성 및 광범위함: 현재 저희가 타겟 변수로 사용하고 있는 '업종분류(기보)'의 7개 카테고리는 그 범위가 매우 넓습니다. 예를 들어 '정보처리S/W'라는 하나의 카테고리 안에는 전통적인 SI 개발부터 VR 콘텐츠 제작, AI 솔루션 개발 등 매우 다양한 세부 업종이 포함될 수 있습니다. 이처럼 하나의 대분류 카테고리가 너무 많은 이질적인 하위 업종들을 포괄하고 있다면, 모델이 명확한 분류 기준을 학습하는 데 어려움을 겪을 수밖에 없습니다. '로코모스튜디오 [SEP] VR 애니메이션 영상'을 '정보처리S/W'로 예측했지만 실제 정답은 '기타'였던 사례는 이러한 분류 체계의 한계를 단적으로 보여줍니다.
결국, 이러한 문제들은 모델의 구조 변경이나 하이퍼파라미터 튜닝만으로는 완벽히 해결하기 어려우며, 가장 효과적인 개선은 근본적인 "데이터" 자체에서 시작될 수 있다고 생각합니다.
그렇다면 앞으로 어떤 방향을 더 고민해볼 수 있을까요?
제가 실험을 진행하면서 "기업 정보를 무엇을 더 활용할까?" 고민하다가 데이터셋에 존재하는 '주생산품' 컬럼을 활용했는데, 여기서 더 나아가 다음과 같은 아이디어들을 구체화해볼 수 있습니다.
- 더 풍부하고 직접적인 기업 정보 활용: '주생산품' 컬럼을 넘어, 실제 기업 웹사이트의 회사 소개, 사업 영역, 핵심 기술, 서비스 설명 등의 텍스트 정보를 크롤링하여 입력 데이터로 활용하는 것입니다. 이러한 정보는 '기업명'이나 단편적인 '주생산품' 키워드만으로는 파악하기 어려운 기업의 구체적인 비즈니스 모델과 업종 특성을 훨씬 더 풍부하게 담고 있을 가능성이 높습니다. 이는 특히 현재 낮은 성능을 보이는 소수 클래스나 분류 경계가 모호한 기업들의 변별력을 높이는 데 크게 기여할 수 있습니다.
- 실시간 정보 연동을 통한 서비스 적용 아이디어: 만약 이 모델을 실제 서비스에 적용한다면, 단순히 학습된 정보에만 의존하는 것을 넘어 더욱 동적인 시스템을 구상해볼 수 있습니다. 예를 들어, 사용자가 기업명을 입력했을 때, 백그라운드에서 검색 엔진이나 기업 정보 API를 통해 해당 기업의 최신 정보를 실시간으로 가져오고, 이 정보를 기업명과 함께 모델의 입력으로 사용하여 업종을 분류하는 프로세스를 기획하는 것입니다. 이렇게 하면 모델은 항상 최신의, 그리고 구체적인 정보를 바탕으로 예측을 수행할 수 있어 정확도와 활용성을 높일 수 있을 것입니다.
물론, 이러한 아이디어들은 데이터 수집 및 전처리, 그리고 실시간 연동 시스템 구축 등 추가적인 노력이 필요합니다. 하지만 모델 성능의 근본적인 개선을 위해서는 결국 양질의 풍부한 데이터를 확보하고 이를 효과적으로 활용하는 것이 가장 중요하다고 생각합니다.
이 외에도 위에서 제안 드렸던 "오버샘플링 + Focal Loss + Bidirectional RNN 조합"을 통해 각 기법의 장점을 극대화하는 실험, LSTM이나 GRU, 더 나아가 Transformer와 같은 발전된 모델 아키텍처로의 전환, 그리고 사전 학습된 언어 모델(Transfer Learning)의 능력을 활용하는 등 기술적인 측면에서도 시도해볼 만한 개선 방향은 여전히 많이 남아있습니다.
다음 편에서는 RNN의 중요한 과제 중 하나인 장기 의존성(Long-term Dependency) 문제를 효과적으로 해결하기 위해 등장한 LSTM(Long Short-Term Memory) 모델의 이론을 먼저 깊이 있게 살펴보고자 합니다. 그리고 이어서, 이번 실험에서 사용했던 '기업명 + 주생산품' 통합 데이터에 LSTM 모델을 적용하여, 현재까지 가장 균형 잡힌 성능을 보여주었던 "Focal Loss + Bidirectional RNN" 조합과 그 성능을 비교 분석하는 과정을 상세히 공유해 드릴 예정입니다.
최종적으로는 GRU와 Transformer 아키텍처까지 직접 구현하고 그 성능을 비교 분석해볼 것이고, 만약 시간 여유가 있다면 einsum을 활용하여 어텐션 레이어를 직접 구현해보는 것까지 진행할 예정입니다.
다음 글을 언제 작성 할지... 확답 드리긴 어렵지만, 최대한 빠르게 찾아뵙도록 하겠습니다. 감사합니다!
ML-DL_Basic_study/Deeplearning/RNN/기업명_분류_RNN.ipynb at main · moonjoo98/ML-DL_Basic_study
머신러닝, 딥러닝 기초에 대한 실습 코드입니다. Contribute to moonjoo98/ML-DL_Basic_study development by creating an account on GitHub.
github.com
'DL > NLP' 카테고리의 다른 글
[NLP] 기업명으로 특정 산업군 분류 : RNN 구조만을 사용하여 성능 개선 (feat. Tensorflow / Keras) (0) | 2025.05.12 |
---|---|
[NLP] RNN 메커니즘 Numpy 직접 구현 실습 (0) | 2025.05.09 |
[NLP] Selenium에서 Javascript 명령어 사용하기 (0) | 2024.03.06 |
[NLP] Selenium 파일 다운로드 경로 설정 (0) | 2024.03.06 |
[NLP] Selenium으로 데이터 수집 (1) | 2024.03.06 |