a) 모델 학습 관점:
   - Training set augmentation: 모델이 더 다양한 데이터로 학습하여 일반화 성능 향상
   - Validation set 원본 유지: 실제 테스트 환경과 유사한 조건에서 성능 평가

   b) 평가 신뢰성:
   - 증강되지 않은 validation set으로 평가함으로써 더 신뢰할 수 있는 성능 지표 획득
   - 실제 deployment 환경에서의 성능을 더 정확하게 예측 가능

   c) 데이터 분포:
   - Training: 증강을 통해 클래스 불균형 완화
   - Validation: 실제 데이터 분포 유지
balance_strategy.method가:
"weighted": Weighted Loss/Sampler 사용
"sampling": Over/Under sampling 사용
"none": 클래스 불균형 처리 없음

Under-sampling:
ratio=0.8이면 최소 클래스 수의 80% 수준으로 모든 클래스를 감소
예: min_count=100이면, 모든 클래스가 80개로 감소
Original:
Class 0: 1000개
Class 1: 100개
Class 2: 50개

After under-sampling (ratio=0.5):
Class 0: 500개 (1000 * 0.5)
Class 1: 100개 (그대로 유지)
Class 2: 50개 (그대로 유지)

Over-sampling:
ratio=0.8이면 최대 클래스 수의 80% 수준으로 모든 클래스를 증가
예: max_count=1000이면, 모든 클래스가 800개로 증가

각 방식의 특징:
Weighted:
데이터 수는 변경하지 않음
Loss 계산 시 가중치만 적용
메모리 효율적
학습이 불안정할 수 있음
Under-sampling:
데이터 수가 감소하여 학습 속도 빠름
정보 손실 가능성
메모리 효율적
다수 클래스의 중요한 패턴을 놓칠 수 있음
Over-sampling:
데이터 손실 없음
더 많은 학습 데이터
메모리 사용량 증가
과적합 가능성 있음 (같은 데이터 반복)
선택 기준:
1. 데이터셋이 매우 큰 경우: Under-sampling 또는 Weighted
데이터셋이 작은 경우: Over-sampling
클래스 불균형이 심한 경우: Weighted + Over-sampling 조합
메모리 제약이 있는 경우: Under-sampling 또는 Weighted
적용 후:
Class 1: 100개 (원본 유지)
Class 2: 30 → 100개 (70개 augmentation)
Class 3: 20 → 100개 (80개 augmentation)
2. Weighted Sampler 적용 (두 번째):
0
가중치 계산 (sqrt_inverse):
Class 1: 1/√100 ≈ 0.1
Class 2: 1/√30 ≈ 0.183
Class 3: 1/√20 ≈ 0.224
Weighted Loss 적용 (마지막):
완화
손실 가중치 (inverse with scaling):
Class 1: (1/100)^0.5 ≈ 0.316
Class 2: (1/30)^0.5 ≈ 0.577
Class 3: (1/20)^0.5 ≈ 0.707

최종적으로:
Augmentation으로 데이터 수 균형
Sampler로 학습 시 노출 빈도 조정
Loss로 오분류 페널티 차등 적용

# config.yaml
data:
  balance_strategies: ["augmentation"]  # 한 가지 전략만 선택
  # 또는
  balance_strategies: ["weighted_sampler", "weighted_loss"]  # augmentation 없이 두 가지 조합
  
data:
  # augmentation + weighted_loss 조합 시
  augmentation_sampling:
    target_count: 80  # 완전한 균형까지는 안 감
  loss_weight_scale: 0.3  # 약한 loss 보정

  # weighted_sampler + weighted_loss 조합 시
  sampler_weight_scale: 0.7
  loss_weight_scale: 0.3

augmentation 단독 사용: 데이터 수준에서 균형
weighted_sampler + weighted_loss: 샘플링과 학습에서 균형 (약한 가중치)
augmentation + weighted_loss: 데이터 증강 + 약한 loss 보정
Sampling vs Weighted Sampler 비교:
Weighted Sampler가 일반적으로 더 선호됨:
Under/Over sampling:
실제 데이터셋 크기가 변경됨
Under: 정보 손실 위험
Over: 단순 복제로 다양성 부족
Weighted Sampler:
데이터셋 크기 유지
확률적 샘플링으로 다양성 확보
배치 구성이 더 유연함
GPU 메모리 효율적

필요성:
1. Balanced:
검증 시 모든 클래스를 균등하게 평가
소수 클래스의 성능도 정확히 모니터링
Test Similar:
테스트셋과 유사한 샘플로 검증
실제 배포 환경과 유사한 조건에서 평가
도메인 갭 감소
하지만:
추가적인 계산 비용
검증셋 크기 감소 가능성
실제 분포와 달라질 수 있음
권장:
기본적으로는 stratified split만으로 충분
특수한 요구사항이 있을 때만 val_selection 사용
예: 테스트셋과 학습셋의 도메인이 많이 다른 경우
소수 클래스의 성능이 특히 중요한 경우

# Balance
각 전략의 특징:
Balanced Strategy:
모든 클래스에서 동일한 수의 샘플 선택
가장 적은 클래스의 샘플 수를 기준으로 함
장점: 클래스별 성능을 공정하게 평가 가능
단점: 실제 데이터 분포와 달라질 수 있음
Test Similar Strategy:
테스트셋과 통계적으로 유사한 샘플 선택
유사도 메트릭:
image_stats: 이미지 통계량 (평균, 표준편차 등)
feature_dist: 모델 특징 분포
domain_score: 도메인 유사도
Stratified K-Fold와 함께 사용:

balanced의 의미:
각 클래스에서 동일한 수의 검증 샘플 선택
가장 적은 클래스의 샘플 수를 기준으로 함
검증 시 모든 클래스를 동등하게 평가 가능
장단점:
장점: 클래스별 성능을 공정하게 평가
단점: 실제 데이터 분포와 달라질 수 있음