# ラーメン豚山 スープAI評価 後段モデル比較レポート

作成日: 2026-06-19

## 1. 目的

動画から抽出したスープ画像をLLMで評価した結果を使い、最終的な人間評価点をどの後段モデルで最も安定して再現できるかを比較した。

今回の比較対象は以下の6方式。

| 比較対象 | 使用技術 | 目的 |
|---|---|---|
| 固定配点 | Python / pandas | 機械学習なしの基準値 |
| 線形回帰 | scikit-learn | 最も単純な学習モデル |
| Ridge回帰 | scikit-learn | 少量データでの過学習抑制 |
| Random Forest | scikit-learn | 非線形パターンの確認 |
| XGBoost | xgboost | BytePlus提案方式との比較 |
| LightGBM | lightgbm | XGBoost系の代替候補 |

## 2. 使用データ

入力データは、LLMスコアリング完了済みの以下を使用した。

- `local_batch_api/output_full/training_dataset.csv`

元データは520件。確認時に `human_total_score=880` の1件があり、100点満点スケール外の入力異常として検証対象から除外した。

最終的な比較対象は以下。

| 項目 | 件数 |
|---|---:|
| 元データ | 520 |
| 100点スケール外で除外 | 1 |
| 比較に使用 | 519 |
| assessable=true | 346 |
| 判定不可を含む行 | 173 |

除外した1件は以下に記録済み。

- `検証/results/downstream_model_comparison/excluded_target_outliers.csv`

## 3. 入力特徴量

LLM出力から以下の特徴量を作成した。

- `visual_density`
- `water_level`
- `oil_emulsification`
- `boiling_heat_state`
- `photo_quality`
- `image_condition_score`
- `assessable`
- `retake_recommended`
- `brix`
- `density_brix_abs_diff`
- `density_brix_signed_diff`
- `slot`

人間の評価コメントは、運用時に得られない情報のため特徴量には入れていない。

比較では以下の特徴量セットを作った。

| feature_set | 内容 |
|---|---|
| `visual_only` | LLM視覚評価のみ |
| `visual_plus_brix` | LLM視覚評価 + Brix |
| `visual_plus_brix_slot` | LLM視覚評価 + Brix + 時間帯 |
| `brix_only` | Brixのみ |

## 4. 評価条件

データ分割は固定seedで以下の通り。

| split | 件数 | 用途 |
|---|---:|---|
| train | 363 | 学習 |
| validation | 52 | モデル確認 |
| test | 104 | 最終評価 |

評価指標は以下。

| 指標 | 意味 |
|---|---|
| MAE | 人間評価との平均誤差。100点満点で何点ずれるか |
| RMSE | 大外しを重く見た誤差 |
| rho | スピアマン順位相関 |
| grade_match | A/B/C/Dグレード一致率 |
| anomaly_recall | 60点未満の要確認対象を拾えた割合 |

## 5. 主結果

主目的である `human_total_score`、つまり濃度込みの最終評価では以下の結果になった。

| モデル | 特徴量 | test MAE | test 相関 | グレード一致率 |
|---|---|---:|---:|---:|
| Random Forest | visual + Brix + 時間帯 | **8.72** | 0.620 | **80.8%** |
| LightGBM | visual + Brix + 時間帯 | 8.72 | **0.634** | 78.9% |
| 線形回帰 | visual + Brix | 8.75 | 0.622 | **80.8%** |
| 線形回帰 | visual + Brix + 時間帯 | 8.75 | 0.615 | **80.8%** |
| Ridge回帰 | visual + Brix + 時間帯 | 8.82 | 0.633 | **80.8%** |
| XGBoost | visual + Brix + 時間帯 | 8.88 | 0.632 | **80.8%** |
| 固定配点 | 固定式 | 26.67 | 0.462 | 64.4% |

MAEは100点満点に対する平均誤差であり、10点満点ではない。  
たとえば MAE 8.72 は、人間評価から平均して約8.7点ずれるという意味。

## 6. スープのみ点数の結果

画像評価そのものに近い `human_soup_score` では以下。

| モデル | 特徴量 | test MAE | test 相関 | グレード一致率 |
|---|---|---:|---:|---:|
| 線形回帰 | visual_only | **8.81** | 0.519 | 73.1% |
| 線形回帰 | visual + Brix + 時間帯 | 8.83 | 0.527 | 76.0% |
| 線形回帰 | visual + Brix | 8.83 | 0.525 | 76.0% |
| Ridge回帰 | visual_only | 8.93 | 0.511 | 73.1% |
| XGBoost | visual + Brix + 時間帯 | 8.96 | 0.530 | 76.9% |
| LightGBM | visual + Brix + 時間帯 | 8.97 | **0.544** | 76.9% |

スープのみ点数では、単純な線形回帰が最も良い。Brixや時間帯を追加しても大きな改善はない。

## 7. 解釈

今回の結果では、固定配点よりも学習モデルが明確に良い。

固定配点は `human_total_score` で MAE 26.67。一方、学習モデルは最良で MAE 8.72。  
つまり、LLMが出した各評価項目を単純に足し合わせるだけでは不十分で、人間評価に合わせて重みや非線形関係を学習させる価値がある。

一方で、Random Forest、LightGBM、線形回帰、Ridge、XGBoost の差は大きくない。  
最良の Random Forest は MAE 8.72、XGBoost は MAE 8.88で、差は0.16点に過ぎない。

したがって、現時点では「XGBoostだけが明確に強い」という結果ではない。  
精度最優先なら Random Forest / LightGBM、説明しやすさと運用安定性を重視するなら線形回帰 / Ridge が有力。

## 8. BytePlus提案値との比較

BytePlus提案で示されていた参考値は以下。

| 指標 | BytePlus提案値 | 今回最良 |
|---|---:|---:|
| MAE | 11.7 | **8.72** |
| 相関 | 0.53 | **0.634** |
| グレード一致率 | 74% | **80.8%** |

今回の同一データ上の後段比較では、参考値を上回る水準が出ている。

ただし、今回のtest件数は104件であり、モデル間の小差はノイズの可能性がある。  
特に Random Forest、LightGBM、線形回帰、Ridge、XGBoost は近い範囲に並んでいるため、次段階では交差検証や期間別検証で安定性を見る必要がある。

## 9. 現時点の推奨

現時点の実装候補は以下。

| 優先 | 候補 | 理由 |
|---|---|---|
| 第1候補 | 線形回帰 または Ridge回帰 | 精度が上位帯で、説明しやすく、運用が安定しやすい |
| 第2候補 | Random Forest | 今回のMAE最良。ただし説明性は線形系より落ちる |
| 第3候補 | LightGBM | 相関が最良。XGBoost系の軽量代替として有力 |
| 比較継続 | XGBoost | BytePlus方式との比較軸として残す |

社長共有向けの結論としては、以下の言い方が妥当。

> LLMによる画像評価結果を後段モデルで補正すると、人間評価との平均誤差は約8.7点まで改善した。固定配点では約26.7点の誤差が出るため、機械学習による後段補正は有効。現時点では複雑なXGBoostだけが突出しているわけではなく、説明しやすい線形回帰/Ridgeでも同等水準の精度が出ている。

## 10. 成果物

今回作成・出力した主な成果物。

| ファイル | 内容 |
|---|---|
| `検証/scripts/run_downstream_model_comparison.py` | 後段モデル比較の一括実行スクリプト |
| `検証/results/downstream_model_comparison/features.csv` | モデル投入用特徴量 |
| `検証/results/downstream_model_comparison/splits.csv` | train/val/test固定分割 |
| `検証/results/downstream_model_comparison/model_comparison.csv` | 6モデル比較結果 |
| `検証/results/downstream_model_comparison/predictions.csv` | 各動画ごとの予測値・誤差 |
| `検証/results/downstream_model_comparison/feature_importance.csv` | 重要特徴量 |
| `検証/results/downstream_model_comparison/summary.md` | 自動生成サマリ |
| `検証/results/downstream_model_comparison/excluded_target_outliers.csv` | 除外した異常値 |

## 11. 次アクション

1. 交差検証を追加し、モデル間の小差が安定しているか確認する。
2. `human_total_score=880` の元データを確認し、入力ミスなら修正する。
3. 要確認対象、特に60点未満の件数が少ないため、低評価サンプルを増やして recall を再評価する。
4. 社長報告では、まず「MAE約8.7点」「固定配点より大幅改善」「XGBoostだけが突出ではない」の3点を中心に説明する。
