LLMs 파인튜닝 프로젝트: 제품 설명으로 가격 예측하기 (3)

KiwiChipKiwiChip
3 min read

데이터를 다운 받고, 카테고리가 어떻게 구성되어 있는지 살펴보면 다음과 같다.

🚗 데이터 현황 – 자동차 카테고리가 너무 많다!

  • 자동차 카테고리가 90만 개 이상의 데이터 포인트로 가장 많다.

  • 총 데이터 포인트: 280만 개 이상으로 매우 방대하다.

    이러한 데이터 포인트수는 훈련에 필요한 데이터 수를 훨씬 초과한다.

  • ➡️ 목표: 더 가치 있고 의미 있는 데이터 포인트를 선택하여 작고 강력한 데이터셋을 만들기.

📏 토큰과 가격 분포 확인

  • 토큰 수 분포:
    모든 프롬프트가 180 토큰 이하로 유지되어 있다.
    이는 오픈 소스 LLaMA 모델 파인튜닝과 비용 절감에 도움이 된다.

  • 가격 분포:

    • 가격은 $1~$999로 제한했다.

    • 데이터셋이 저가 제품에 편향되어 있다.

    • 상위 가격대 제품은 극소수이다.

🔧 데이터셋 확장 및 균형 맞추기

1. 카테고리 별 데이터 불균형 해결하기

  • 자동차 제품: 90만 개 (가장 많음)

  • 전자 제품: 40만 개

➡️ 문제: 특정 카테고리(자동차)에 치우쳐 있어 데이터 불균형 발생.
➡️ 해결책: 데이터를 샘플링해 균형 잡힌 데이터셋 만들기.

🧰 샘플링 과정 – "Slots" 딕셔너리 만들기

1. "Slots" 딕셔너리란?

slots = defaultdict(list)
for item in items: # 모든 제품(items)을 순회하며, 가격에 따라 해당 슬롯(slots)에 제품 추가.
    slots[round(item.price)].append(item) # 반올림을 사용해 가격을 정수로 처리했다.
  • 각 가격(정수)을 키로 하고, 해당 가격의 제품 목록을 값으로 저장.

  • 예) slots[2] → $2 제품 목록, slots[20] = [item1, item2, ...]

  • 총 999개의 슬롯(슬롯당 가격 범위: $1~$999)

  • ➡️ 결과: 가격 별로 제품을 버킷(bucket)에 담아둔 데이터셋 생성.

2. 샘플링 로직:

np.random.seed(42) # 난수 생성 고정: 코드를 실행할 때마다 같은 결과가 나오도록 설정
random.seed(42)
sample = []
for i in range(1, 1000):
    slot = slots[i]
    if i >= 240:
        sample.extend(slot)
    elif len(slot) <= 1200:
        sample.extend(slot)
    else:
        weights = np.array([1 if item.category=='Automotive' else 5 for item in slot])
        weights = weights / np.sum(weights)
        selected_indices = np.random.choice(len(slot), size=1200, replace=False, p=weights)
        selected = [slot[i] for i in selected_indices]
        sample.extend(selected)
  • $240 이상 제품은 슬롯 전체를 샘플링.

    • 이유: 고가 제품은 적기 때문에 모두 포함.
  • $240 이하 제품은 슬롯당 1200개만 샘플링.

    • 제품 수1200 이하인 경우:

      • 해당 슬롯에 제품이 1200개 이하라면 모두 샘플링.

      • 이유: 데이터가 적으면 모두 사용.

    • 1200개 초과 제품이 있는 경우:

      • np.random.choice를 사용해 1200개만 샘플링.
  • 카테고리별 가중치:

    • 자동차(Automotive) – 가중치 1

    • 나머지 카테고리– 가중치 5

    • 결과적으로 자동차 제품은 덜 뽑히고, 다른 카테고리 제품은 더 많이 샘플링됨.

🔑 이러한 과정을 거치는 이유는?

  1. 데이터 불균형 해소:

    • 자동차(Auto) 제품이 너무 많다면 모델이 자동차 데이터에 과도하게 학습된다.

    • 이를 방지하기 위해 가중치 기반 샘플링을 사용해 다른 카테고리를 더 많이 포함한다.

  2. 데이터 균형 유지:

    • 고가 제품은 데이터가 적으므로 전체를 포함하고,

    • 저가 제품은 일정 수만 샘플링해 균형을 맞춘다.

  3. 훈련 품질 향상:

    • 데이터가 편향되지 않고 다양한 가격대와 카테고리를 포함한 데이터셋을 만들어 훈련의 품질을 높인다.
  4. 과적합 방지:

    • 한쪽 데이터(자동차)에만 편향된 모델은 실제 상황에서 과적합(overfitting)될 위험이 있다.

    • 이를 방지하기 위해 균등한 가격 분포와 다양한 카테고리를 샘플링한다.

🧪 실행 결과

  • 408,000개 데이터 포인트 샘플링 완료.

  • 적절한 가격 및 카테고리 분포 확보.

📈 결과 분석 – 샘플링 후 데이터 분포

  • 가격 분포:

    • 저가 제품이 여전히 많지만, 고가 제품도 더 나은 비율로 반영됨.

    • $399, $499 같은 가격 지점에서 약간의 피크 현상.

  • 카테고리 분포:

    • 여전히 자동차 비율이 높지만, 이전보다 균형 잡힌 상태.
  • 파이 차트 시각화:

    • 자동차 제품이 가장 많지만, 이제는 과도하게 지배적이지 않다.

    • 전자 제품, 공구 등 다양한 카테고리가 골고루 포함됨.


원본 출처: Udemy - Become an LLM Engineer in 8 weeks: Build and deploy 8 LLM apps, mastering Generative AI and key theoretical concepts.

0
Subscribe to my newsletter

Read articles from KiwiChip directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

KiwiChip
KiwiChip

I'm currently learning Python and studying RAG (Retrieval-Augmented Generation).