# -*- coding: utf-8 -*-
"""大外しCSVに一次分類(分類/メモ)をルール+目視知見で自動充填する。
目視確認(805,219,790,833,501ほか)に基づくルール:
- assessable=0          -> 画像では判断不能（パイプラインで撮り直し/要確認へ分岐すべき。後段が約77-80を機械的に当てている）
- assessable=1 & 過大 & visual_density>=12 -> LLM評価ミス（白泡/脂膜/浮いた具材・肉の白さでvisual_densityを過大評価）
- assessable=1 & 過小 & human>=95 & vdens>=12 -> その他（後段回帰の天井効果: predが約92.7で飽和。LLM/教師の誤りではない）
- それ以外 -> その他（要個別確認）
"""
import pandas as pd

def classify(r):
    assessable = r.get('assessable', 1)
    err = r['main_error']
    vd = r.get('visual_density_num')
    try:
        vd = float(vd)
    except (TypeError, ValueError):
        vd = None
    if assessable == 0:
        return '画像では判断不能', '撮り直し推奨相当。後段が判断不能画像に中間スコア(約77-80)を機械的付与→両方向に大外し。パイプラインで分岐すべき構造課題'
    if err > 0 and vd is not None and vd >= 12:
        return 'LLM評価ミス', '白泡/脂膜/浮いた具材・網脂巻き肉の白さでvisual_densityを過大評価(方針書の警告パターン)。プロンプト境界補強候補'
    if err < 0 and r['human_score'] >= 95 and vd is not None and vd >= 12:
        return 'その他', '後段回帰の天井効果(pred約92.7で飽和)。特徴量は最大値だが100に届かず。LLM/教師の誤りではない。優先度低'
    return 'その他', '要個別確認'

for tgt in ['human_total', 'human_soup']:
    path = f'精度改善_20260619/01_error_analysis/large_errors_{tgt}.csv'
    df = pd.read_csv(path, encoding='utf-8-sig')
    res = df.apply(classify, axis=1, result_type='expand')
    df['分類'] = res[0]
    df['メモ'] = res[1]
    df.to_csv(path, index=False, encoding='utf-8-sig')
    print(f'=== {tgt} 一次分類内訳 ===')
    print(df['分類'].value_counts().to_string())
    print()
