# クラス不均衡対策の実験 (Class Imbalance Experiments)

[TEST_03](TEST_03_交差検証結果.md) で紫・淡白の再現率が低かったため，クラス不均衡への対策（[SPEC_02「クラス不均衡」→「対策の設定」](../04_SPEC/SPEC_02_学習・評価仕様.md)）を 2 モデル × 3 通り × 2 条件 × 3 seed で試した結果．対策なしの結果は TEST_03 のものを使い，**同じ seed・同じ fold どうしで対応比較**した．表は `uv run python scripts/summarize_cv.py runs` で再生成できる．

| 項目 | 内容 |
| --- | --- |
| 実行日時 | 2026-09-28 08:50〜10:14 |
| 実行場所 | Archimedes の RTX A6000（GPU 1 の 1 枚．未使用の GPU のみを使用） |
| 本数 | 36 本（ConvNeXt-Tiny・ResNet-50 × 対策 3 通り × ややあり込み／除外 × seed 42・43・44） |
| モデルと学習率 | ConvNeXt-Tiny（1e-4）・ResNet-50（1e-3）．TEST_03 の設定から対策のキーだけを変えた |
| 対策 | 重み `inverse`・重み `sqrt_inverse`・バランス・サンプリング `balanced` |
| コード | `f9d9ebd-dirty`（コミット `8387ebd` の内容を実行時点で未コミットのまま使用．既定のままなら変更前と同じ学習になることはテストで確認済み） |

## 結果 (Results)

common（「あり」と淡紅）の macro F1・正解率と，all（ややあり込みの全体）の macro F1．15 fold の平均 ± 標準偏差．

| モデル | 対策 | 条件 | common macro F1 | common 正解率 | all macro F1 |
| --- | --- | --- | --- | --- | --- |
| ConvNeXt-Tiny | なし | 込み | 0.541 ± 0.066 | 0.668 ± 0.035 | 0.510 ± 0.056 |
| ConvNeXt-Tiny | 重み inverse | 込み | **0.585 ± 0.057** | 0.669 ± 0.063 | **0.546 ± 0.054** |
| ConvNeXt-Tiny | 重み sqrt | 込み | 0.563 ± 0.045 | 0.645 ± 0.057 | 0.524 ± 0.032 |
| ConvNeXt-Tiny | balanced | 込み | 0.566 ± 0.071 | 0.663 ± 0.081 | 0.528 ± 0.061 |
| ConvNeXt-Tiny | なし | 除外 | 0.592 ± 0.068 | 0.744 ± 0.035 | 0.480 ± 0.056 |
| ConvNeXt-Tiny | 重み inverse | 除外 | **0.632 ± 0.060** | 0.745 ± 0.030 | 0.528 ± 0.043 |
| ConvNeXt-Tiny | 重み sqrt | 除外 | 0.595 ± 0.060 | 0.750 ± 0.030 | 0.490 ± 0.049 |
| ConvNeXt-Tiny | balanced | 除外 | 0.611 ± 0.052 | 0.734 ± 0.041 | 0.509 ± 0.046 |
| ResNet-50 | なし | 込み | 0.546 ± 0.057 | 0.649 ± 0.066 | 0.520 ± 0.050 |
| ResNet-50 | 重み inverse | 込み | 0.558 ± 0.045 | 0.635 ± 0.055 | 0.535 ± 0.035 |
| ResNet-50 | 重み sqrt | 込み | **0.590 ± 0.057** | 0.666 ± 0.070 | **0.554 ± 0.043** |
| ResNet-50 | balanced | 込み | 0.562 ± 0.038 | 0.627 ± 0.045 | 0.533 ± 0.043 |
| ResNet-50 | なし | 除外 | **0.637 ± 0.062** | 0.748 ± 0.045 | 0.519 ± 0.056 |
| ResNet-50 | 重み inverse | 除外 | **0.637 ± 0.058** | 0.720 ± 0.045 | 0.542 ± 0.047 |
| ResNet-50 | 重み sqrt | 除外 | 0.633 ± 0.056 | 0.733 ± 0.045 | 0.534 ± 0.044 |
| ResNet-50 | balanced | 除外 | 0.616 ± 0.050 | 0.712 ± 0.062 | 0.523 ± 0.038 |

## 対策なしとの対応比較 (Paired Comparison)

対策あり − 対策なし（同じモデル・条件・seed・fold どうし．15 fold）．recall は common でのクラス別再現率の差．

| モデル | 対策 | 条件 | common F1 の差 | 上回った fold | 淡白 | 紫 | 淡紅 | 暗赤紅 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| ConvNeXt-Tiny | 重み inverse | 込み | **+0.044 ± 0.064** | **11 / 15** | +0.19 | +0.15 | −0.03 | −0.05 |
| ConvNeXt-Tiny | 重み inverse | 除外 | **+0.040 ± 0.063** | **12 / 15** | +0.19 | +0.09 | −0.07 | +0.02 |
| ConvNeXt-Tiny | 重み sqrt | 込み | +0.021 ± 0.052 | 10 / 15 | +0.12 | +0.23 | −0.06 | −0.07 |
| ConvNeXt-Tiny | 重み sqrt | 除外 | +0.003 ± 0.074 | 8 / 15 | −0.01 | −0.04 | −0.02 | +0.06 |
| ConvNeXt-Tiny | balanced | 込み | +0.025 ± 0.060 | 9 / 15 | +0.07 | +0.19 | −0.00 | −0.09 |
| ConvNeXt-Tiny | balanced | 除外 | +0.018 ± 0.067 | 10 / 15 | +0.13 | +0.05 | −0.08 | +0.03 |
| ResNet-50 | 重み inverse | 込み | +0.011 ± 0.060 | 7 / 15 | +0.16 | +0.10 | −0.04 | −0.05 |
| ResNet-50 | 重み inverse | 除外 | −0.000 ± 0.053 | 5 / 15 | +0.11 | +0.08 | −0.04 | −0.12 |
| ResNet-50 | 重み sqrt | 込み | **+0.043 ± 0.065** | **11 / 15** | +0.12 | +0.10 | +0.01 | −0.03 |
| ResNet-50 | 重み sqrt | 除外 | −0.004 ± 0.065 | 8 / 15 | −0.01 | +0.10 | −0.01 | −0.07 |
| ResNet-50 | balanced | 込み | +0.016 ± 0.068 | 8 / 15 | +0.13 | +0.15 | −0.05 | −0.08 |
| ResNet-50 | balanced | 除外 | −0.021 ± 0.071 | 4 / 15 | +0.06 | +0.07 | −0.04 | −0.09 |

クラス別再現率の差の標準偏差は 0.1〜0.3 と大きい（各 fold の held_out に淡白・紫は 11〜12 人しかいないため）．

## 分かったこと (Findings)

1. **ConvNeXt-Tiny では重み `inverse` が安定して効く**．込み・除外とも common macro F1 が約 +0.04 上がり（11〜12/15 fold），除外では 0.632 となって ResNet-50 の最良（0.637）と並んだ
2. **ResNet-50（学習率 1e-3）では効果がほとんど無い**．除外ではどの対策も ±0.02 の範囲で，上回った fold も半分以下．込みで `sqrt_inverse` だけが +0.043（11/15）
3. **狙いどおり淡白・紫の再現率は上がる**が（多くの組み合わせで +0.1〜0.2），**淡紅・暗赤紅の再現率が下がる入れ替わり**が起きる（−0.03〜−0.12）．macro F1 の改善が小さいのはこのため
4. **all（ややあり込みの全体）の macro F1 も上がる**（ConvNeXt・inverse で 0.510 → 0.546，ResNet-50・sqrt で 0.520 → 0.554）
5. 3 通りの対策の中では，**重み `inverse` が最も安定**．`balanced` は同じ画像を何度も学習するためか効果が不安定で，ResNet-50 の除外では下がった
6. 紫の再現率は対策後も 0.3〜0.55 に留まる．紫は枚数の少なさに加えて暗赤紅と色が近く（[TEST_02](TEST_02_データセット集計結果.md)．ΔE 4.6），不均衡対策だけでは解決しない

## 注意 (Caveats)

- 差の多くは fold 間のばらつき（標準偏差 0.05〜0.08）と同程度で，確定的に言えるのは「ConvNeXt・`inverse` はおおむね改善する」程度
- ResNet-50 の学習率 1e-3 は TEST_03 で結果を見て選んだもので，その上に重ねた比較である（TEST_03「学習率について」）
- 対策の種類と強さも結果を見て選ぶことになるため，最終的な構成は入れ子の交差検証など評価とは別のデータで選ぶ必要がある

## 次の一手 (Next Steps)

- 今後の基準の構成を「ConvNeXt-Tiny・重み `inverse`」または「ResNet-50（1e-3）」とし，学習率の公平な選び直し（入れ子の交差検証）と組み合わせる
- 紫と暗赤紅の取り違えを混同行列で詳しく見る（紫の多くがどのクラスに流れているか）
- 入力解像度を上げる（224 → 320 等）．色むらの細部が紫の判別に効く可能性がある

## 実験 ID (Run IDs)

手元の `runs/` に回収済み（`.gitignore` 対象）．名前の末尾 `_cwinv`・`_cwsqrt`・`_balanced` が対策を表す．実験 ID の日時は 2026-09-28 08:50〜10:12．

```bash
ls -d runs/*_f9d9ebd-dirty
```
