데이터를 다운 받고, 카테고리가 어떻게 구성되어 있는지 살펴보면 다음과 같다.
🚗 데이터 현황 – 자동차 카테고리가 너무 많다!
자동차 카테고리가 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
결과적으로 자동차 제품은 덜 뽑히고, 다른 카테고리 제품은 더 많이 샘플링됨.
🔑 이러한 과정을 거치는 이유는?
데이터 불균형 해소:
자동차(Auto) 제품이 너무 많다면 모델이 자동차 데이터에 과도하게 학습된다.
이를 방지하기 위해 가중치 기반 샘플링을 사용해 다른 카테고리를 더 많이 포함한다.
데이터 균형 유지:
고가 제품은 데이터가 적으므로 전체를 포함하고,
저가 제품은 일정 수만 샘플링해 균형을 맞춘다.
훈련 품질 향상:
- 데이터가 편향되지 않고 다양한 가격대와 카테고리를 포함한 데이터셋을 만들어 훈련의 품질을 높인다.
과적합 방지:
한쪽 데이터(자동차)에만 편향된 모델은 실제 상황에서 과적합(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.