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

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

·

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.