66 lines
2.9 KiB
Python
66 lines
2.9 KiB
Python
"""Compare fold assignments between v3 PatientFirstSplitManager and v4 SplitManager."""
|
|
import sys
|
|
from pathlib import Path
|
|
from types import SimpleNamespace
|
|
|
|
sys.path.insert(0, str(Path(__file__).resolve().parents[2]))
|
|
|
|
from v3.classes.split_manager import PatientFirstSplitManager
|
|
from v4.classes.split_manager import SplitManager
|
|
from v4.classes.profiles.v4papila import build_data
|
|
|
|
args = {
|
|
"image_dir": "Papila/FundusImages",
|
|
"clinical_dir": "Papila/ClinicalData",
|
|
"label_col": "Diagnosis",
|
|
"iop_corr_method": "ratio",
|
|
"iop_drop_raw": True,
|
|
"exclude_cols": ["Axial_Length"],
|
|
}
|
|
# Resolve relative paths
|
|
root = Path(__file__).resolve().parents[2]
|
|
args["image_dir"] = str(root / args["image_dir"])
|
|
args["clinical_dir"] = str(root / args["clinical_dir"])
|
|
|
|
data = build_data(args)
|
|
|
|
label_col = data.label_col
|
|
patient_col = data.patient_col
|
|
df_mode = data.df[data.df[label_col].isin([0, 1])].reset_index(drop=True)
|
|
|
|
# ── v3 splits ────────────────────────────────────────────────────────────────
|
|
split_mgr_v3 = PatientFirstSplitManager(patient_col=patient_col, label_col=label_col)
|
|
split_args_v3 = SimpleNamespace(eval_mode="binary", n_splits=5, fold_seed=100)
|
|
clinical_ns = SimpleNamespace(df=df_mode, label_col=label_col)
|
|
splits_v3 = split_mgr_v3.build_plans(clinical=clinical_ns, args=split_args_v3, profile=None)
|
|
|
|
# ── v4 splits ────────────────────────────────────────────────────────────────
|
|
splits_v4 = SplitManager(group_col=patient_col).build_plans(
|
|
df_mode, label_col=label_col, n_splits=5, seed=100,
|
|
)
|
|
|
|
# ── Compare ──────────────────────────────────────────────────────────────────
|
|
print(f"{'Fold':<6} {'Set':<6} {'v3 patients':<8} {'v4 patients':<8} {'Match'}")
|
|
print("-" * 50)
|
|
|
|
all_match = True
|
|
for fold in range(5):
|
|
s3, s4 = splits_v3[fold], splits_v4[fold]
|
|
for label, df3, df4 in [
|
|
("train", s3.train, s4.train),
|
|
("val", s3.val, s4.val),
|
|
("test", s3.test, s4.test),
|
|
]:
|
|
ids3 = set(df3[patient_col].unique()) if df3 is not None else set()
|
|
ids4 = set(df4[patient_col].unique()) if df4 is not None else set()
|
|
match = ids3 == ids4
|
|
if not match:
|
|
all_match = False
|
|
print(f"{fold+1:<6} {label:<6} {len(ids3):<8} {len(ids4):<8} {'✓' if match else '✗ DIFF'}")
|
|
if not match:
|
|
print(f" only in v3: {sorted(ids3 - ids4)[:10]}")
|
|
print(f" only in v4: {sorted(ids4 - ids3)[:10]}")
|
|
|
|
print()
|
|
print("All folds match!" if all_match else "SPLITS DIFFER — fold assignments changed.")
|