# 클래스 분포 분석 리포트 (basket_dataset_v2)

**작성일시**: 2026-02-28 13:30  
**분석 대상**: `/home/billy/25-1kp/vla/ROS_action/basket_dataset_v2`  
**분석 스크립트**: `/tmp/class_dist_analysis.py`

---

## 1. Background

`v3-exp07` 모델의 `class_weight` 설정이 실제 데이터 분포가 아닌 직관 기반의 **Magic Number**로 설정되어 있다는 지적에 따라, 528개 전체 에피소드의 9,487 프레임에 대한 실제 클래스 분포를 측정하였습니다.

---

## 2. Analysis

### 분석 방법
- 모든 H5 파일의 `actions` 키 (`(linear_x, linear_y)` 연속값)를 numpy 벡터화 연산으로 읽어 9-class 분류 로직 (threshold=0.3) 적용
- left/right 에피소드를 파일명 키워드(`left`/`right`)로 구분하여 각각 집계

### 측정 결과

|  cls  | 이름  | 전체 프레임 | 전체 비율 | 역수 권장 weight | LEFT ep 내 비율 | RIGHT ep 내 비율 |
| :---: | :---: | ----------: | --------: | ---------------: | --------------: | ---------------: |
|   0   | STOP  |         528 |      5.6% |             8.98 |            5.6% |             5.6% |
|   1   |   F   |       4,743 | **50.0%** |             1.00 |           50.0% |            50.0% |
|   2   |   B   |           0 |      0.0% |       *(미사용)* |            0.0% |             0.0% |
|   3   |   L   |         277 |  **2.9%** |            17.12 |        **5.6%** |         **0.0%** |
|   4   |   R   |         527 |      5.6% |             9.00 |            5.6% |             5.6% |
|   5   |  FL   |       1,581 |     16.7% |             3.00 |           16.7% |            16.7% |
|   6   |  FR   |       1,831 |     19.3% |             2.59 |           16.7% |            22.2% |
|   7   |  BL   |           0 |      0.0% |       *(미사용)* |            0.0% |             0.0% |
|   8   |  BR   |           0 |      0.0% |       *(미사용)* |            0.0% |             0.0% |

**권장 class_weights (JSON 배열)**: `[8.98, 1.0, 0.0, 17.12, 9.0, 3.0, 2.59, 0.0, 0.0]`

---

## 3. Findings

### Finding 1: 🚨 Forward(F)가 전체의 절반 차지 — 편향 베이스라인 문제
- Forward 클래스가 전체 프레임의 **50.0%**를 차지합니다.
- 이는 모델이 항상 "앞으로"만 답해도 50% 정확도가 나온다는 의미입니다.
- **val_acc 50%는 무지성 전진(Trivial Baseline)과 동일**하므로, 팀 전체가 이 수치를 인지해야 합니다. 유효한 모델 성능은 반드시 60% 이상이어야 합니다.

### Finding 2: 🚨 B, BL, BR은 완전 미사용 클래스
- 클래스 2(B), 7(BL), 8(BR)은 실제 주행 데이터에 **단 한 프레임도 존재하지 않습니다.**
- 현재 9-class 설정을 유지하면 해당 클래스에 해당하는 뉴런이 학습 내내 Dead Neuron 상태가 됩니다.
- **권고**: 6-class (STOP, F, L, R, FL, FR)로 action space를 재정의 고려 필요.

### Finding 3: 🚨 Left 클래스(3)는 Left 에피소드에만 존재
- **Left 클래스(L)**: LEFT 에피소드에서 5.6%, RIGHT 에피소드에서 **완전히 0%**
- **Right 클래스(R)**: 두 에피소드 모두에서 5.6% (대칭이 아님 → 실물 주행 경로 비대칭)
- 이것은 "Left 에피소드" = 목적지가 왼쪽인 전체 궤적이며, 그 안에서만 순수 Left 조향이 발생함을 증명합니다.

### Finding 4: 기존 class_weight vs 데이터 기반 권장치 차이

|  cls  | 이름  | 기존(exp07) | 데이터 기반 권장 | 평가                              |
| :---: | :---: | :---------: | :--------------: | :-------------------------------- |
|   0   | STOP  |     1.5     |       8.98       | ❌ 6배 이상 과소 설정              |
|   1   |   F   |     0.1     |       1.00       | ❌ Forward를 과도 억제 → 전진 불가 |
|   3   |   L   |     8.0     |      17.12       | ⚠️ 두 배 더 높여야                 |
|   4   |   R   |     8.0     |       9.00       | ✅ 대체로 적절                     |
|   5   |  FL   |     3.0     |       3.00       | ✅ 정확                            |
|   6   |  FR   |     3.0     |       2.59       | ✅ 거의 정확                       |

---

## 4. Conclusion & Action Plan

### 즉시 조치 (exp07 재시작 전)
1. **class_weights를 데이터 기반 역수 가중치로 교체**
   ```json
   "class_weights": [8.98, 1.0, 0.0, 17.12, 9.0, 3.0, 2.59, 0.0, 0.0]
   ```
2. **미사용 클래스 처리**: B(2), BL(7), BR(8)에 weight=0.0을 주어 사실상 무시하거나, 액션 공간을 6-class로 재정의

### 중장기 조치
- Forward 편향(50%) 완화를 위해 새 데이터 수집 시 **Forward 전용 프레임 비율 의도적 감소** 또는 STOP/L/R 등 소수 클래스 에피소드 추가 수집 권장
