diff --git a/CLAUDE.md b/CLAUDE.md index b408e9c..2b8b5e9 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -5,7 +5,7 @@ ## 開発進捗 -最新: PLAN_02 Step 7 の一部としてクラス不均衡対策(重み・バランス・サンプリング)を実装・実験(TEST_04).次は学習率の公平な選び直し +最新: 色特徴+ロジスティック回帰が CNN と同等以上(込みで +0.04)と判明(TEST_05).次は CNN と色特徴の併用・効いている特徴の分析 ※ 本欄は**最新ステップ 1 行のみ上書き更新**.詳細な進捗履歴(動機・設計判断・失敗パターン)は [docs/PROGRESS.md](docs/PROGRESS.md) に追記する.運用ルールは `.claude/rules/progress-log.md` を参照(該当ファイル編集時に自動ロードされる). ## 必須ルール(コード実装時) @@ -102,3 +102,4 @@ - データセット集計結果: docs/06_TEST/TEST_02_データセット集計結果.md - 交差検証結果: docs/06_TEST/TEST_03_交差検証結果.md - クラス不均衡対策の実験: docs/06_TEST/TEST_04_クラス不均衡対策の実験.md +- 色特徴分類器の実験: docs/06_TEST/TEST_05_色特徴分類器の実験.md diff --git "a/docs/02_ENV/ENV_04_\351\226\213\347\231\272\343\202\263\343\203\236\343\203\263\343\203\211.md" "b/docs/02_ENV/ENV_04_\351\226\213\347\231\272\343\202\263\343\203\236\343\203\263\343\203\211.md" index c82b325..de96f1c 100644 --- "a/docs/02_ENV/ENV_04_\351\226\213\347\231\272\343\202\263\343\203\236\343\203\263\343\203\211.md" +++ "b/docs/02_ENV/ENV_04_\351\226\213\347\231\272\343\202\263\343\203\236\343\203\263\343\203\211.md" @@ -66,6 +66,7 @@ | --- | --- | --- | | 5-fold 交差検証 | `uv run tias-train cv --config <設定>` | 学習・評価して `runs/<実験ID>/` に書き出す.最後に実験 ID を出力する([SPEC_02](../04_SPEC/SPEC_02_学習・評価仕様.md)「交差検証の実行」) | | 手元での試運転 | `uv run tias-train cv --config configs/cv_synthetic.yaml` | 合成データ・小さなモデル・事前学習なし.CPU で十数秒 | +| 色特徴分類器の交差検証 | `uv run tias-train color-cv --config <設定>` | CNN と同じ分割で色特徴+ロジスティック回帰/勾配ブースティングを評価する([SPEC_02](../04_SPEC/SPEC_02_学習・評価仕様.md)「色特徴分類器」).GPU 不要.手元の試運転は `configs/color_synthetic.yaml` | | 回収した結果の集計 | `uv run python scripts/summarize_cv.py runs` | `runs/*_cv_*` を読み,モデル × 学習率 × 不均衡対策 × 条件ごとの表と,「除外 − 込み」「対策あり − 対策なし」の対応比較を Markdown で出す([TEST_03](../06_TEST/TEST_03_交差検証結果.md) の表) | 設定ファイル: @@ -77,6 +78,7 @@ | `configs/repeat/*_s43.yaml`・`*_s44.yaml` | 分割 seed を変えた繰り返し(seed 以外は元の設定と同一) | | `configs/lr1e-3/*.yaml` | ResNet-50・EfficientNet-B0 を学習率 1e-3 で回す設定(1e-4 では学習不足だったため.TEST_03) | | `configs/imbalance/*.yaml` | クラス不均衡の対策(`_cwinv`: 重み inverse・`_cwsqrt`: 重み sqrt_inverse・`_balanced`: バランス・サンプリング).元の設定(ConvNeXt-Tiny・ResNet-50 lr 1e-3 の各 6 本)から対策のキーだけを変えたもの | +| `configs/color/*.yaml` | 色特徴分類器(`cv_color__[_s43 \| _s44][_cwinv]`).分割・程度の設定は同名の CNN の設定と同一 | **サーバでの実行例**: @@ -91,6 +93,7 @@ uv run tias-remote pull <実験ID> # 指標・図・ログだけが手元の runs/ に届く ``` +- 色特徴分類器は GPU を使わないので `--cpu` で回す(例: `uv run tias-remote run --name color1 --cpu --server Archimedes -- bash -c "tias-train color-cv --config configs/color/cv_color_logistic_with_mild.yaml;"`).1 本は Archimedes で約 1 分・Newton で約 2 分(大半が画像の読み込みと特徴抽出.2026-09-28 実測) - ConvNeXt-Tiny の 5-fold 交差検証 1 本は Archimedes の RTX A6000 で約 2.5 分(2026-09-28 実測.画像の読み込み約 8 秒を含む) - 事前学習の重みは初回にサーバが Hugging Face からダウンロードする(`~/.cache/huggingface`) - ログに出る `lr_scheduler.step() before optimizer.step()` の警告は,混合精度で最初の数ステップの勾配がオーバーフローして捨てられたときに出るもので無害 diff --git "a/docs/03_PLAN/PLAN_02_\351\226\213\347\231\272\343\202\271\343\203\206\343\203\203\343\203\227.md" "b/docs/03_PLAN/PLAN_02_\351\226\213\347\231\272\343\202\271\343\203\206\343\203\203\343\203\227.md" index d130a72..b43008a 100644 --- "a/docs/03_PLAN/PLAN_02_\351\226\213\347\231\272\343\202\271\343\203\206\343\203\203\343\203\227.md" +++ "b/docs/03_PLAN/PLAN_02_\351\226\213\347\231\272\343\202\271\343\203\206\343\203\203\343\203\227.md" @@ -60,6 +60,7 @@ - **成果物**: 実験群(クラス不均衡対策・モデル比較・入力解像度・マスク外領域の埋め方)とその記録 - **完了条件**: 各要因の効果が**独立した実験として**切り分けて記録されている - **注意**: 共用サーバのため使用する GPU を明示的に指定する +- **進捗**: クラス不均衡対策([TEST_04](../06_TEST/TEST_04_クラス不均衡対策の実験.md))・色特徴分類器との比較([TEST_05](../06_TEST/TEST_05_色特徴分類器の実験.md))を実施 ## Step 8: 結論 (Conclusion) diff --git "a/docs/04_SPEC/SPEC_01_\343\202\242\343\203\274\343\202\255\343\203\206\343\202\257\343\203\201\343\203\243\350\250\255\350\250\210.md" "b/docs/04_SPEC/SPEC_01_\343\202\242\343\203\274\343\202\255\343\203\206\343\202\257\343\203\201\343\203\243\350\250\255\350\250\210.md" index d46768f..d782fe5 100644 --- "a/docs/04_SPEC/SPEC_01_\343\202\242\343\203\274\343\202\255\343\203\206\343\202\257\343\203\201\343\203\243\350\250\255\350\250\210.md" +++ "b/docs/04_SPEC/SPEC_01_\343\202\242\343\203\274\343\202\255\343\203\206\343\202\257\343\203\201\343\203\243\350\250\255\350\250\210.md" @@ -149,6 +149,7 @@ | --- | --- | --- | | `tias-dataset build-manifest` | `images/` を走査して `manifest.csv` を書き出す(既存があれば `--overwrite` が必要) | サーバ | | `tias-train cv --config PATH` | 5-fold 交差検証で学習・評価し,`runs/<実験ID>/` に書き出す([SPEC_02「交差検証の実行」](SPEC_02_学習・評価仕様.md)).最後に実験 ID を出力する | サーバ(GPU) | +| `tias-train color-cv --config PATH` | 色特徴分類器([SPEC_02「色特徴分類器」](SPEC_02_学習・評価仕様.md))を同じ分割で交差検証し,同じ形式で書き出す(学習曲線・重みは出さない).最後に実験 ID を出力する | サーバ(CPU) | | `tias-dataset survey` | データセットを集計して `runs/<実験ID>/` に集計値だけを書き出す(下記) | サーバ(結果の要約のみ手元へ) | | 学習 | 設定 YAML を受け取って学習する | サーバ | | 評価 | 学習済み run の評価・レポート生成 | サーバ | diff --git "a/docs/04_SPEC/SPEC_02_\345\255\246\347\277\222\343\203\273\350\251\225\344\276\241\344\273\225\346\247\230.md" "b/docs/04_SPEC/SPEC_02_\345\255\246\347\277\222\343\203\273\350\251\225\344\276\241\344\273\225\346\247\230.md" index 0f72afe..21952d1 100644 --- "a/docs/04_SPEC/SPEC_02_\345\255\246\347\277\222\343\203\273\350\251\225\344\276\241\344\273\225\346\247\230.md" +++ "b/docs/04_SPEC/SPEC_02_\345\255\246\347\277\222\343\203\273\350\251\225\344\276\241\344\273\225\346\247\230.md" @@ -189,6 +189,41 @@ 効果は,対策なしの結果と**同じ seed・同じ fold どうしの対応比較**で評価する(common の macro F1 と,クラス別の再現率・適合率・混同行列).少ないクラスの再現率が上がっても,他クラスの適合率が下がる入れ替わりが起きうるため,全体の数字だけで判断しない. +## 色特徴分類器 (Color Feature Classifier) + +ラベルが舌の色そのものであり,データが少ないため,舌領域の色の統計量を特徴にした古典的な分類器を CNN と**同じ分割・同じ評価**で比べる(`tias-train color-cv`.結果は [TEST_05](../06_TEST/TEST_05_色特徴分類器の実験.md)).GPU は使わない. + +### 特徴量 (Features) + +元解像度の画像の**舌領域の画素だけ**から取る(背景は RGB がすべて 0 の画素.レターボックス縮小は補間で背景の黒が縁に混ざるため使わない).長辺が `color.max_side`(既定 512.`null` で縮小しない)を超える画像は最近傍法で縮小する(新しい色を作らないため).画素を CIE L\*a\*b\*(D65)に変換し,次の 107 次元を作る. + +| 特徴 | 次元 | +| --- | --- | +| L\*・a\*・b\*・C\*(彩度 √(a\*² + b\*²))・h(色相角 atan2(b\*, a\*).度,(−180, 180])それぞれの平均・標準偏差(母標準偏差.ddof=0)・10/25/50/75/90 パーセンタイル | 5 × 7 = 35 | +| a\*-b\* の 2 次元ヒストグラム(a\* [0, 50]・b\* [−10, 30] を 8 × 8 に等分.舌領域の画素数に対する割合) | 64 | +| L\* のヒストグラム([20, 100] を 8 等分.割合) | 8 | + +- ヒストグラムの範囲外の画素は端のビンに入れる(割合の合計を 1 に保つ).範囲は全データの平均色([TEST_02](../06_TEST/TEST_02_データセット集計結果.md))を根拠に固定する +- 色相角は 0° をまたがないよう (−180, 180] で表す(舌の色は赤〜紫で a\* > 0 に集まるため) +- 舌領域の画素が無い画像は停止する(manifest の何件目かで示し,ファイル名は出さない) + +### 分類器と候補の選び方 (Classifier & Selection) + +設定の `color` 節で指定する(CNN の設定には不要.`color` 節が無い設定で `color-cv` を実行すると停止する). + +| キー | 値 | 内容 | +| --- | --- | --- | +| `color.classifier` | `logistic`・`hist_gb` | 標準化+多クラスのロジスティック回帰,または scikit-learn の HistGradientBoostingClassifier | +| `color.logistic.c_values` | 正の数のリスト(既定 0.01・0.1・1・10・100) | 正則化の強さ C の候補 | +| `color.hist_gb.learning_rates` × `max_depths` | 正の数・正の整数または `null` のリスト | 学習率と木の深さの候補(組み合わせ) | +| `color.max_side` | 正の整数または `null`(既定 512) | 特徴抽出の前に縮小する長辺の上限 | + +- 分割は CNN と同じ(「交差検証の実行」の 1〜2.2.同じ seed なら `split.json` が完全に一致する) +- 各 fold で,候補ごとに学習用データで学習し,**内側の検証の macro F1 が最良の候補**を採用する(厳密な改善で更新し,同点なら先の候補.CNN の最良エポックの選び方に対応).採用したモデル(学習用データだけで学習したもの)で held_out を 1 回だけ予測する +- `train.class_weighting` のクラス重み(「クラス不均衡」)を sample_weight として使う.`train.sampler: balanced` は未対応で,指定すると停止する +- 学習用データに無いクラスの予測確率は 0 とし,5 クラスの形を保つ +- 出力は CNN と同じ名前・同じ形式(「出力」).ただし `history.csv`・学習曲線・重み(`checkpoints/`)は出さない.`metrics.json` の `environment.model_name` は `color_logistic`・`color_hist_gb`,最良エポックは `null` で,fold ごとの採用した候補(`selected_params`)と候補ごとの検証 macro F1(`candidates`),特徴名(`color_classifier`),特徴抽出の所要秒数(`timing.feature_extraction_seconds`)を加える + ## 評価指標 (Metrics) | 指標 | 役割 | @@ -218,5 +253,5 @@ - 入力解像度 224 で足りるか(元画像は平均 675×614 で,約 1/3 に縮小することになる) - 黒背景が面積の大半を占めるため,正規化・統計を画像全体で取るか舌領域内のみで取るか - 「ややあり」を含めるか否かの結論(両条件の実験結果を見て決める) -- ルールベース診断の取り込み方 +- ルールベース診断の取り込み方(色特徴分類器の「平均色だけ」の版を作れば,TIASjudge に近い条件の比較の土台になる.TEST_05) - 医師ラベルの評価者間一致率(分かれば性能の上限の目安になる) diff --git "a/docs/06_TEST/TEST_05_\350\211\262\347\211\271\345\276\264\345\210\206\351\241\236\345\231\250\343\201\256\345\256\237\351\250\223.md" "b/docs/06_TEST/TEST_05_\350\211\262\347\211\271\345\276\264\345\210\206\351\241\236\345\231\250\343\201\256\345\256\237\351\250\223.md" new file mode 100644 index 0000000..fde3189 --- /dev/null +++ "b/docs/06_TEST/TEST_05_\350\211\262\347\211\271\345\276\264\345\210\206\351\241\236\345\231\250\343\201\256\345\256\237\351\250\223.md" @@ -0,0 +1,85 @@ +# 色特徴分類器の実験 (Color Feature Classifier Experiments) + +舌領域の画素から取った色の特徴量(107 次元.[SPEC_02「色特徴分類器」](../04_SPEC/SPEC_02_学習・評価仕様.md))と古典的な分類器で舌色 5 分類を行い,CNN([TEST_03](TEST_03_交差検証結果.md)・[TEST_04](TEST_04_クラス不均衡対策の実験.md))と**同じ分割・同じ評価**で比べた結果.ラベルが舌の色そのものであり,データが 1085 枚と少ないため,手作りの色特徴のほうが強い可能性を確かめる目的で行った.表は `uv run python scripts/summarize_cv.py runs` で再生成できる. + +| 項目 | 内容 | +| --- | --- | +| 実行日時 | 2026-09-28 10:54〜11:30 頃 | +| 実行場所 | Newton・Archimedes の CPU(GPU は使わない.`tias-remote run --cpu`.2 台に 9 本ずつ) | +| 本数 | 18 本(ロジスティック回帰・勾配ブースティング × ややあり込み/除外 × seed 42・43・44 = 12 本,ロジスティック回帰+重み `inverse` × 2 条件 × 3 seed = 6 本) | +| 分類器 | `logistic`(標準化+多クラスのロジスティック回帰.C を 0.01〜100 の 5 候補から選ぶ)・`hist_gb`(HistGradientBoostingClassifier.学習率 2 × 深さ 2 の 4 候補から選ぶ) | +| 候補の選び方 | fold ごとに,学習用データで各候補を学習し,内側の検証の macro F1 が最良の候補を採用する(CNN の最良エポックの選び方に対応) | +| コード | `c66b8bd-dirty`(本ブランチの実装を実行時点で未コミットのまま使用.同じ seed で CNN と `split.json` が完全に一致することはテストで確認済み) | + +## 結果 (Results) + +common(「あり」と淡紅)の macro F1・正解率と,all(ややあり込みの全体)の macro F1.15 fold の平均 ± 標準偏差.CNN は各モデルの最良の構成だけを抜粋した(全体は TEST_03・TEST_04). + +| モデル | 条件 | common macro F1 | common 正解率 | all macro F1 | mild→淡紅 | +| --- | --- | --- | --- | --- | --- | +| **色特徴+ロジスティック回帰** | 込み | **0.630 ± 0.052** | 0.721 ± 0.035 | **0.556 ± 0.043** | 0.33 | +| **色特徴+ロジスティック回帰** | 除外 | **0.644 ± 0.040** | **0.754 ± 0.031** | 0.520 ± 0.034 | 0.55 | +| 色特徴+ロジスティック回帰(重み inverse) | 込み | 0.568 ± 0.038 | 0.618 ± 0.036 | 0.541 ± 0.034 | 0.21 | +| 色特徴+ロジスティック回帰(重み inverse) | 除外 | 0.599 ± 0.040 | 0.672 ± 0.029 | 0.533 ± 0.036 | 0.38 | +| 色特徴+勾配ブースティング | 込み | 0.626 ± 0.049 | 0.712 ± 0.034 | 0.555 ± 0.044 | 0.33 | +| 色特徴+勾配ブースティング | 除外 | 0.627 ± 0.064 | 0.747 ± 0.037 | 0.512 ± 0.042 | 0.54 | +| ResNet-50(lr 1e-3・重み sqrt) | 込み | 0.590 ± 0.057 | 0.666 ± 0.070 | 0.554 ± 0.043 | 0.25 | +| ResNet-50(lr 1e-3) | 除外 | 0.637 ± 0.062 | 0.748 ± 0.045 | 0.519 ± 0.056 | 0.48 | +| ConvNeXt-Tiny(重み inverse) | 除外 | 0.632 ± 0.060 | 0.745 ± 0.030 | 0.528 ± 0.043 | 0.47 | + +common でのクラス別再現率(15 fold の平均): + +| モデル | 条件 | 淡白 | 淡紅 | 紅 | 暗赤紅 | 紫 | +| --- | --- | --- | --- | --- | --- | --- | +| 色特徴+ロジスティック回帰 | 込み | 0.56 | 0.73 | 0.65 | 0.82 | 0.41 | +| 色特徴+ロジスティック回帰 | 除外 | 0.48 | 0.88 | 0.59 | 0.77 | 0.36 | +| 色特徴+ロジスティック回帰(重み inverse) | 込み | **0.81** | 0.56 | **0.79** | 0.63 | **0.60** | +| 色特徴+ロジスティック回帰(重み inverse) | 除外 | **0.78** | 0.70 | 0.71 | 0.63 | 0.52 | +| ResNet-50(lr 1e-3) | 除外 | 0.59 | 0.83 | 0.61 | 0.79 | 0.39 | + +## CNN との対応比較 (Paired Comparison) + +色特徴+ロジスティック回帰 − CNN の common macro F1(同じ条件・seed・fold どうし.15 fold).正の値は色特徴のほうが良いことを表す. + +| 比べた CNN | 込み | 色特徴が上回った fold | 除外 | 色特徴が上回った fold | +| --- | --- | --- | --- | --- | +| ConvNeXt-Tiny(対策なし) | +0.089 ± 0.065 | 14 / 15 | +0.052 ± 0.063 | 11 / 15 | +| ConvNeXt-Tiny(重み inverse) | +0.045 ± 0.069 | 11 / 15 | +0.012 ± 0.063 | 8 / 15 | +| ResNet-50(lr 1e-3) | +0.084 ± 0.093 | 13 / 15 | +0.008 ± 0.063 | 8 / 15 | +| ResNet-50(lr 1e-3・重み sqrt) | +0.041 ± 0.076 | 12 / 15 | +0.011 ± 0.069 | 9 / 15 | +| ViT-Small | +0.051 ± 0.082 | 11 / 15 | +0.064 ± 0.074 | 13 / 15 | +| EfficientNet-B0(lr 1e-3) | +0.102 ± 0.062 | 14 / 15 | +0.067 ± 0.061 | 13 / 15 | +| 色特徴+勾配ブースティング | +0.005 ± 0.045 | 7 / 15 | +0.018 ± 0.057 | 10 / 15 | + +重み `inverse` の効果(色特徴+ロジスティック回帰.対策あり − なし): common macro F1 は込み −0.062(0/15 fold),除外 −0.046(2/15 fold).淡白 +0.25〜0.30・紫 +0.16〜0.18 に対して淡紅 −0.17〜0.18・暗赤紅 −0.14〜0.20. + +## 分かったこと (Findings) + +1. **色特徴+ロジスティック回帰は,これまでのどの CNN と比べても同等以上だった**.除外では common macro F1 0.644 で CNN の最良(ResNet-50 lr 1e-3 の 0.637・ConvNeXt+inverse の 0.632)と並び(対応比較で +0.01 前後.8/15 fold),**込みでは 0.630 で CNN の最良(0.590)を約 +0.04 上回った**(11〜14/15 fold) +2. **fold 間のばらつきが CNN より小さい**(標準偏差 0.040〜0.052.CNN は 0.045〜0.070).seed による揺れもほぼ無い(mild→淡紅 の割合の標準偏差 0.01) +3. **「ややあり」の込み/除外による差が小さい**(+0.014.9/15 fold).CNN は除外で大きく上がった(ResNet-50 で +0.09).CNN は境界例を入れると学習が乱れるが,単純な線形モデルは影響を受けにくいと考えられる +4. 勾配ブースティングはロジスティック回帰と同程度か少し下(除外で −0.018).非線形な分類器にしても伸びない +5. ロジスティック回帰で選ばれた正則化は強め(C = 0.1 が 30 fold 中 17,0.01 が 10)で,**単純なモデルで十分**なことを示す +6. **重み `inverse` は macro F1 を下げた**が,淡白 0.81・紫 0.60 と,**少数クラスの再現率はこれまでで最も高い**.淡紅・暗赤紅との入れ替わりが大きすぎて macro F1 では損になる.用途(見逃したくないクラスがあるか)によっては選択肢になる +7. 計算コストは極めて小さい.1 本(5 fold)の所要の大半は画像の読み込みと特徴抽出(Archimedes で約 62 秒,Newton で約 115 秒)で,ロジスティック回帰の学習は 5 fold で約 1 秒.GPU が要らない + +## 注意 (Caveats) + +- 差の多くは fold 間のばらつき(標準偏差 0.04〜0.07)と同程度で,確定的に言えるのは「色特徴+ロジスティック回帰は CNN に劣らない(込みでは上回る)」まで +- 比較相手の CNN の学習率・対策は結果を見て選んだもの(TEST_03・TEST_04)で,CNN 側に有利な比較になっている.一方,色特徴側の候補(C など)は内側の検証だけで選んでおり,held_out は見ていない +- 特徴の定義(ヒストグラムの範囲・ビン数)は TEST_02 の集計値(全データの平均色)を根拠に固定した.範囲を決めるのに全データの平均だけを使っており,ラベルごとの分布は使っていない +- TIASjudge のルールベース(平均色による判定)との比較ではない(Step 6 は保留中).ただし「色の統計だけで CNN 並み」という結果は,ルールベースとの比較の土台になる + +## 次の一手 (Next Steps) + +- **CNN と色特徴の併用**(CNN の予測確率と色特徴の分類器の予測確率の平均,または CNN の特徴と色特徴の連結).両者の誤り方が違えば上乗せが期待できる +- どの特徴が効いているか(ロジスティック回帰の係数・特徴の絞り込み)を調べる.平均色だけで足りるのか,分布の形(分位点・ヒストグラム)が効いているのかが分かれば,TIASjudge のルールの改良にも使える +- ルールベース(Step 6)との比較: 同じ色空間で「平均色だけ」の分類器を作れば,TIASjudge に近い条件で比べられる + +## 実験 ID (Run IDs) + +手元の `runs/` に回収済み(`.gitignore` 対象).名前の `color_logistic`・`color_hist_gb` が分類器,末尾 `_cwinv` が重み `inverse` を表す.実験 ID の日時は 2026-09-28 10:54〜11:22. + +```bash +ls -d runs/*_cv_color_* +``` diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index cc563fe..4c00449 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -110,3 +110,12 @@ - 失敗パターン: キュー完了後の自動回収が,長くなったジョブログの末尾しか読めず 36 本中 27 本しか拾えなかった → サーバ上の実験ディレクトリの一覧から回収し直した.以後,回収はログではなくディレクトリの一覧を正とする - 速度の調査: 学習中の GPU 使用率は平均 86% で計算律速(データ準備は余裕あり).性能を変えずに速くするなら channels_last・bf16(1〜3 割の見込み)や GPU の並列利用が候補(未実施) +## Step 7(一部): 色特徴分類器との比較 + +- [x] **舌領域の色特徴(107 次元)+ロジスティック回帰/勾配ブースティングの交差検証 `tias-train color-cv` を追加し,CNN と同じ分割で 18 本を実験**: ラベルが色そのもので,データが少ないため,手作りの色特徴のほうが強い可能性を確かめた(ユーザーの選択).結果は [TEST_05](06_TEST/TEST_05_色特徴分類器の実験.md). + - 設計判断 ①: 分割は CNN と完全に同じにした(fold の準備処理を CNN と共有する形に切り出した.同じ seed で `split.json` が一致することをテストで確認).これで CNN の結果と fold どうしの対応比較ができる + - 設計判断 ②: 分類器の候補(C 等)は内側の検証の macro F1 で選び,held_out は見ない(CNN の最良エポックの選び方に対応) + - 設計判断 ③: 特徴は元解像度の舌領域の画素だけから取る(レターボックス縮小は補間で背景の黒が縁に混ざるため) + - 進め方: ユーザーの指示で Phase 1 の人間の確認を省き,テスト作成と並行してサーバで実験した.GPU は使わず 2 台の CPU で 9 本ずつ回した(計約 30 分.1 本 1〜2 分) + - 結果: **色特徴+ロジスティック回帰が CNN と同等以上**.除外で common macro F1 0.644(CNN の最良 0.637 と並ぶ),込みで 0.630(CNN の最良 0.590 を上回り,対応比較で 11〜14/15 fold).fold 間のばらつきも小さく,込み/除外の差も小さい.重み `inverse` は macro F1 を下げたが,淡白 0.81・紫 0.60 と少数クラスの再現率はこれまでで最高 + - 示唆: 現状のデータ量では CNN が色の統計以上のものを学べていない.次は CNN と色特徴の併用と,どの特徴が効いているかの分析(TIASjudge のルール改良にもつながる)