From 275e29bde0574abd73db4f793a8fb82838f4668c Mon Sep 17 00:00:00 2001 From: Aner Zakobar Date: Sun, 30 Aug 2026 06:57:52 +0300 Subject: [PATCH] Updated results, hebrew, abstract, intro, etc. --- Main_pages/abstract.tex | 4 +- Main_pages/abstract_heb.tex | 4 +- content/appendixs/appendix_grad_balance.tex | 42 ++++ content/appendixs/appendix_keel_noise.tex | 54 +++++ .../discussion_and_conclusions.tex | 66 +++--- content/experiments/experiments.tex | 213 +++++------------- content/introduction/introduction.tex | 8 +- content/method/figures/roll_aoc_roc.pdf | Bin 0 -> 98728 bytes content/method/figures/roll_aoc_roc.png | Bin 0 -> 54399 bytes content/method/figures/roll_aoc_roc.py | 96 ++++++++ content/method/method.tex | 83 +++---- content/related_work/related_work.tex | 20 +- main.tex | 31 +-- 13 files changed, 353 insertions(+), 268 deletions(-) create mode 100644 content/appendixs/appendix_grad_balance.tex create mode 100644 content/appendixs/appendix_keel_noise.tex create mode 100644 content/method/figures/roll_aoc_roc.pdf create mode 100644 content/method/figures/roll_aoc_roc.png create mode 100644 content/method/figures/roll_aoc_roc.py diff --git a/Main_pages/abstract.tex b/Main_pages/abstract.tex index a1cee89..d27ceee 100644 --- a/Main_pages/abstract.tex +++ b/Main_pages/abstract.tex @@ -29,9 +29,9 @@ Real datasets used to train models are often plagued by label noise, where a fraction of training labels are incorrect. Standard per-sample losses such as binary cross-entropy are sensitive to mislabeled examples and optimize per-sample accuracy rather than ranking quality, making them misaligned with the Area Under the ROC Curve (AUC), the standard metric for imbalanced classification. Noise-robust losses (GCE, MAE) address the sensitivity problem but remain per-sample and inherit the same metric mismatch. Existing AUC-maximizing methods improve on this by directly targeting ranking quality, but rely on pairwise surrogate losses that optimize for AUC indirectly. -In this work we introduce \textsc{ROLL} (Rate Optimized Likelihood Loss), a framework for differentiable ROC-curve optimization via output score distribution fitting. The primary instantiation, \textsc{ROLL}-AoC, approximates AUC as the mean TPR sampled across a range of FPR thresholds. This loss utilizes a Kernel Density Estimation to approximate the distribution of output scores at each epoch, and optimizes it directly via gradient descent with a custom backward pass. Although noise robustness is not an explicit design objective, \textsc{ROLL}-AoC exhibits strong implicit resistance to label noise. +In this work we introduce \textsc{ROLL} (Rate Optimized Likelihood Loss), a framework for differentiable ROC-curve optimization via output score distribution fitting. The primary instantiation, \textsc{ROLL}-AOC, approximates AUC as the mean TPR sampled across a range of FPR thresholds. This loss utilizes a Kernel Density Estimation to approximate the distribution of output scores at each epoch, and optimizes it directly via gradient descent with a custom backward pass. Although noise robustness is not an explicit design objective, \textsc{ROLL}-AOC exhibits strong implicit resistance to label noise. -We evaluate on twelve KEEL benchmark datasets under label noise, CIFAR-10N under real crowdworker annotation noise, three large-scale tabular datasets, and NIH ChestX-ray14 with organic NLP-extracted label noise. Across all benchmarks, \textsc{ROLL}-AoC is competitive under clean labels and leads under high noise rates, outperforming dedicated noise-robust losses. +We evaluate on twelve KEEL benchmark datasets under label noise, CIFAR-10N under real crowdworker annotation noise, three large-scale tabular datasets, and NIH ChestX-ray14 with organic NLP-extracted label noise. Across all benchmarks, \textsc{ROLL}-AOC is competitive under clean labels and leads under high noise rates, outperforming dedicated noise-robust losses. diff --git a/Main_pages/abstract_heb.tex b/Main_pages/abstract_heb.tex index 23df96a..6d49e8d 100644 --- a/Main_pages/abstract_heb.tex +++ b/Main_pages/abstract_heb.tex @@ -31,8 +31,8 @@ מערכי נתונים אמיתיים המשמשים לאימון מודלים סובלים לעיתים קרובות מרעש תוויות, שבו חלק מתוויות האימון שגויות. פונקציות הפסד סטנדרטיות המחושבות לכל דגימה בנפרד, כגון binary cross-entropy, רגישות לדגימות המתויגות באופן שגוי. הן נוטות לטייב את המודל כאשר כל דגימה נלקחת בנפרדת, במקום לטייב את דיגורן ככלל, מה שמנתק אותן מהמדד הרצוי, שטח מתחת לעקומת ROC‏ (AUC), המדד הסטנדרטי לסיווג. פונקציות הפסד עמידות לרעש (GCE ,MAE) מטפלות ברגישות זו, אך נותרות מחושבות לדגימה בודדת ויורשות את אותו פער במדד. שיטות קיימות לאופטימיזציה של AUC משפרות זאת על ידי כיוון לאיכות דירוג, אך מסתמכות על פונקציות הפסד-תחליף זוגיות ומטייבות את AUC באופן עקיף. -בעבודה זו אנו מציגים את \textenglish{\textsc{ROLL}} ‏(Rate Optimized Likelihood Loss), מסגרת לאופטימיזציה דיפרנציאבילית של עקומת ROC באמצעות התאמת התפלגות ציוני הפלט של המודל. המימוש העיקרי, \textenglish{\textsc{ROLL}-AoC}, מקרב את AUC כממוצע TPR הנדגם על פני טווח ערכי FPR. פונקציית הפסד זו משתמשת \textenglish{Kernel Density Estimation (KDE)} לקירוב התפלגות ציוני הפלט בכל שלב אימון, ומטייבת עבורה באופן ישיר. למרות שעמידות לרעש אינה מטרת עיצוב מפורשת, \textenglish{\textsc{ROLL}-AoC} מפגין עמידות משמעותית ומובהקת לרעש תוויות. +בעבודה זו אנו מציגים את \textenglish{\textsc{ROLL}} ‏(Rate Optimized Likelihood Loss), מסגרת לאופטימיזציה דיפרנציאבילית של עקומת ROC באמצעות התאמת התפלגות ציוני הפלט של המודל. המימוש העיקרי, \textenglish{\textsc{ROLL}-AOC}, מקרב את AUC כממוצע TPR הנדגם על פני טווח ערכי FPR. פונקציית הפסד זו משתמשת \textenglish{Kernel Density Estimation (KDE)} לקירוב התפלגות ציוני הפלט בכל שלב אימון, ומטייבת עבורה באופן ישיר. למרות שעמידות לרעש אינה מטרת עיצוב מפורשת, \textenglish{\textsc{ROLL}-AOC} מפגין עמידות משמעותית ומובהקת לרעש תוויות. -אנו מעריכים את השיטה על שנים-עשר מערכי נתונים מהאוסף KEEL תחת רעש תוויות, CIFAR-10N תחת רעש אנוטציה אנושי אמיתי, שלושה מערכי נתונים טבלאיים בקנה מידה גדול, ו-NIH ChestX-ray14 עם רעש תוויות אורגני שנוצר על ידי אלגוריתם עיבוד שפה טבעית. על פני כלל הבנצ'מרקים, \textenglish{\textsc{ROLL}-AoC} תחרותי בנתונים נקיים ומוביל בשיעורי רעש גבוהים, ועולה על פונקציות הפסד ייעודיות עמידות לרעש. +אנו מעריכים את השיטה על שנים-עשר מערכי נתונים מהאוסף KEEL תחת רעש תוויות, CIFAR-10N תחת רעש אנוטציה אנושי אמיתי, שלושה מערכי נתונים טבלאיים בקנה מידה גדול, ו-NIH ChestX-ray14 עם רעש תוויות אורגני שנוצר על ידי אלגוריתם עיבוד שפה טבעית. על פני כלל הבנצ'מרקים, \textenglish{\textsc{ROLL}-AOC} תחרותי בנתונים נקיים ומוביל בשיעורי רעש גבוהים, ועולה על פונקציות הפסד ייעודיות עמידות לרעש. \selectlanguage{english} diff --git a/content/appendixs/appendix_grad_balance.tex b/content/appendixs/appendix_grad_balance.tex new file mode 100644 index 0000000..0c72e50 --- /dev/null +++ b/content/appendixs/appendix_grad_balance.tex @@ -0,0 +1,42 @@ +This appendix gives the full proof of \Cref{prop:gradient-balance}. + +\begin{proof} +We treat each class separately via a uniform-shift argument. + +\medskip\noindent\textit{Sum over $\mathcal{B}_0$.} +From \Cref{eq:roll-gradient}, for $y_i = 0$: +\[ + \frac{\partial \mathcal{L}}{\partial f_\theta(\mathbf{x}_i)} + = \frac{\partial \hat{F}_1(\tau)}{\partial \tau} + \cdot \frac{\partial \tau}{\partial f_\theta(\mathbf{x}_i)} +\] +We claim $\sum_{\mathbf{x}_i \in \mathcal{B}_0}\frac{\partial \tau}{\partial f_\theta(\mathbf{x}_i)} = 1$. +Shift all negative scores uniformly: $f_\theta(\mathbf{x}_i) \to f_\theta(\mathbf{x}_i) + \delta$ for +$\mathbf{x}_i \in \mathcal{B}_0$. By translation invariance, $\hat{F}_0$ simply translates, so +$\tau = \hat{F}_0^{-1}(1-\alpha)$ shifts by exactly $\delta$. Differentiating with respect to $\delta$ at +$\delta = 0$: +\[ + 1 = \frac{\mathrm{d}\tau}{\mathrm{d}\delta}\bigg|_{\delta=0} + = \sum_{\mathbf{x}_i \in \mathcal{B}_0} \frac{\partial \tau}{\partial f_\theta(\mathbf{x}_i)} +\] +Summing the $y_i = 0$ gradients therefore gives: +\begin{equation} + \sum_{\mathbf{x}_i \in \mathcal{B}_0} + \frac{\partial \mathcal{L}}{\partial f_\theta(\mathbf{x}_i)} + = \frac{\partial \hat{F}_1(\tau)}{\partial \tau} \cdot 1 + = \frac{\partial \hat{F}_1(\tau)}{\partial \tau} + \label{eq:grad-balance-b0} +\end{equation} + +\medskip\noindent\textit{Sum over $\mathcal{B}_1$.} +For $y_i = 1$, $\frac{\partial \mathcal{L}}{\partial f_\theta(\mathbf{x}_i)} = \frac{\partial \hat{F}_1(\tau)}{\partial f_\theta(\mathbf{x}_i)}$. +Shifting all positive scores by $\delta$ and applying translation invariance of $\hat{F}_1$: +$\hat{F}_1(\tau\,;\,\mathbf{s}+\delta\mathbf{1}) = \hat{F}_1(\tau-\delta\,;\,\mathbf{s})$. +Differentiating at $\delta = 0$: +\[ + \sum_{\mathbf{x}_i \in \mathcal{B}_1} + \frac{\partial \hat{F}_1(\tau)}{\partial f_\theta(\mathbf{x}_i)} + = -\frac{\partial \hat{F}_1(\tau)}{\partial \tau} +\] +Combining with \eqref{eq:grad-balance-b0} gives \eqref{eq:grad-balance}. +\end{proof} diff --git a/content/appendixs/appendix_keel_noise.tex b/content/appendixs/appendix_keel_noise.tex new file mode 100644 index 0000000..16a2af0 --- /dev/null +++ b/content/appendixs/appendix_keel_noise.tex @@ -0,0 +1,54 @@ +The tables below report mean test AUC at $\varepsilon = 5\%$ and $\varepsilon = 10\%$ asymmetric label noise on the KEEL benchmark. +Results at $\varepsilon = 20\%$ noise, where differentiation between methods is strongest, are discussed and tabled in the main text (\Cref{sec:results:keel}). + +\begin{table}[htbp] +\centering +\caption{Mean test AUC ($\pm$\,std, $n=10$ episodes) on KEEL datasets at $\epsilon=5\%$ asymmetric label noise. Best per row in \textbf{bold}.} +\label{tab:results:keel-noise-05} +\resizebox{\textwidth}{!}{% +\begin{tabular}{lccccccc} +\toprule +Dataset & \textsc{Roll}-AOC & BCE-W & Focal & Asym. & GCE & LibAUC & MAE \\ +\midrule +Glass0 & 0.797{\tiny{$\pm$0.046}} & 0.786{\tiny{$\pm$0.019}} & \textbf{0.806{\tiny{$\pm$0.030}}} & 0.792{\tiny{$\pm$0.041}} & 0.794{\tiny{$\pm$0.029}} & 0.791{\tiny{$\pm$0.056}} & 0.792{\tiny{$\pm$0.058}} \\ +Glass1 & 0.728{\tiny{$\pm$0.037}} & 0.736{\tiny{$\pm$0.032}} & 0.730{\tiny{$\pm$0.074}} & 0.704{\tiny{$\pm$0.028}} & 0.717{\tiny{$\pm$0.059}} & 0.694{\tiny{$\pm$0.060}} & \textbf{0.738{\tiny{$\pm$0.047}}} \\ +Glass2 & 0.677{\tiny{$\pm$0.095}} & 0.665{\tiny{$\pm$0.128}} & 0.581{\tiny{$\pm$0.091}} & 0.662{\tiny{$\pm$0.050}} & 0.651{\tiny{$\pm$0.078}} & 0.614{\tiny{$\pm$0.085}} & \textbf{0.686{\tiny{$\pm$0.091}}} \\ +Glass6 & 0.972{\tiny{$\pm$0.021}} & 0.972{\tiny{$\pm$0.035}} & 0.978{\tiny{$\pm$0.016}} & \textbf{0.981{\tiny{$\pm$0.016}}} & 0.947{\tiny{$\pm$0.049}} & 0.967{\tiny{$\pm$0.036}} & 0.971{\tiny{$\pm$0.031}} \\ +Haberman & 0.666{\tiny{$\pm$0.094}} & 0.627{\tiny{$\pm$0.124}} & 0.694{\tiny{$\pm$0.111}} & 0.693{\tiny{$\pm$0.065}} & 0.687{\tiny{$\pm$0.099}} & 0.651{\tiny{$\pm$0.125}} & \textbf{0.716{\tiny{$\pm$0.055}}} \\ +Iris0 & 0.990{\tiny{$\pm$0.014}} & 0.998{\tiny{$\pm$0.006}} & 0.999{\tiny{$\pm$0.002}} & 0.999{\tiny{$\pm$0.002}} & \textbf{1.000{\tiny{$\pm$0.000}}} & \textbf{1.000{\tiny{$\pm$0.000}}} & 0.999{\tiny{$\pm$0.003}} \\ +New-Thyroid1 & 0.984{\tiny{$\pm$0.010}} & 0.986{\tiny{$\pm$0.007}} & 0.971{\tiny{$\pm$0.046}} & 0.989{\tiny{$\pm$0.006}} & 0.987{\tiny{$\pm$0.019}} & 0.983{\tiny{$\pm$0.023}} & \textbf{0.991{\tiny{$\pm$0.012}}} \\ +Pima & 0.780{\tiny{$\pm$0.021}} & 0.784{\tiny{$\pm$0.016}} & 0.780{\tiny{$\pm$0.019}} & 0.767{\tiny{$\pm$0.023}} & \textbf{0.787{\tiny{$\pm$0.011}}} & 0.756{\tiny{$\pm$0.023}} & 0.775{\tiny{$\pm$0.023}} \\ +Vehicle2 & 0.975{\tiny{$\pm$0.007}} & \textbf{0.977{\tiny{$\pm$0.006}}} & 0.974{\tiny{$\pm$0.010}} & 0.969{\tiny{$\pm$0.016}} & 0.976{\tiny{$\pm$0.007}} & 0.975{\tiny{$\pm$0.008}} & 0.976{\tiny{$\pm$0.009}} \\ +Vowel0 & 0.988{\tiny{$\pm$0.012}} & 0.981{\tiny{$\pm$0.019}} & 0.989{\tiny{$\pm$0.017}} & \textbf{0.991{\tiny{$\pm$0.006}}} & 0.985{\tiny{$\pm$0.014}} & 0.973{\tiny{$\pm$0.025}} & 0.978{\tiny{$\pm$0.014}} \\ +Wisconsin & 0.998{\tiny{$\pm$0.002}} & 0.998{\tiny{$\pm$0.001}} & \textbf{0.999{\tiny{$\pm$0.001}}} & \textbf{0.999{\tiny{$\pm$0.001}}} & 0.998{\tiny{$\pm$0.001}} & 0.998{\tiny{$\pm$0.001}} & 0.998{\tiny{$\pm$0.001}} \\ +Yeast3 & 0.900{\tiny{$\pm$0.020}} & 0.914{\tiny{$\pm$0.028}} & 0.915{\tiny{$\pm$0.034}} & \textbf{0.916{\tiny{$\pm$0.026}}} & \textbf{0.916{\tiny{$\pm$0.032}}} & 0.908{\tiny{$\pm$0.029}} & 0.909{\tiny{$\pm$0.024}} \\ +\bottomrule +\end{tabular}% +} +\end{table} + +\begin{table}[htbp] +\centering +\caption{Mean test AUC ($\pm$\,std, $n=10$ episodes) on KEEL datasets at $\epsilon=10\%$ asymmetric label noise. Best per row in \textbf{bold}.} +\label{tab:results:keel-noise-10} +\resizebox{\textwidth}{!}{% +\begin{tabular}{lccccccc} +\toprule +Dataset & \textsc{Roll}-AOC & BCE-W & Focal & Asym. & GCE & LibAUC & MAE \\ +\midrule +Glass0 & 0.773{\tiny{$\pm$0.070}} & 0.789{\tiny{$\pm$0.037}} & 0.771{\tiny{$\pm$0.037}} & \textbf{0.821{\tiny{$\pm$0.026}}} & 0.786{\tiny{$\pm$0.057}} & 0.800{\tiny{$\pm$0.032}} & 0.807{\tiny{$\pm$0.050}} \\ +Glass1 & 0.719{\tiny{$\pm$0.040}} & 0.716{\tiny{$\pm$0.079}} & 0.718{\tiny{$\pm$0.056}} & 0.710{\tiny{$\pm$0.049}} & 0.729{\tiny{$\pm$0.048}} & 0.675{\tiny{$\pm$0.070}} & \textbf{0.738{\tiny{$\pm$0.060}}} \\ +Glass2 & 0.695{\tiny{$\pm$0.075}} & 0.644{\tiny{$\pm$0.072}} & 0.687{\tiny{$\pm$0.127}} & 0.655{\tiny{$\pm$0.048}} & \textbf{0.713{\tiny{$\pm$0.107}}} & 0.637{\tiny{$\pm$0.093}} & 0.673{\tiny{$\pm$0.111}} \\ +Glass6 & 0.947{\tiny{$\pm$0.050}} & \textbf{0.973{\tiny{$\pm$0.026}}} & 0.950{\tiny{$\pm$0.041}} & 0.971{\tiny{$\pm$0.024}} & 0.938{\tiny{$\pm$0.047}} & 0.937{\tiny{$\pm$0.048}} & 0.935{\tiny{$\pm$0.054}} \\ +Haberman & 0.638{\tiny{$\pm$0.098}} & 0.700{\tiny{$\pm$0.074}} & 0.652{\tiny{$\pm$0.106}} & 0.658{\tiny{$\pm$0.087}} & 0.636{\tiny{$\pm$0.112}} & 0.694{\tiny{$\pm$0.129}} & \textbf{0.732{\tiny{$\pm$0.022}}} \\ +Iris0 & 0.991{\tiny{$\pm$0.020}} & 0.950{\tiny{$\pm$0.158}} & 0.950{\tiny{$\pm$0.158}} & \textbf{1.000{\tiny{$\pm$0.000}}} & \textbf{1.000{\tiny{$\pm$0.001}}} & \textbf{1.000{\tiny{$\pm$0.000}}} & \textbf{1.000{\tiny{$\pm$0.000}}} \\ +New-Thyroid1 & 0.986{\tiny{$\pm$0.011}} & 0.980{\tiny{$\pm$0.024}} & 0.987{\tiny{$\pm$0.012}} & \textbf{0.991{\tiny{$\pm$0.013}}} & 0.986{\tiny{$\pm$0.019}} & 0.973{\tiny{$\pm$0.049}} & 0.986{\tiny{$\pm$0.013}} \\ +Pima & 0.756{\tiny{$\pm$0.026}} & 0.760{\tiny{$\pm$0.024}} & 0.767{\tiny{$\pm$0.023}} & \textbf{0.780{\tiny{$\pm$0.013}}} & 0.761{\tiny{$\pm$0.030}} & 0.757{\tiny{$\pm$0.032}} & 0.754{\tiny{$\pm$0.032}} \\ +Vehicle2 & 0.967{\tiny{$\pm$0.015}} & 0.964{\tiny{$\pm$0.016}} & 0.962{\tiny{$\pm$0.020}} & 0.962{\tiny{$\pm$0.017}} & 0.965{\tiny{$\pm$0.009}} & 0.953{\tiny{$\pm$0.022}} & \textbf{0.970{\tiny{$\pm$0.010}}} \\ +Vowel0 & \textbf{0.985{\tiny{$\pm$0.011}}} & \textbf{0.984{\tiny{$\pm$0.016}}} & 0.979{\tiny{$\pm$0.025}} & 0.975{\tiny{$\pm$0.022}} & 0.977{\tiny{$\pm$0.024}} & 0.959{\tiny{$\pm$0.035}} & 0.946{\tiny{$\pm$0.039}} \\ +Wisconsin & 0.996{\tiny{$\pm$0.001}} & 0.996{\tiny{$\pm$0.004}} & 0.997{\tiny{$\pm$0.003}} & 0.997{\tiny{$\pm$0.003}} & \textbf{0.998{\tiny{$\pm$0.001}}} & 0.996{\tiny{$\pm$0.004}} & \textbf{0.998{\tiny{$\pm$0.001}}} \\ +Yeast3 & 0.895{\tiny{$\pm$0.034}} & 0.891{\tiny{$\pm$0.054}} & 0.868{\tiny{$\pm$0.069}} & \textbf{0.915{\tiny{$\pm$0.030}}} & 0.891{\tiny{$\pm$0.029}} & 0.872{\tiny{$\pm$0.040}} & 0.857{\tiny{$\pm$0.059}} \\ +\bottomrule +\end{tabular}% +} +\end{table} diff --git a/content/discussion_and_conclusions/discussion_and_conclusions.tex b/content/discussion_and_conclusions/discussion_and_conclusions.tex index 7dd0799..02cff2f 100644 --- a/content/discussion_and_conclusions/discussion_and_conclusions.tex +++ b/content/discussion_and_conclusions/discussion_and_conclusions.tex @@ -3,7 +3,7 @@ \label{sec:discussion} \addcontentsline{tocheb}{section}{\protect\numberline{\secnumforhebrewtoc}{דיון}} -\subsection{Noise Robustness of \textsc{Roll}-AoC} +\subsection{Noise Robustness of \textsc{Roll}-AOC} \label{sec:discussion:noise} \addcontentsline{tocheb}{subsection}{\protect\numberline{\subsecnumforhebrewtoc}{עמידות לרעש של ROLL-AOC}} @@ -23,7 +23,7 @@ % strengthening the hypothesis that this is a property of the objective rather than an artifact % of a specific dataset. -The data shows that \textsc{Roll}-AoC is a loss robust to label noise. In KEEL, we see that under the heaviest noise rate, \textsc{Roll}-AoC degrades least. In CiFAR10n, \textsc{Roll}-AoC suffers the least as label noise gets worse. Across other large datasets, \textsc{Roll}-AoC shows to be either competitive or leading. The experiments used a wide variety of data, both tabular and image-based, with varying levels of noise. +The data shows that \textsc{Roll}-AOC is a loss robust to label noise. In KEEL, we see that under the heaviest noise rate, \textsc{Roll}-AOC degrades least. In CIFAR-10N, \textsc{Roll}-AOC suffers the least as label noise gets worse. Across other large datasets, \textsc{Roll}-AOC shows to be either competitive or leading. The experiments used a wide variety of data, both tabular and image-based, with varying levels of noise. Having the ability to optimize the desired metric (AUC) directly, rather than in a round about way, allows our method to overcome challenging data. When using a per-sample loss, optimizing for a mislabeled sample @@ -39,17 +39,17 @@ from NLP-extracted labels). The same advantage appearing across tabular data, na images strengthens the case that noise robustness is a structural property of the distributional objective, rather than an artifact of any particular dataset or noise type. -\subsection{\textsc{ROLL}-AoC Versus \textsc{GCE} and \textsc{MAE}} +\subsection{\textsc{ROLL}-AOC Versus \textsc{GCE} and \textsc{MAE}} \label{sec:discussion:gce-mae} \addcontentsline{tocheb}{subsection}{\protect\numberline{\subsecnumforhebrewtoc}{ROLL-AOC מול GCE ו-MAE}} \textsc{GCE} and \textsc{MAE} are used specifically for their robustness to noise, yet under 20\% -asymmetric noise on KEEL both degrade more than \textsc{Roll}-AoC (\textsc{GCE}: $-0.056$, -\textsc{MAE}: $-0.071$, \textsc{Roll}-AoC: $-0.033$). Whether this reflects a need for domain-specific -re-calibration or a fundamental limitation of per-sample objectives under label noise, \textsc{Roll}-AoC +asymmetric noise on KEEL both degrade more than \textsc{Roll}-AOC (\textsc{GCE}: $-0.056$, +\textsc{MAE}: $-0.071$, \textsc{Roll}-AOC: $-0.033$). Whether this reflects a need for domain-specific +re-calibration or a fundamental limitation of per-sample objectives under label noise, \textsc{Roll}-AOC overcomes these challenges without any noise-specific adjustment. -\subsection{\textsc{Roll}-AoC Versus \textsc{LibAUC}: Stability Under Noise} +\subsection{\textsc{Roll}-AOC Versus \textsc{LibAUC}: Stability Under Noise} \label{sec:discussion:libauc} \addcontentsline{tocheb}{subsection}{\protect\numberline{\subsecnumforhebrewtoc}{ROLL-AOC מול LibAUC: יציבות תחת רעש}} @@ -66,26 +66,26 @@ overcomes these challenges without any noise-specific adjustment. % Frame as a practical stability advantage: in noisy or heterogeneous settings, % PESG-based optimization may be brittle in ways that a standard Adam + KDE loss is not. -While \textsc{Roll}-AoC shows improvement over per-sample losses on noisy datasets, it also shows -better performance than our LibAUC baseline, which also optimizes for the same metric directly. +While \textsc{Roll}-AOC shows improvement over per-sample losses on noisy datasets, it also outperforms +our LibAUC baseline, which also optimizes for AUC directly. -This improvement could be explained by \textsc{Roll}-AoC better tracking the real AUC value. -LibAUC's loss uses an imperfect surrogate loss. The AUC metric itself can only be acheived -exactly when using a stepwise function instead of the pairwise surrogate loss, which is impossible to use. -The surrogate losses used is the squared pairwise surrogate loss given: +This advantage can be explained by how closely each method's loss value tracks the actual AUC. +LibAUC replaces the intractable pairwise indicator $\mathbf{1}[f(x^+) > f(x^-)]$ with a squared surrogate: +\[ + \ell(f(x^+), f(x^-)) = \bigl(1 - f(x^+) + f(x^-)\bigr)^2 +\] +The squared surrogate and the indicator it replaces follow fundamentally different patterns: the squared +loss is sensitive to the magnitude of score differences, not only to their sign. As a result, the aggregate +loss value gives little information about the AUC actually achieved --- a model with large score margins +on easy pairs can have a low surrogate loss yet mediocre ranking quality on hard pairs. -$$\ell(f(x^+), f(x^-)) = \bigl(1 - f(x^+) + f(x^-)\bigr)^2$$ - -While this helps the math simplify in order to reduce the computation, the connection to the -actual AUC value is lost, and so the metric isn't directly optimized for. - -\text{Roll}-AoC does not exactly estimate AUC either, yet the error is limited. As long as the bandwidth -is estimated properly, and the AUC is sampled at enough rates, one can expect a value very close to the real -AUC. These two pre-conditions are non-trivial to acheive, yet hold well enough for the experiments done as -part of this work. - -This better tracking presents two benefits. Firstly, the gradients themselves are weighted in a more-exact way, -helping our model converge towards better performance. Secondly, it presents itself in best-epoch selection. Our training process takes the model with the lowest loss. Considering our loss tracks the real AUC better (to be exact, it tracks the area over the curve which complements AUC), this allows our best model selection to be more exact. +\textsc{Roll}-AOC does not track AUC exactly either, but its error is bounded. The loss is the numerical +integral of $1 - \operatorname{TPR}(\alpha)$ over 99 FPR grid points, directly approximating the area +over the ROC curve ($\mathrm{AOC} = 1 - \mathrm{AUC}$). As long as the KDE bandwidth is well-estimated +and 99 thresholds provide sufficient coverage, the loss value stays close to the true AOC. +The practical consequence is twofold: gradient weighting is more accurately aligned with ranking quality, +and best-epoch model selection --- which picks the epoch with the lowest loss --- selects the epoch with +the highest estimated AUC rather than the lowest surrogate value. \subsection{Failure of the Single-Threshold Variant (\textsc{Roll}-TPR)} \label{sec:discussion:roll-tpr} @@ -118,7 +118,7 @@ of its score space, which exacerbated already existing overfitting issues and ma to random initialization. On datasets such as Wisconsin and New-Thyroid1, this manifested as extreme run-to-run variance ($\pm 0.441$ and $\pm 0.241$ AUC respectively under clean labels), where the outcome was determined more by initialization than by the optimization itself. -This stands in direct contrast to \textsc{Roll}-AoC: as noted in \Cref{rem:aoc-coverage}, the 99 +This stands in direct contrast to \textsc{Roll}-AOC: as noted in \Cref{rem:aoc-coverage}, the 99 simultaneously active thresholds spread gradient coverage across the full score range, making convergence far more robust to initialization. @@ -175,7 +175,7 @@ can perform poorly wherever the score distribution exhibits multiple scales of v The number of FPR thresholds evaluated per forward pass is itself a trade-off. More thresholds yield a finer approximation of the ROC curve and, as noted in \Cref{rem:aoc-coverage}, denser gradient coverage -across the score space --- both of which contribute to the robustness of \textsc{Roll}-AoC. Fewer +across the score space --- both of which contribute to the robustness of \textsc{Roll}-AOC. Fewer thresholds reduce training cost proportionally but produce a coarser AUC estimate and sparser gradient signal. Each threshold evaluation requires a KDE CDF query and a bisection inversion, each $O(n)$ in the batch size, making the total per-batch cost $O(kn)$ where $k$ is the number of thresholds. In the @@ -208,13 +208,13 @@ straightforward mitigation that has not yet been explored. In this work, we present \textsc{ROLL} as a general framework for differentiable, ROC-based optimization via parametric score distribution fitting. As the primary instantiation, we develop the KDE-based variant -and provide its full forward pass and gradient derivations. \textsc{ROLL}-AoC directly integrates the +and provide its full forward pass and gradient derivations. \textsc{ROLL}-AOC directly integrates the estimated ROC curve over 99 evenly-spaced FPR thresholds --- a fundamentally different approach from \textsc{LibAUC}'s pairwise formulation, which optimizes a squared surrogate over score pairs rather than the curve itself. -We evaluated \textsc{ROLL}-AoC against losses designed for noise robustness and class imbalance. Across -datasets spanning tabular and image data with varying noise types and rates, we show that \textsc{ROLL}-AoC +We evaluated \textsc{ROLL}-AOC against losses designed for noise robustness and class imbalance. Across +datasets spanning tabular and image data with varying noise types and rates, we show that \textsc{ROLL}-AOC handles these challenges competitively, often leading, despite noise robustness not being an explicit design objective. @@ -222,9 +222,9 @@ design objective. \label{sec:conclusions:limitations} \addcontentsline{tocheb}{subsection}{\protect\numberline{\subsecnumforhebrewtoc}{מגבלות}} -\textsc{Roll}-AoC has several practical limitations worth noting. +\textsc{Roll}-AOC has several practical limitations worth noting. The KDE instantiation uses a single bandwidth per class, which cannot accurately represent multimodal or heavy-tailed score distributions. -Computational cost is significant: evaluating 99 FPR thresholds per forward pass makes \textsc{Roll}-AoC considerably more expensive per training step than per-sample losses or \textsc{LibAUC}'s pairwise formulation. +Computational cost is significant: evaluating 99 FPR thresholds per forward pass makes \textsc{Roll}-AOC considerably more expensive per training step than per-sample losses or \textsc{LibAUC}'s pairwise formulation. The single-threshold variant (\textsc{Roll}-TPR) is brittle in practice; gradient locality concentrates updates near one operating point and the benefit rarely transfers to held-out data. Finally, the framework currently lacks formal convergence guarantees; the empirical results are encouraging but not theoretically grounded. @@ -242,4 +242,4 @@ Variable-bandwidth (adaptive) KDE methods address the single-bandwidth limitatio Formal convergence guarantees for KDE-ROLL under standard assumptions (batch size, bandwidth decay schedule, smoothness) remain an open problem, and would also clarify how the bandwidth scheduler interacts with gradient variance across training. \paragraph{Partial and weighted AUC.} -Restricting or reweighting the FPR grid to emphasize specific operating regions is a straightforward modification to \textsc{Roll}-AoC, and a natural fit for settings such as medical imaging where only a narrow FPR range is clinically actionable. +Restricting or reweighting the FPR grid to emphasize specific operating regions is a straightforward modification to \textsc{Roll}-AOC, and a natural fit for settings such as medical imaging where only a narrow FPR range is clinically actionable. diff --git a/content/experiments/experiments.tex b/content/experiments/experiments.tex index a21bb6d..3ac0c34 100644 --- a/content/experiments/experiments.tex +++ b/content/experiments/experiments.tex @@ -31,15 +31,15 @@ Yeast3 & 1484 & 163 &1321 & 8.1 & Yeast protein localisation (UCI) \\ \end{table} \paragraph{CIFAR-10N.} -CIFAR-10 is a widely used image dataset of 60{,}000 32x32 color images belonging to 10 mutuall exclusive classes. CIFAR-10N~\cite{wei2022cifar10n} augments the 50{,}000 training set labels with real human-annotated noisy labels collected from Amazon Mechanical Turk~\cite{wei2022cifar10n}. We form a binary task (class~1, automobile, vs.\ rest; IR~$\approx 9$:1) and train under three noise conditions: +CIFAR-10 is a widely used image dataset of 60{,}000 32x32 color images belonging to 10 mutually exclusive classes. CIFAR-10N~\cite{wei2022cifar10n} augments the 50{,}000 training set labels with real human-annotated noisy labels collected from Amazon Mechanical Turk~\cite{wei2022cifar10n}. We form a binary task (class~1, automobile, vs.\ rest; IR~$\approx 9$:1) and train under three noise conditions: \emph{clean} (original CIFAR-10 labels, 0\% noise), \emph{aggre} (majority-vote aggregate of crowdworker annotations, $\approx$9\% noise), and \emph{worse} (single worst-annotator labels, $\approx$40\% noise). -This allows us to measure the degredation of the model's performance under increasing label noise conditions. +This allows us to measure the degradation of the model's performance under increasing label noise conditions. The architecture tested is a three-block convolutional network trained from scratch. -\paragraph{Large tabular datasets.} -We include three large-scale tabular datasets spanning diverse imbalanced real-world settings. +\paragraph{Large datasets.} +We include four large-scale datasets spanning diverse imbalanced real-world settings. \begin{itemize} \item \textbf{Bank Marketing}~\cite{moro2014bank}, UCI repository; Portuguese bank telephone marketing campaigns (Moro et al., 2014). $n = 41{,}188$ samples, 48 features after one-hot encoding. Positive class: client subscribed to term deposit. IR~$\approx 8$:1 ($\approx$11.3\% positive). No label noise. @@ -47,13 +47,10 @@ We include three large-scale tabular datasets spanning diverse imbalanced real-w \item \textbf{Credit Card Fraud}~\cite{dalpozzolo2015calibrating}, Kaggle / ULB (Worldline + MLG, 2013). $n = 284{,}807$ transactions, 30 features (V1--V28 are PCA-transformed; Time and Amount rescaled). Extreme imbalance: 492 confirmed frauds, IR~$\approx 577$:1. Labels reflect confirmed-fraud reports; undetected fraudulent transactions constitute a structural source of class-conditional false negatives~\cite{tittelfitz2023fpr}. \item \textbf{Home Credit}~\cite{homecredit2018kaggle}, Kaggle Home Credit Default Risk competition (2018). $n = 307{,}511$ loan applications, $\approx$120 numerical features from the primary application table. Positive class: loan default. IR~$\approx 11.4$:1 ($\approx$8\% default rate). Labels are proxy labels (repayment outcome); no injected noise. + + \item \textbf{NIH ChestX-ray14}~\cite{wang2017chestxray14}, a large-scale medical chest radiograph dataset of $112{,}120$ X-rays from $30{,}805$ patients annotated with 14 pathology labels. Labels were extracted from radiological reports via NLP; the dataset authors estimate accuracy at $>$90\%~\cite{wang2017chestxray14}, though subsequent audits have found the true error rate substantially higher~\cite{oakdenrayner2020exploring}, making this a naturally noisy benchmark. We form a binary task targeting \emph{pleural effusion} detection (Effusion vs.\ rest; IR~$\approx 7.5$:1). Unlike the other three datasets, inputs here are not raw tabular features: we extract $1{,}024$-dimensional latent representations using a \mbox{DenseNet-121} pretrained on the dataset via the TorchXRayVision library~\cite{cohen2022torchxrayvision}, with global average pooling applied to the penultimate feature map, and pass these frozen embeddings to a lightweight $1024{\to}512{\to}128{\to}1$ MLP with dropout. This transfer-learning setup lets us evaluate ROLL without GPU-intensive end-to-end training. \end{itemize} -\paragraph{NIH ChestX-ray14.} -NIH ChestX-ray14~\cite{wang2017chestxray14} is a large-scale medical chest radiograph dataset of $112{,}120$ X-rays from $30{,}805$ patients, annotated with 14 unique labels. Labels were extracted from radiological reports via natural language processing; the dataset authors estimate labelling accuracy at $>$90\%~\cite{wang2017chestxray14}, though subsequent audits have found the true error rate substantially higher, with positive predictive values 10--30 percentage points below the reported figures~\cite{oakdenrayner2020exploring}, making this a naturally noisy benchmark. We form a binary task targeting \emph{pleural effusion} detection (Effusion vs.\ rest; IR~$\approx 7.5$:1). - -We extract $1{,}024$-dimensional latent representations using a \mbox{DenseNet-121} pretrained on the dataset via the TorchXRayVision library~\cite{cohen2022torchxrayvision}, with global average pooling applied to the penultimate feature map. These frozen embeddings are passed to a lightweight $1024{\to}512{\to}128{\to}1$ MLP with dropout, treating image representations as tabular features. This setup evaluates ROLL in a transfer-learning scenario and avoids GPU-intensive end-to-end training. - \section{Performance Measures}\label{sec:experiments:performance_measures} \addcontentsline{tocheb}{section}{\protect\numberline{\secnumforhebrewtoc}{מדדי ביצועים}} @@ -63,7 +60,7 @@ We report the \emph{area under the ROC curve} (AUC) averaged over independent tr \label{sec:experiments:configurations} \addcontentsline{tocheb}{section}{\protect\numberline{\secnumforhebrewtoc}{קונפיגורציה ופרמטרים}} -We compare \textsc{Roll}-AoC (the primary proposed loss, optimising the area under the ROC curve via KDE) against the following baselines: +We compare \textsc{Roll}-AOC (the primary proposed loss, optimising the area under the ROC curve via KDE) against the following baselines: \begin{itemize} \item \textbf{BCE-W}: binary cross-entropy with class-frequency inverse weighting. @@ -79,102 +76,45 @@ All methods use the same network architecture, optimiser (Adam for non-LibAUC me \section{Results}\label{sec:experiments:results} \addcontentsline{tocheb}{section}{\protect\numberline{\secnumforhebrewtoc}{תוצאות}} -% TODO: Review which KEEL noise tables to keep in the main body. -% Low noise levels (5%, 10%) show little differentiation and may not add much to the narrative. -% Consider: keep only 20% noise table here (clearest signal, Roll-AoC leads on 6/12 datasets) -% and move 5%/10% tables to an appendix, referencing them from here for completeness. \subsection{KEEL Benchmark}\label{sec:results:keel} \Cref{tab:results:keel} reports mean test AUC across the 12 KEEL datasets under clean labels. No single method dominates: on easy datasets (Iris0, Wisconsin, Vowel0, Vehicle2, Glass6) nearly all methods converge to similar AUCs, leaving little room for differentiation. On the harder, more imbalanced datasets the picture is more varied. -\textsc{Roll}-AoC competes well but does not claim the top position on most individual datasets, establishing it as a competitive approach. +\textsc{Roll}-AOC competes well but does not claim the top position on most individual datasets, establishing it as a competitive approach. To assess label-noise robustness, we inject symmetric label noise. A fraction of all class labels are randomly flipped. We evaluate at noise levels of $5\%, 10\%, 20\%$, running 10 independent episodes per dataset per noise level. -\Cref{tab:results:keel-noise-05,tab:results:keel-noise-10,tab:results:keel-noise-20} show per-dataset results at each noise level. The randomly flipped labels change each episode, yet are consistent between configurations, ensuring every configuration, per episode, sees the same labels, changed in the same way. +Full per-dataset results at 5\% and 10\% noise are given in \Cref{appendix:keel-noise} (\Cref{tab:results:keel-noise-05,tab:results:keel-noise-10}); the 20\% results, where differentiation is strongest, are shown in \Cref{tab:results:keel-noise-20} below. -At $0\%$ noise, results are quite similar across configurations. \textsc{Roll}-AOC trails right behind the leader in most configurations. Since datasets are small, the \textbf{std} given for each point is relatively high, and quite a bit of variability is expected. Still, we see that, with few exceptions, results between configurations seem within throwing distance of eachother. -As noise increases the ranking shifts markedly: at $20\%$ noise \textsc{Roll}-AoC reaches the top on average (0.847), while traditionally noise-robust losses --- \textsc{GCE} (0.831) and \textsc{MAE} (0.804) --- degrade substantially. -The per-dataset tables reveal that this trend is consistent across most datasets rather than driven by a small subset: at $20\%$ noise \textsc{Roll}-AoC leads on 6 of 12 datasets (Glass0, Glass1, Glass2, Pima, Vehicle2, Yeast3), while no other method leads on more than 3. -From $0\%$ to $20\%$ noise, \textsc{Roll}-AoC drops 0.033 in mean AUC (3.7\%), compared to 0.056 for \textsc{GCE} (6.3\%), 0.071 for \textsc{MAE} (8.1\%), and 0.073 for \textsc{LibAUC} (8.3\%). +At $0\%$ noise, results are quite similar across configurations. \textsc{Roll}-AOC trails right behind the leader in most configurations. Since datasets are small, the \textbf{std} given for each point is relatively high, and quite a bit of variability is expected. Still, with few exceptions, results between configurations are within throwing distance of each other. +As noise increases the ranking shifts markedly: at $20\%$ noise \textsc{Roll}-AOC reaches the top on average (0.847), while traditionally noise-robust losses --- \textsc{GCE} (0.831) and \textsc{MAE} (0.804) --- degrade substantially. +The per-dataset results in \Cref{tab:results:keel-noise-20} reveal that this trend is consistent across most datasets rather than driven by a small subset: \textsc{Roll}-AOC leads on 6 of 12 datasets (Glass0, Glass1, Glass2, Pima, Vehicle2, Yeast3), while no other method leads on more than 3. +From $0\%$ to $20\%$ noise, \textsc{Roll}-AOC drops 0.033 in mean AUC (3.7\%), compared to 0.056 for \textsc{GCE} (6.3\%), 0.071 for \textsc{MAE} (8.1\%), and 0.073 for \textsc{LibAUC} (8.3\%). This supports the hypothesis that ROLL's distributional objective provides implicit noise robustness: mislabelled samples shift the fitted score distribution gradually rather than producing isolated large-gradient outliers. -% TODO: audit bold/emphasis across all result tables — check that bold marks the correct per-row best and that no ties or near-ties are missed or incorrectly marked. \begin{table}[htbp] \centering \caption{Mean test AUC ($\pm$\,std, $n=5$ episodes) on KEEL benchmark datasets under clean labels. Best per row in \textbf{bold}.} \label{tab:results:keel} \resizebox{\textwidth}{!}{% -\begin{tabular}{lcccccccc} +\begin{tabular}{lccccccc} \toprule -Dataset & \textsc{Roll}-AoC & \textsc{Roll}-TPR & BCE-W & Focal & Asym. & GCE & LibAUC & MAE \\ +Dataset & \textsc{Roll}-AOC & BCE-W & Focal & Asym. & GCE & LibAUC & MAE \\ \midrule -Glass0 & 0.796{\tiny{$\pm$0.046}} & 0.826{\tiny{$\pm$0.032}} & 0.839{\tiny{$\pm$0.033}} & 0.802{\tiny{$\pm$0.020}} & 0.814{\tiny{$\pm$0.034}} & 0.818{\tiny{$\pm$0.032}} & \textbf{0.843{\tiny{$\pm$0.035}}} & 0.826{\tiny{$\pm$0.037}} \\ -Glass1 & 0.722{\tiny{$\pm$0.033}} & 0.698{\tiny{$\pm$0.042}} & 0.710{\tiny{$\pm$0.018}} & 0.712{\tiny{$\pm$0.036}} & 0.744{\tiny{$\pm$0.044}} & 0.742{\tiny{$\pm$0.039}} & 0.723{\tiny{$\pm$0.054}} & \textbf{0.769{\tiny{$\pm$0.031}}} \\ -Glass2 & 0.723{\tiny{$\pm$0.062}} & 0.701{\tiny{$\pm$0.055}} & 0.661{\tiny{$\pm$0.069}} & 0.677{\tiny{$\pm$0.072}} & \textbf{0.750{\tiny{$\pm$0.075}}} & 0.689{\tiny{$\pm$0.023}} & 0.719{\tiny{$\pm$0.084}} & 0.679{\tiny{$\pm$0.018}} \\ -Glass6 & 0.975{\tiny{$\pm$0.014}} & 0.975{\tiny{$\pm$0.027}} & 0.972{\tiny{$\pm$0.025}} & 0.974{\tiny{$\pm$0.020}} & 0.982{\tiny{$\pm$0.013}} & 0.971{\tiny{$\pm$0.020}} & 0.969{\tiny{$\pm$0.012}} & \textbf{0.985{\tiny{$\pm$0.006}}} \\ -Haberman & 0.696{\tiny{$\pm$0.045}} & 0.675{\tiny{$\pm$0.063}} & 0.736{\tiny{$\pm$0.012}} & \textbf{0.742{\tiny{$\pm$0.025}}} & 0.741{\tiny{$\pm$0.018}} & 0.737{\tiny{$\pm$0.016}} & 0.616{\tiny{$\pm$0.116}} & 0.671{\tiny{$\pm$0.102}} \\ -Iris0 & \textbf{1.000{\tiny{$\pm$0.000}}} & 0.981{\tiny{$\pm$0.027}} & 0.900{\tiny{$\pm$0.224}} & \textbf{1.000{\tiny{$\pm$0.000}}} & \textbf{1.000{\tiny{$\pm$0.000}}} & \textbf{1.000{\tiny{$\pm$0.000}}} & \textbf{1.000{\tiny{$\pm$0.000}}} & 0.900{\tiny{$\pm$0.224}} \\ -New-Thyroid1 & 0.989{\tiny{$\pm$0.010}} & 0.845{\tiny{$\pm$0.241}} & 0.992{\tiny{$\pm$0.005}} & 0.977{\tiny{$\pm$0.033}} & 0.988{\tiny{$\pm$0.007}} & 0.987{\tiny{$\pm$0.011}} & 0.985{\tiny{$\pm$0.012}} & \textbf{0.994{\tiny{$\pm$0.003}}} \\ -Pima & 0.778{\tiny{$\pm$0.024}} & 0.755{\tiny{$\pm$0.014}} & \textbf{0.787{\tiny{$\pm$0.014}}} & 0.775{\tiny{$\pm$0.020}} & 0.771{\tiny{$\pm$0.019}} & 0.785{\tiny{$\pm$0.005}} & 0.761{\tiny{$\pm$0.015}} & 0.778{\tiny{$\pm$0.005}} \\ -Vehicle2 & 0.982{\tiny{$\pm$0.003}} & 0.966{\tiny{$\pm$0.020}} & \textbf{0.984{\tiny{$\pm$0.004}}} & 0.982{\tiny{$\pm$0.003}} & 0.980{\tiny{$\pm$0.004}} & 0.982{\tiny{$\pm$0.004}} & 0.982{\tiny{$\pm$0.003}} & 0.983{\tiny{$\pm$0.004}} \\ -Vowel0 & 0.993{\tiny{$\pm$0.005}} & 0.987{\tiny{$\pm$0.002}} & 0.995{\tiny{$\pm$0.004}} & 0.996{\tiny{$\pm$0.003}} & 0.995{\tiny{$\pm$0.003}} & 0.997{\tiny{$\pm$0.003}} & 0.991{\tiny{$\pm$0.007}} & \textbf{0.998{\tiny{$\pm$0.001}}} \\ -Wisconsin & 0.997{\tiny{$\pm$0.002}} & 0.800{\tiny{$\pm$0.441}} & \textbf{0.999{\tiny{$\pm$0.000}}} & \textbf{0.999{\tiny{$\pm$0.001}}} & 0.999{\tiny{$\pm$0.001}} & 0.999{\tiny{$\pm$0.001}} & 0.999{\tiny{$\pm$0.000}} & 0.998{\tiny{$\pm$0.001}} \\ -Yeast3 & 0.906{\tiny{$\pm$0.024}} & 0.908{\tiny{$\pm$0.021}} & 0.894{\tiny{$\pm$0.008}} & 0.908{\tiny{$\pm$0.019}} & \textbf{0.935{\tiny{$\pm$0.014}}} & 0.927{\tiny{$\pm$0.006}} & \textbf{0.935{\tiny{$\pm$0.016}}} & 0.915{\tiny{$\pm$0.010}} \\ -\bottomrule -\end{tabular}% -} -\end{table} - -\begin{table}[htbp] -\centering -\caption{Mean test AUC ($\pm$\,std, $n=10$ episodes) on KEEL datasets at $\epsilon=5\%$ asymmetric label noise. Best per row in \textbf{bold}.} -\label{tab:results:keel-noise-05} -\resizebox{\textwidth}{!}{% -\begin{tabular}{lcccccccc} -\toprule -Dataset & \textsc{Roll}-AoC & \textsc{Roll}-TPR & BCE-W & Focal & Asym. & GCE & LibAUC & MAE \\ -\midrule -Glass0 & 0.797{\tiny{$\pm$0.046}} & 0.759{\tiny{$\pm$0.060}} & 0.786{\tiny{$\pm$0.019}} & \textbf{0.806{\tiny{$\pm$0.030}}} & 0.792{\tiny{$\pm$0.041}} & 0.794{\tiny{$\pm$0.029}} & 0.791{\tiny{$\pm$0.056}} & 0.792{\tiny{$\pm$0.058}} \\ -Glass1 & 0.728{\tiny{$\pm$0.037}} & 0.702{\tiny{$\pm$0.041}} & 0.736{\tiny{$\pm$0.032}} & 0.730{\tiny{$\pm$0.074}} & 0.704{\tiny{$\pm$0.028}} & 0.717{\tiny{$\pm$0.059}} & 0.694{\tiny{$\pm$0.060}} & \textbf{0.738{\tiny{$\pm$0.047}}} \\ -Glass2 & 0.677{\tiny{$\pm$0.095}} & 0.607{\tiny{$\pm$0.114}} & 0.665{\tiny{$\pm$0.128}} & 0.581{\tiny{$\pm$0.091}} & 0.662{\tiny{$\pm$0.050}} & 0.651{\tiny{$\pm$0.078}} & 0.614{\tiny{$\pm$0.085}} & \textbf{0.686{\tiny{$\pm$0.091}}} \\ -Glass6 & 0.972{\tiny{$\pm$0.021}} & 0.909{\tiny{$\pm$0.068}} & 0.972{\tiny{$\pm$0.035}} & 0.978{\tiny{$\pm$0.016}} & \textbf{0.981{\tiny{$\pm$0.016}}} & 0.947{\tiny{$\pm$0.049}} & 0.967{\tiny{$\pm$0.036}} & 0.971{\tiny{$\pm$0.031}} \\ -Haberman & 0.666{\tiny{$\pm$0.094}} & 0.562{\tiny{$\pm$0.148}} & 0.627{\tiny{$\pm$0.124}} & 0.694{\tiny{$\pm$0.111}} & 0.693{\tiny{$\pm$0.065}} & 0.687{\tiny{$\pm$0.099}} & 0.651{\tiny{$\pm$0.125}} & \textbf{0.716{\tiny{$\pm$0.055}}} \\ -Iris0 & 0.990{\tiny{$\pm$0.014}} & 0.770{\tiny{$\pm$0.284}} & 0.998{\tiny{$\pm$0.006}} & 0.999{\tiny{$\pm$0.002}} & 0.999{\tiny{$\pm$0.002}} & \textbf{1.000{\tiny{$\pm$0.000}}} & \textbf{1.000{\tiny{$\pm$0.000}}} & 0.999{\tiny{$\pm$0.003}} \\ -New-Thyroid1 & 0.984{\tiny{$\pm$0.010}} & 0.609{\tiny{$\pm$0.408}} & 0.986{\tiny{$\pm$0.007}} & 0.971{\tiny{$\pm$0.046}} & 0.989{\tiny{$\pm$0.006}} & 0.987{\tiny{$\pm$0.019}} & 0.983{\tiny{$\pm$0.023}} & \textbf{0.991{\tiny{$\pm$0.012}}} \\ -Pima & 0.780{\tiny{$\pm$0.021}} & 0.761{\tiny{$\pm$0.030}} & 0.784{\tiny{$\pm$0.016}} & 0.780{\tiny{$\pm$0.019}} & 0.767{\tiny{$\pm$0.023}} & \textbf{0.787{\tiny{$\pm$0.011}}} & 0.756{\tiny{$\pm$0.023}} & 0.775{\tiny{$\pm$0.023}} \\ -Vehicle2 & 0.975{\tiny{$\pm$0.007}} & 0.954{\tiny{$\pm$0.043}} & \textbf{0.977{\tiny{$\pm$0.006}}} & 0.974{\tiny{$\pm$0.010}} & 0.969{\tiny{$\pm$0.016}} & 0.976{\tiny{$\pm$0.007}} & 0.975{\tiny{$\pm$0.008}} & 0.976{\tiny{$\pm$0.009}} \\ -Vowel0 & 0.988{\tiny{$\pm$0.012}} & 0.959{\tiny{$\pm$0.028}} & 0.981{\tiny{$\pm$0.019}} & 0.989{\tiny{$\pm$0.017}} & \textbf{0.991{\tiny{$\pm$0.006}}} & 0.985{\tiny{$\pm$0.014}} & 0.973{\tiny{$\pm$0.025}} & 0.978{\tiny{$\pm$0.014}} \\ -Wisconsin & 0.998{\tiny{$\pm$0.002}} & 0.997{\tiny{$\pm$0.004}} & 0.998{\tiny{$\pm$0.001}} & \textbf{0.999{\tiny{$\pm$0.001}}} & \textbf{0.999{\tiny{$\pm$0.001}}} & 0.998{\tiny{$\pm$0.001}} & 0.998{\tiny{$\pm$0.001}} & 0.998{\tiny{$\pm$0.001}} \\ -Yeast3 & 0.900{\tiny{$\pm$0.020}} & 0.843{\tiny{$\pm$0.070}} & 0.914{\tiny{$\pm$0.028}} & 0.915{\tiny{$\pm$0.034}} & \textbf{0.916{\tiny{$\pm$0.026}}} & \textbf{0.916{\tiny{$\pm$0.032}}} & 0.908{\tiny{$\pm$0.029}} & 0.909{\tiny{$\pm$0.024}} \\ -\bottomrule -\end{tabular}% -} -\end{table} - -\begin{table}[htbp] -\centering -\caption{Mean test AUC ($\pm$\,std, $n=10$ episodes) on KEEL datasets at $\epsilon=10\%$ asymmetric label noise. Best per row in \textbf{bold}.} -\label{tab:results:keel-noise-10} -\resizebox{\textwidth}{!}{% -\begin{tabular}{lcccccccc} -\toprule -Dataset & \textsc{Roll}-AoC & \textsc{Roll}-TPR & BCE-W & Focal & Asym. & GCE & LibAUC & MAE \\ -\midrule -Glass0 & 0.773{\tiny{$\pm$0.070}} & 0.767{\tiny{$\pm$0.046}} & 0.789{\tiny{$\pm$0.037}} & 0.771{\tiny{$\pm$0.037}} & \textbf{0.821{\tiny{$\pm$0.026}}} & 0.786{\tiny{$\pm$0.057}} & 0.800{\tiny{$\pm$0.032}} & 0.807{\tiny{$\pm$0.050}} \\ -Glass1 & 0.719{\tiny{$\pm$0.040}} & 0.725{\tiny{$\pm$0.029}} & 0.716{\tiny{$\pm$0.079}} & 0.718{\tiny{$\pm$0.056}} & 0.710{\tiny{$\pm$0.049}} & 0.729{\tiny{$\pm$0.048}} & 0.675{\tiny{$\pm$0.070}} & \textbf{0.738{\tiny{$\pm$0.060}}} \\ -Glass2 & 0.695{\tiny{$\pm$0.075}} & 0.649{\tiny{$\pm$0.119}} & 0.644{\tiny{$\pm$0.072}} & 0.687{\tiny{$\pm$0.127}} & 0.655{\tiny{$\pm$0.048}} & \textbf{0.713{\tiny{$\pm$0.107}}} & 0.637{\tiny{$\pm$0.093}} & 0.673{\tiny{$\pm$0.111}} \\ -Glass6 & 0.947{\tiny{$\pm$0.050}} & 0.910{\tiny{$\pm$0.067}} & \textbf{0.973{\tiny{$\pm$0.026}}} & 0.950{\tiny{$\pm$0.041}} & 0.971{\tiny{$\pm$0.024}} & 0.938{\tiny{$\pm$0.047}} & 0.937{\tiny{$\pm$0.048}} & 0.935{\tiny{$\pm$0.054}} \\ -Haberman & 0.638{\tiny{$\pm$0.098}} & 0.564{\tiny{$\pm$0.144}} & 0.700{\tiny{$\pm$0.074}} & 0.652{\tiny{$\pm$0.106}} & 0.658{\tiny{$\pm$0.087}} & 0.636{\tiny{$\pm$0.112}} & 0.694{\tiny{$\pm$0.129}} & \textbf{0.732{\tiny{$\pm$0.022}}} \\ -Iris0 & 0.991{\tiny{$\pm$0.020}} & 0.879{\tiny{$\pm$0.209}} & 0.950{\tiny{$\pm$0.158}} & 0.950{\tiny{$\pm$0.158}} & \textbf{1.000{\tiny{$\pm$0.000}}} & \textbf{1.000{\tiny{$\pm$0.001}}} & \textbf{1.000{\tiny{$\pm$0.000}}} & \textbf{1.000{\tiny{$\pm$0.000}}} \\ -New-Thyroid1 & 0.986{\tiny{$\pm$0.011}} & 0.588{\tiny{$\pm$0.358}} & 0.980{\tiny{$\pm$0.024}} & 0.987{\tiny{$\pm$0.012}} & \textbf{0.991{\tiny{$\pm$0.013}}} & 0.986{\tiny{$\pm$0.019}} & 0.973{\tiny{$\pm$0.049}} & 0.986{\tiny{$\pm$0.013}} \\ -Pima & 0.756{\tiny{$\pm$0.026}} & 0.752{\tiny{$\pm$0.027}} & 0.760{\tiny{$\pm$0.024}} & 0.767{\tiny{$\pm$0.023}} & \textbf{0.780{\tiny{$\pm$0.013}}} & 0.761{\tiny{$\pm$0.030}} & 0.757{\tiny{$\pm$0.032}} & 0.754{\tiny{$\pm$0.032}} \\ -Vehicle2 & 0.967{\tiny{$\pm$0.015}} & 0.939{\tiny{$\pm$0.020}} & 0.964{\tiny{$\pm$0.016}} & 0.962{\tiny{$\pm$0.020}} & 0.962{\tiny{$\pm$0.017}} & 0.965{\tiny{$\pm$0.009}} & 0.953{\tiny{$\pm$0.022}} & \textbf{0.970{\tiny{$\pm$0.010}}} \\ -Vowel0 & \textbf{0.985{\tiny{$\pm$0.011}}} & 0.946{\tiny{$\pm$0.036}} & \textbf{0.984{\tiny{$\pm$0.016}}} & 0.979{\tiny{$\pm$0.025}} & 0.975{\tiny{$\pm$0.022}} & 0.977{\tiny{$\pm$0.024}} & 0.959{\tiny{$\pm$0.035}} & 0.946{\tiny{$\pm$0.039}} \\ -Wisconsin & 0.996{\tiny{$\pm$0.001}} & 0.717{\tiny{$\pm$0.453}} & 0.996{\tiny{$\pm$0.004}} & 0.997{\tiny{$\pm$0.003}} & 0.997{\tiny{$\pm$0.003}} & \textbf{0.998{\tiny{$\pm$0.001}}} & 0.996{\tiny{$\pm$0.004}} & \textbf{0.998{\tiny{$\pm$0.001}}} \\ -Yeast3 & 0.895{\tiny{$\pm$0.034}} & 0.810{\tiny{$\pm$0.097}} & 0.891{\tiny{$\pm$0.054}} & 0.868{\tiny{$\pm$0.069}} & \textbf{0.915{\tiny{$\pm$0.030}}} & 0.891{\tiny{$\pm$0.029}} & 0.872{\tiny{$\pm$0.040}} & 0.857{\tiny{$\pm$0.059}} \\ +Glass0 & 0.796{\tiny{$\pm$0.046}} & 0.839{\tiny{$\pm$0.033}} & 0.802{\tiny{$\pm$0.020}} & 0.814{\tiny{$\pm$0.034}} & 0.818{\tiny{$\pm$0.032}} & \textbf{0.843{\tiny{$\pm$0.035}}} & 0.826{\tiny{$\pm$0.037}} \\ +Glass1 & 0.722{\tiny{$\pm$0.033}} & 0.710{\tiny{$\pm$0.018}} & 0.712{\tiny{$\pm$0.036}} & 0.744{\tiny{$\pm$0.044}} & 0.742{\tiny{$\pm$0.039}} & 0.723{\tiny{$\pm$0.054}} & \textbf{0.769{\tiny{$\pm$0.031}}} \\ +Glass2 & 0.723{\tiny{$\pm$0.062}} & 0.661{\tiny{$\pm$0.069}} & 0.677{\tiny{$\pm$0.072}} & \textbf{0.750{\tiny{$\pm$0.075}}} & 0.689{\tiny{$\pm$0.023}} & 0.719{\tiny{$\pm$0.084}} & 0.679{\tiny{$\pm$0.018}} \\ +Glass6 & 0.975{\tiny{$\pm$0.014}} & 0.972{\tiny{$\pm$0.025}} & 0.974{\tiny{$\pm$0.020}} & 0.982{\tiny{$\pm$0.013}} & 0.971{\tiny{$\pm$0.020}} & 0.969{\tiny{$\pm$0.012}} & \textbf{0.985{\tiny{$\pm$0.006}}} \\ +Haberman & 0.696{\tiny{$\pm$0.045}} & 0.736{\tiny{$\pm$0.012}} & \textbf{0.742{\tiny{$\pm$0.025}}} & 0.741{\tiny{$\pm$0.018}} & 0.737{\tiny{$\pm$0.016}} & 0.616{\tiny{$\pm$0.116}} & 0.671{\tiny{$\pm$0.102}} \\ +Iris0 & \textbf{1.000{\tiny{$\pm$0.000}}} & 0.900{\tiny{$\pm$0.224}} & \textbf{1.000{\tiny{$\pm$0.000}}} & \textbf{1.000{\tiny{$\pm$0.000}}} & \textbf{1.000{\tiny{$\pm$0.000}}} & \textbf{1.000{\tiny{$\pm$0.000}}} & 0.900{\tiny{$\pm$0.224}} \\ +New-Thyroid1 & 0.989{\tiny{$\pm$0.010}} & 0.992{\tiny{$\pm$0.005}} & 0.977{\tiny{$\pm$0.033}} & 0.988{\tiny{$\pm$0.007}} & 0.987{\tiny{$\pm$0.011}} & 0.985{\tiny{$\pm$0.012}} & \textbf{0.994{\tiny{$\pm$0.003}}} \\ +Pima & 0.778{\tiny{$\pm$0.024}} & \textbf{0.787{\tiny{$\pm$0.014}}} & 0.775{\tiny{$\pm$0.020}} & 0.771{\tiny{$\pm$0.019}} & 0.785{\tiny{$\pm$0.005}} & 0.761{\tiny{$\pm$0.015}} & 0.778{\tiny{$\pm$0.005}} \\ +Vehicle2 & 0.982{\tiny{$\pm$0.003}} & \textbf{0.984{\tiny{$\pm$0.004}}} & 0.982{\tiny{$\pm$0.003}} & 0.980{\tiny{$\pm$0.004}} & 0.982{\tiny{$\pm$0.004}} & 0.982{\tiny{$\pm$0.003}} & 0.983{\tiny{$\pm$0.004}} \\ +Vowel0 & 0.993{\tiny{$\pm$0.005}} & 0.995{\tiny{$\pm$0.004}} & 0.996{\tiny{$\pm$0.003}} & 0.995{\tiny{$\pm$0.003}} & 0.997{\tiny{$\pm$0.003}} & 0.991{\tiny{$\pm$0.007}} & \textbf{0.998{\tiny{$\pm$0.001}}} \\ +Wisconsin & 0.997{\tiny{$\pm$0.002}} & \textbf{0.999{\tiny{$\pm$0.000}}} & \textbf{0.999{\tiny{$\pm$0.001}}} & 0.999{\tiny{$\pm$0.001}} & 0.999{\tiny{$\pm$0.001}} & 0.999{\tiny{$\pm$0.000}} & 0.998{\tiny{$\pm$0.001}} \\ +Yeast3 & 0.906{\tiny{$\pm$0.024}} & 0.894{\tiny{$\pm$0.008}} & 0.908{\tiny{$\pm$0.019}} & \textbf{0.935{\tiny{$\pm$0.014}}} & 0.927{\tiny{$\pm$0.006}} & \textbf{0.935{\tiny{$\pm$0.016}}} & 0.915{\tiny{$\pm$0.010}} \\ \bottomrule \end{tabular}% } @@ -185,22 +125,22 @@ Yeast3 & 0.895{\tiny{$\pm$0.034}} & 0.810{\tiny{$\pm$0.097}} & 0.891{\tiny \caption{Mean test AUC ($\pm$\,std, $n=10$ episodes) on KEEL datasets at $\epsilon=20\%$ asymmetric label noise. Best per row in \textbf{bold}.} \label{tab:results:keel-noise-20} \resizebox{\textwidth}{!}{% -\begin{tabular}{lcccccccc} +\begin{tabular}{lccccccc} \toprule -Dataset & \textsc{Roll}-AoC & \textsc{Roll}-TPR & BCE-W & Focal & Asym. & GCE & LibAUC & MAE \\ +Dataset & \textsc{Roll}-AOC & BCE-W & Focal & Asym. & GCE & LibAUC & MAE \\ \midrule -Glass0 & \textbf{0.801{\tiny{$\pm$0.042}}} & 0.758{\tiny{$\pm$0.049}} & 0.767{\tiny{$\pm$0.042}} & 0.796{\tiny{$\pm$0.040}} & 0.793{\tiny{$\pm$0.051}} & 0.765{\tiny{$\pm$0.052}} & 0.745{\tiny{$\pm$0.089}} & 0.791{\tiny{$\pm$0.044}} \\ -Glass1 & \textbf{0.725{\tiny{$\pm$0.036}}} & 0.682{\tiny{$\pm$0.068}} & 0.718{\tiny{$\pm$0.054}} & 0.714{\tiny{$\pm$0.036}} & 0.700{\tiny{$\pm$0.039}} & 0.706{\tiny{$\pm$0.041}} & 0.635{\tiny{$\pm$0.052}} & 0.689{\tiny{$\pm$0.060}} \\ -Glass2 & \textbf{0.622{\tiny{$\pm$0.110}}} & 0.585{\tiny{$\pm$0.131}} & 0.620{\tiny{$\pm$0.166}} & 0.620{\tiny{$\pm$0.082}} & 0.586{\tiny{$\pm$0.121}} & 0.614{\tiny{$\pm$0.196}} & 0.601{\tiny{$\pm$0.138}} & 0.573{\tiny{$\pm$0.163}} \\ -Glass6 & 0.915{\tiny{$\pm$0.077}} & 0.884{\tiny{$\pm$0.085}} & 0.925{\tiny{$\pm$0.063}} & 0.939{\tiny{$\pm$0.057}} & \textbf{0.962{\tiny{$\pm$0.025}}} & 0.875{\tiny{$\pm$0.102}} & 0.939{\tiny{$\pm$0.046}} & 0.827{\tiny{$\pm$0.150}} \\ -Haberman & 0.632{\tiny{$\pm$0.099}} & 0.548{\tiny{$\pm$0.116}} & 0.601{\tiny{$\pm$0.129}} & 0.662{\tiny{$\pm$0.091}} & 0.633{\tiny{$\pm$0.110}} & 0.586{\tiny{$\pm$0.131}} & \textbf{0.666{\tiny{$\pm$0.130}}} & 0.629{\tiny{$\pm$0.106}} \\ -Iris0 & 0.993{\tiny{$\pm$0.011}} & 0.894{\tiny{$\pm$0.286}} & 0.997{\tiny{$\pm$0.009}} & 0.897{\tiny{$\pm$0.217}} & 0.950{\tiny{$\pm$0.158}} & 0.957{\tiny{$\pm$0.135}} & 0.998{\tiny{$\pm$0.004}} & \textbf{1.000{\tiny{$\pm$0.001}}} \\ -New-Thyroid1 & 0.930{\tiny{$\pm$0.047}} & 0.802{\tiny{$\pm$0.223}} & 0.951{\tiny{$\pm$0.044}} & 0.962{\tiny{$\pm$0.035}} & 0.895{\tiny{$\pm$0.160}} & \textbf{0.973{\tiny{$\pm$0.065}}} & 0.888{\tiny{$\pm$0.300}} & 0.910{\tiny{$\pm$0.152}} \\ -Pima & \textbf{0.758{\tiny{$\pm$0.015}}} & 0.722{\tiny{$\pm$0.062}} & 0.756{\tiny{$\pm$0.024}} & 0.753{\tiny{$\pm$0.032}} & 0.742{\tiny{$\pm$0.048}} & 0.757{\tiny{$\pm$0.026}} & 0.741{\tiny{$\pm$0.027}} & 0.745{\tiny{$\pm$0.027}} \\ -Vehicle2 & \textbf{0.949{\tiny{$\pm$0.024}}} & 0.901{\tiny{$\pm$0.052}} & 0.948{\tiny{$\pm$0.021}} & 0.936{\tiny{$\pm$0.026}} & 0.928{\tiny{$\pm$0.029}} & 0.932{\tiny{$\pm$0.038}} & 0.864{\tiny{$\pm$0.049}} & 0.892{\tiny{$\pm$0.057}} \\ -Vowel0 & 0.966{\tiny{$\pm$0.033}} & 0.929{\tiny{$\pm$0.054}} & \textbf{0.978{\tiny{$\pm$0.019}}} & 0.975{\tiny{$\pm$0.018}} & 0.966{\tiny{$\pm$0.015}} & 0.956{\tiny{$\pm$0.020}} & 0.847{\tiny{$\pm$0.157}} & 0.838{\tiny{$\pm$0.079}} \\ -Wisconsin & 0.995{\tiny{$\pm$0.003}} & 0.912{\tiny{$\pm$0.214}} & \textbf{0.998{\tiny{$\pm$0.002}}} & 0.997{\tiny{$\pm$0.002}} & 0.995{\tiny{$\pm$0.006}} & 0.996{\tiny{$\pm$0.004}} & 0.993{\tiny{$\pm$0.014}} & 0.997{\tiny{$\pm$0.002}} \\ -Yeast3 & \textbf{0.879{\tiny{$\pm$0.032}}} & 0.657{\tiny{$\pm$0.140}} & 0.861{\tiny{$\pm$0.070}} & 0.853{\tiny{$\pm$0.063}} & 0.846{\tiny{$\pm$0.091}} & 0.850{\tiny{$\pm$0.038}} & 0.793{\tiny{$\pm$0.104}} & 0.752{\tiny{$\pm$0.133}} \\ +Glass0 & \textbf{0.801{\tiny{$\pm$0.042}}} & 0.767{\tiny{$\pm$0.042}} & 0.796{\tiny{$\pm$0.040}} & 0.793{\tiny{$\pm$0.051}} & 0.765{\tiny{$\pm$0.052}} & 0.745{\tiny{$\pm$0.089}} & 0.791{\tiny{$\pm$0.044}} \\ +Glass1 & \textbf{0.725{\tiny{$\pm$0.036}}} & 0.718{\tiny{$\pm$0.054}} & 0.714{\tiny{$\pm$0.036}} & 0.700{\tiny{$\pm$0.039}} & 0.706{\tiny{$\pm$0.041}} & 0.635{\tiny{$\pm$0.052}} & 0.689{\tiny{$\pm$0.060}} \\ +Glass2 & \textbf{0.622{\tiny{$\pm$0.110}}} & 0.620{\tiny{$\pm$0.166}} & 0.620{\tiny{$\pm$0.082}} & 0.586{\tiny{$\pm$0.121}} & 0.614{\tiny{$\pm$0.196}} & 0.601{\tiny{$\pm$0.138}} & 0.573{\tiny{$\pm$0.163}} \\ +Glass6 & 0.915{\tiny{$\pm$0.077}} & 0.925{\tiny{$\pm$0.063}} & 0.939{\tiny{$\pm$0.057}} & \textbf{0.962{\tiny{$\pm$0.025}}} & 0.875{\tiny{$\pm$0.102}} & 0.939{\tiny{$\pm$0.046}} & 0.827{\tiny{$\pm$0.150}} \\ +Haberman & 0.632{\tiny{$\pm$0.099}} & 0.601{\tiny{$\pm$0.129}} & 0.662{\tiny{$\pm$0.091}} & 0.633{\tiny{$\pm$0.110}} & 0.586{\tiny{$\pm$0.131}} & \textbf{0.666{\tiny{$\pm$0.130}}} & 0.629{\tiny{$\pm$0.106}} \\ +Iris0 & 0.993{\tiny{$\pm$0.011}} & 0.997{\tiny{$\pm$0.009}} & 0.897{\tiny{$\pm$0.217}} & 0.950{\tiny{$\pm$0.158}} & 0.957{\tiny{$\pm$0.135}} & 0.998{\tiny{$\pm$0.004}} & \textbf{1.000{\tiny{$\pm$0.001}}} \\ +New-Thyroid1 & 0.930{\tiny{$\pm$0.047}} & 0.951{\tiny{$\pm$0.044}} & 0.962{\tiny{$\pm$0.035}} & 0.895{\tiny{$\pm$0.160}} & \textbf{0.973{\tiny{$\pm$0.065}}} & 0.888{\tiny{$\pm$0.300}} & 0.910{\tiny{$\pm$0.152}} \\ +Pima & \textbf{0.758{\tiny{$\pm$0.015}}} & 0.756{\tiny{$\pm$0.024}} & 0.753{\tiny{$\pm$0.032}} & 0.742{\tiny{$\pm$0.048}} & 0.757{\tiny{$\pm$0.026}} & 0.741{\tiny{$\pm$0.027}} & 0.745{\tiny{$\pm$0.027}} \\ +Vehicle2 & \textbf{0.949{\tiny{$\pm$0.024}}} & 0.948{\tiny{$\pm$0.021}} & 0.936{\tiny{$\pm$0.026}} & 0.928{\tiny{$\pm$0.029}} & 0.932{\tiny{$\pm$0.038}} & 0.864{\tiny{$\pm$0.049}} & 0.892{\tiny{$\pm$0.057}} \\ +Vowel0 & 0.966{\tiny{$\pm$0.033}} & \textbf{0.978{\tiny{$\pm$0.019}}} & 0.975{\tiny{$\pm$0.018}} & 0.966{\tiny{$\pm$0.015}} & 0.956{\tiny{$\pm$0.020}} & 0.847{\tiny{$\pm$0.157}} & 0.838{\tiny{$\pm$0.079}} \\ +Wisconsin & 0.995{\tiny{$\pm$0.003}} & \textbf{0.998{\tiny{$\pm$0.002}}} & 0.997{\tiny{$\pm$0.002}} & 0.995{\tiny{$\pm$0.006}} & 0.996{\tiny{$\pm$0.004}} & 0.993{\tiny{$\pm$0.014}} & 0.997{\tiny{$\pm$0.002}} \\ +Yeast3 & \textbf{0.879{\tiny{$\pm$0.032}}} & 0.861{\tiny{$\pm$0.070}} & 0.853{\tiny{$\pm$0.063}} & 0.846{\tiny{$\pm$0.091}} & 0.850{\tiny{$\pm$0.038}} & 0.793{\tiny{$\pm$0.104}} & 0.752{\tiny{$\pm$0.133}} \\ \bottomrule \end{tabular}% } @@ -208,7 +148,7 @@ Yeast3 & \textbf{0.879{\tiny{$\pm$0.032}}} & 0.657{\tiny{$\pm$0.140}} & 0. \subsection{CIFAR-10N: Label-Noise Robustness}\label{sec:results:cifar10n} -\Cref{tab:results:cifar10n} shows AUC under three noise levels on CIFAR-10N. Under \emph{clean} labels all methods reach AUC $\geq 0.972$, with \textsc{Roll}-AoC at the top (0.980). As noise increases the advantage of \textsc{Roll}-AoC grows: under \emph{aggre} noise it leads by 0.002 over the next-best method (GCE, 0.932) while other methods degrade more significantly, and under \emph{worse} noise, the margin widens to 0.012 over MAE (0.809) and 0.047 over BCE-W (0.738). Observing degredation w.r.t the clean scenario, we can see that \testxc{Roll}-AoC degraded the least (-0.159 relative to clean results) relative to other configurations, with the other least-degrading result being MAE (-0.167) +\Cref{tab:results:cifar10n} shows AUC under three noise levels on CIFAR-10N. Under \emph{clean} labels all methods reach AUC $\geq 0.972$, with \textsc{Roll}-AOC at the top (0.980). As noise increases the advantage of \textsc{Roll}-AOC grows: under \emph{aggre} noise it leads by 0.002 over the next-best method (GCE, 0.932) while other methods degrade more significantly, and under \emph{worse} noise, the margin widens to 0.012 over MAE (0.809) and 0.047 over BCE-W (0.738). Observing degradation relative to the clean scenario, \textsc{Roll}-AOC degraded the least ($-0.159$ relative to clean results), with MAE second ($-0.167$). \begin{table}[htbp] \centering @@ -217,7 +157,7 @@ Yeast3 & \textbf{0.879{\tiny{$\pm$0.032}}} & 0.657{\tiny{$\pm$0.140}} & 0. \resizebox{\textwidth}{!}{% \begin{tabular}{lccccccc} \toprule -Noise & \textsc{Roll}-AoC & BCE-W & Focal & Asym. & GCE & LibAUC & MAE \\ +Noise & \textsc{Roll}-AOC & BCE-W & Focal & Asym. & GCE & LibAUC & MAE \\ \midrule Clean & \textbf{0.980{\tiny{$\pm$0.001}}} & 0.977{\tiny{$\pm$0.002}} & 0.977{\tiny{$\pm$0.000}} & 0.972{\tiny{$\pm$0.003}} & 0.976{\tiny{$\pm$0.002}} & 0.979{\tiny{$\pm$0.000}} & 0.976{\tiny{$\pm$0.002}} \\ Aggre. & \textbf{0.934{\tiny{$\pm$0.002}}} & 0.924{\tiny{$\pm$0.003}} & 0.912{\tiny{$\pm$0.014}} & 0.910{\tiny{$\pm$0.004}} & 0.932{\tiny{$\pm$0.005}} & 0.921{\tiny{$\pm$0.004}} & 0.930{\tiny{$\pm$0.002}} \\ @@ -227,68 +167,31 @@ Worse & \textbf{0.821{\tiny{$\pm$0.001}}} & 0.738{\tiny{$\pm$0.009}} & 0.734{\ti } \end{table} -% TODO: Remove Roll-TPR column from tab:results:large and update the discussion accordingly. -% Roll-TPR is not the focus for these datasets and its results (e.g. 0.438 on Bank Marketing) distract from the main story. -\subsection{Large Real-World Datasets}\label{sec:results:large} +\subsection{Large Datasets}\label{sec:results:large} -% TODO: Reword Bank Marketing discussion after rerun — current results (Roll-AoC 0.511, Roll-TPR 0.438) are likely a bug. Update numbers and narrative once confirmed. -\Cref{tab:results:large} covers three large-scale datasets. On Credit Card Fraud \textsc{Roll}-TPR is the top performer (0.974) with \textsc{Roll}-AoC close behind (0.968), and both outperform all non-ROLL baselines. On Home Credit \textsc{Roll}-AoC edges LibAUC (0.712 vs.\ 0.711). On Bank Marketing, however, GCE achieves the highest AUC (0.746) while \textsc{Roll}-AoC and \textsc{Roll}-TPR underperform (0.511 and 0.438 respectively); the cause of this degradation on this dataset is an open question and a direction for future investigation. +\Cref{tab:results:large} covers the four large-scale datasets. On Bank Marketing, LibAUC leads (0.936) with \textsc{Roll}-AOC close behind (0.931), and both substantially outperform all other baselines. On Credit Card Fraud \textsc{Roll}-AOC is the top performer (0.968), outperforming all baselines. On Home Credit \textsc{Roll}-AOC edges LibAUC (0.712 vs.\ 0.711). + +NIH ChestX-ray14 is qualitatively distinct from the other three: inputs are frozen DenseNet-121 embeddings from radiograph images rather than raw tabular features, making this a transfer-learning evaluation under naturally noisy labels~\cite{oakdenrayner2020exploring}. +\textsc{Roll}-AOC achieves the highest AUC ($0.839\pm0.001$), a clear margin above the next-best method GCE ($0.829\pm0.004$). +Standard cross-entropy variants trail substantially: BCE-W reaches $0.788\pm0.008$, Focal $0.798\pm0.009$, and Asym.\ $0.729\pm0.007$. MAE ($0.810\pm0.001$) and LibAUC ($0.835\pm0.002$) both fall short despite their respective noise-robust and AUC-optimising designs. +The ${\approx}5$~pp gap between \textsc{Roll}-AOC and BCE-W, consistent with the controlled KEEL noise experiment (\Cref{sec:results:keel}) and CIFAR-10N (\Cref{sec:results:cifar10n}), confirms that the noise-robustness advantage holds on real-world label noise. The result also shows that \textsc{Roll}-AOC generalises beyond from-scratch training: with embeddings frozen, ROLL operates entirely within the MLP head, fitting score distributions over a fixed representation. \begin{table}[htbp] \centering -\caption{Mean test AUC ($\pm$\,std, $n=5$ episodes) on large real-world datasets. Best per row in \textbf{bold}.} +\caption{Mean test AUC ($\pm$\,std, $n=5$ episodes) on large real-world datasets. Best per row in \textbf{bold}. ChestX-ray14 uses frozen DenseNet-121 embeddings rather than raw tabular features.} \label{tab:results:large} \resizebox{\textwidth}{!}{% -\begin{tabular}{lcccccccc} +\begin{tabular}{lccccccc} \toprule -Dataset & \textsc{Roll}-AoC & \textsc{Roll}-TPR & BCE-W & Focal & Asym. & GCE & LibAUC & MAE \\ +Dataset & \textsc{Roll}-AOC & BCE-W & Focal & Asym. & GCE & LibAUC & MAE \\ \midrule -Bank Marketing & 0.511{\tiny{$\pm$0.047}} & 0.438{\tiny{$\pm$0.044}} & 0.580{\tiny{$\pm$0.040}} & 0.573{\tiny{$\pm$0.044}} & 0.684{\tiny{$\pm$0.033}} & \textbf{0.746{\tiny{$\pm$0.022}}} & 0.652{\tiny{$\pm$0.031}} & 0.707{\tiny{$\pm$0.035}} \\ -Credit Card Fraud & 0.968{\tiny{$\pm$0.001}} & \textbf{0.974{\tiny{$\pm$0.003}}} & 0.949{\tiny{$\pm$0.015}} & 0.942{\tiny{$\pm$0.020}} & 0.940{\tiny{$\pm$0.013}} & 0.948{\tiny{$\pm$0.014}} & 0.966{\tiny{$\pm$0.006}} & 0.954{\tiny{$\pm$0.009}} \\ -Home Credit & \textbf{0.712{\tiny{$\pm$0.001}}} & 0.687{\tiny{$\pm$0.004}} & 0.693{\tiny{$\pm$0.002}} & 0.694{\tiny{$\pm$0.002}} & 0.688{\tiny{$\pm$0.003}} & 0.698{\tiny{$\pm$0.002}} & 0.711{\tiny{$\pm$0.001}} & 0.699{\tiny{$\pm$0.004}} \\ +Bank Marketing & 0.931{\tiny{$\pm$0.002}} & 0.580{\tiny{$\pm$0.040}} & 0.573{\tiny{$\pm$0.044}} & 0.684{\tiny{$\pm$0.033}} & 0.746{\tiny{$\pm$0.022}} & \textbf{0.936{\tiny{$\pm$0.003}}} & 0.707{\tiny{$\pm$0.035}} \\ +Credit Card Fraud & \textbf{0.968{\tiny{$\pm$0.001}}} & 0.949{\tiny{$\pm$0.015}} & 0.942{\tiny{$\pm$0.020}} & 0.940{\tiny{$\pm$0.013}} & 0.948{\tiny{$\pm$0.014}} & 0.966{\tiny{$\pm$0.006}} & 0.954{\tiny{$\pm$0.009}} \\ +Home Credit & \textbf{0.712{\tiny{$\pm$0.001}}} & 0.693{\tiny{$\pm$0.002}} & 0.694{\tiny{$\pm$0.002}} & 0.688{\tiny{$\pm$0.003}} & 0.698{\tiny{$\pm$0.002}} & 0.711{\tiny{$\pm$0.001}} & 0.699{\tiny{$\pm$0.004}} \\ +\midrule +ChestX-ray14 (Effusion) & \textbf{0.839{\tiny{$\pm$0.001}}} & 0.788{\tiny{$\pm$0.008}} & 0.798{\tiny{$\pm$0.009}} & 0.729{\tiny{$\pm$0.007}} & 0.829{\tiny{$\pm$0.004}} & 0.835{\tiny{$\pm$0.002}} & 0.810{\tiny{$\pm$0.001}} \\ \bottomrule \end{tabular}% } \end{table} - -\subsection{NIH ChestX-ray14}\label{sec:results:chestxray14} - -\Cref{tab:results:chestxray14} reports test AUC on the ChestX-ray14 Effusion task. -\textsc{Roll}-AoC achieves the highest AUC ($0.839\pm0.001$), a clear margin above the -next-best methods GCE ($0.829\pm0.004$) and \textsc{Roll}-TPR ($0.828\pm0.002$). -Standard cross-entropy variants trail substantially: BCE-W reaches $0.788\pm0.008$, -Focal $0.798\pm0.009$, and Asym.\ $0.729\pm0.007$. MAE ($0.810\pm0.001$) benefits from -its noise-robust design but still falls behind the distributional losses. LibAUC results -are excluded due to an optimizer instability on this dataset (to be resolved in a -follow-up run). - -The ${\approx}5$~pp gap between \textsc{Roll}-AoC and BCE-W, on a dataset whose labels -carry substantial organic NLP noise~\cite{oakdenrayner2020exploring}, is consistent with the findings from the controlled -KEEL noise experiment (\Cref{sec:results:keel}) and CIFAR-10N -(\Cref{sec:results:cifar10n}). The result also demonstrates that ROLL-AOC generalises -beyond from-scratch training: the DenseNet-121 embeddings are frozen, so ROLL operates -entirely within the MLP head, fitting score distributions over a fixed representation. - -\begin{table}[htbp] -\centering -\caption{Mean test AUC ($\pm$\,std, $n=5$ episodes) on NIH ChestX-ray14 (Effusion - vs.\ rest, IR~${\approx}7.5$:1). Labels carry substantial organic NLP noise~\cite{oakdenrayner2020exploring}. - LibAUC excluded due to optimizer instability. Best in \textbf{bold}.} -\label{tab:results:chestxray14} -\begin{tabular}{lc} -\toprule -Method & AUC \\ -\midrule -\textsc{Roll}-AoC & \textbf{0.839{\tiny{$\pm$0.001}}} \\ -\textsc{Roll}-TPR & 0.828{\tiny{$\pm$0.002}} \\ -GCE & 0.829{\tiny{$\pm$0.004}} \\ -MAE & 0.810{\tiny{$\pm$0.001}} \\ -Focal & 0.798{\tiny{$\pm$0.009}} \\ -BCE-W & 0.788{\tiny{$\pm$0.008}} \\ -Asym. & 0.729{\tiny{$\pm$0.007}} \\ -LibAUC & 0.835{\tiny{$\pm$0.002}} \\ -\bottomrule -\end{tabular} -\end{table} - diff --git a/content/introduction/introduction.tex b/content/introduction/introduction.tex index 2472660..39603e4 100644 --- a/content/introduction/introduction.tex +++ b/content/introduction/introduction.tex @@ -4,14 +4,16 @@ Real-world data is hardly ever perfect. Many real-world datasets suffer a myriad Gradient based learning methods, like those used to train neural networks, have trouble dealing with such datasets. Standard, per-sample losses (BCE, focal-loss), are confused easily by mislabeled points, as they produce a very large gradient which throws off training. Current attempts at noise-robust losses (GCE, MAE) help smooth these large gradients, yet still optimize on a per-sample basis, targeting per-sample accuracy rather than ranking quality --- leaving them misaligned with AUC even when they do reduce noise sensitivity. -In this field, optimizing directly for our desired metric (AUC) proves to be useful in dealing with noise. Per-sample losses help optimize each sample on their own, while AUC losses optimize the sample ranking amongst the whole. This helps them make smart tradeoffs while training, and accepting errors. +Direct AUC optimization is a natural direction here: ranking-based objectives are determined by the relative ordering of scores rather than their absolute values, making them structurally less sensitive to isolated mislabeled samples. Per-sample losses optimize each sample independently, while AUC losses optimize sample ranking across the whole population, allowing the model to make principled tradeoffs even in the presence of label errors. \section{Contribution} -In this work we introduce the \textsc{ROLL} framework for ROC curve related losses and \textsc{ROLL}-AoC, a noise-robust loss that optimizes AUC \emph{directly}. We show that the loss is more robust to label noise than other methods, and how it handles class-imbalance naturally. +In this work we introduce the \textsc{ROLL} framework for ROC curve related losses and \textsc{ROLL}-AOC, a noise-robust loss that optimizes AUC \emph{directly}. We show that the loss is more robust to label noise than other methods, and how it handles class-imbalance naturally. + +% TODO: Expand introduction to 4--6 pages. Currently too thin -- add motivation, concrete examples, and a clearer narrative arc before submission. \section{Roadmap} -In this work, we will first review AUC optimization, KDE, imbalanced classification, label noise and existing methods for dealing with it in datasets. We then introduce \textsc{ROLL} and \textsc{ROLL}-AoC, formulate it using KDE distribution approximation, and offer derivations for use in gradient-based learning. Then, we show performance on real world data. Finally, we discuss advantages and disadvantages with regards to other methods, as well as offer avenues for future research. +In this work, we will first review AUC optimization, KDE, imbalanced classification, label noise and existing methods for dealing with it in datasets. We then introduce \textsc{ROLL} and \textsc{ROLL}-AOC, formulate it using KDE distribution approximation, and offer derivations for use in gradient-based learning. Then, we show performance on real world data. Finally, we discuss advantages and disadvantages with regards to other methods, as well as offer avenues for future research. diff --git a/content/method/figures/roll_aoc_roc.pdf b/content/method/figures/roll_aoc_roc.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a57ef3be08b4e9ce9cd9a8065549865049335e86 GIT binary patch literal 98728 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 literal 0 HcmV?d00001 diff --git a/content/method/figures/roll_aoc_roc.png b/content/method/figures/roll_aoc_roc.png new file mode 100644 index 0000000000000000000000000000000000000000..6c46016abdbeb0ece3dbc1c2a0fc86d8012b3d5d GIT binary patch literal 54399 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 YY1wWD@$qUWR|Hv0MF0Q* literal 0 HcmV?d00001 diff --git a/content/method/figures/roll_aoc_roc.py b/content/method/figures/roll_aoc_roc.py new file mode 100644 index 0000000..0c9b330 --- /dev/null +++ b/content/method/figures/roll_aoc_roc.py @@ -0,0 +1,96 @@ +""" +ROC curve illustration for ROLL-AOC. + +Shows how ROLL-AOC converts the single-threshold ROLL into AUC optimization: +- ROC curve traced by sweeping threshold τ +- 10 evenly-spaced FPR sample points (as ROLL evaluates in miniature) +- Green shaded region = AUC (area under curve, what we maximize) +- Red shaded region = AOC = 1 − AUC (area over curve, the loss we minimize) +- Vertical segments = per-threshold loss 1 − TPR(αᵢ), one per sampled FPR + +Run from the thesis root: + nix develop --command python3 content/method/figures/roll_aoc_roc.py +""" + +import numpy as np +import matplotlib +matplotlib.use("Agg") +import matplotlib.pyplot as plt +from scipy.stats import norm + +OUT_DIR = "content/method/figures" + +# --- Parameters (same distributions as roll_principle.py) ------------------ +mu0, sig0 = 0.0, 1.00 +mu1, sig1 = 1.5, 1.00 + +# --- ROC curve ------------------------------------------------------------- +# Sweep τ from high to low → FPR rises from 0 to 1 +tau_grid = np.linspace(norm.ppf(0.9999, mu0, sig0), + norm.ppf(0.0001, mu0, sig0), 3000) +fpr_curve = 1.0 - norm.cdf(tau_grid, mu0, sig0) +tpr_curve = 1.0 - norm.cdf(tau_grid, mu1, sig1) + +# Pin endpoints so the fill covers the full unit square correctly +fpr_full = np.concatenate([[0.0], fpr_curve, [1.0]]) +tpr_full = np.concatenate([[0.0], tpr_curve, [1.0]]) + +auc = float(np.trapezoid(tpr_full, fpr_full)) + +# --- 10 sample FPR points: αᵢ = i/11 for i = 1…10 ------------------------ +n_samples = 10 +alpha_s = np.array([(i / (n_samples + 1)) for i in range(1, n_samples + 1)]) +tpr_s = np.interp(alpha_s, fpr_full, tpr_full) + +# --- Palette (matches roll_principle.py) ----------------------------------- +C_POS = "#CC6633" # ROC curve (positive-class colour) +C_GREEN = "#44AA77" # AUC fill +C_RED = "#BB3333" # AOC fill / vertical segments +C_DOT = "#333333" # sample dots + +# ── Figure ───────────────────────────────────────────────────────────────── +fig, ax = plt.subplots(figsize=(4.8, 4.4)) + +# Random-classifier diagonal +ax.plot([0, 1], [0, 1], color="#AAAAAA", linestyle="--", + linewidth=0.9, zorder=1, label="Random classifier") + +# AUC — green fill under ROC curve +ax.fill_between(fpr_full, 0, tpr_full, + color=C_GREEN, alpha=0.25, zorder=2, + label=rf"AUC $\approx$ {auc:.2f} (maximize)") + +# AOC — red fill above ROC curve +ax.fill_between(fpr_full, tpr_full, 1.0, + color=C_RED, alpha=0.22, zorder=2, + label=r"AOC $= 1-\mathrm{AUC}$ (minimize)") + +# ROC curve itself +ax.plot(fpr_full, tpr_full, color=C_POS, linewidth=2.0, zorder=3, + label="ROC curve") + +# Per-threshold loss segments: vertical from TPR(αᵢ) up to 1 +for a_i, t_i in zip(alpha_s, tpr_s): + ax.plot([a_i, a_i], [t_i, 1.0], + color=C_RED, linewidth=1.0, alpha=0.55, zorder=4) + +# Sample dots on the ROC curve +ax.scatter(alpha_s, tpr_s, + color=C_DOT, s=35, zorder=5, + label=r"Sampled $\alpha_i$ (ROLL evaluations)") + +# --- Axes / labels --------------------------------------------------------- +ax.set_xlabel(r"FPR $(\alpha)$", fontsize=9) +ax.set_ylabel(r"TPR", fontsize=9) +ax.set_xlim(0.0, 1.0) +ax.set_ylim(0.0, 1.0) +ax.set_aspect("equal") +ax.tick_params(labelsize=8) +ax.spines[["top", "right"]].set_visible(False) +ax.legend(fontsize=7.5, loc="lower right", framealpha=0.88) + +fig.tight_layout() +fig.savefig(f"{OUT_DIR}/roll_aoc_roc.pdf", bbox_inches="tight") +fig.savefig(f"{OUT_DIR}/roll_aoc_roc.png", bbox_inches="tight", dpi=180) +print(f"Saved to {OUT_DIR}/roll_aoc_roc.{{pdf,png}}") +print(f"AUC = {auc:.4f} AOC = {1-auc:.4f}") diff --git a/content/method/method.tex b/content/method/method.tex index 1f440b3..8e6487e 100644 --- a/content/method/method.tex +++ b/content/method/method.tex @@ -73,7 +73,7 @@ In practice, however, making these evaluations differentiable is not straightfor % common surrogates (AUC proxies, hinge-based losses) only indirectly target % the operating point a practitioner cares about. -Directly optimizing TPR for FPR, or vice versa, is an indefferentiable problem. +Directly optimizing TPR for FPR, or vice versa, is a non-differentiable problem. For this sub-section, we will reffer to an example of maximizing TPR given a fixed FPR, though this can be reversed. @@ -87,7 +87,7 @@ There are two inherent steps built-in to our methods: \begin{itemize} \item Based on fixed rate, calculate threshold that gives said rate. - For example, when fixing FPR = $\alpha$, find some threshold $\tau$ s.t. $\mathbb{E}[1_{f_{\theta}\mathbf{x}_i > \tau | y_i = 0}] = \alpha$ + For example, when fixing FPR = $\alpha$, find some threshold $\tau$ such that $\mathbb{E}[\mathbf{1}[f_\theta(\mathbf{x}_i) > \tau \mid y_i = 0]] = \alpha$ \item Given the calculated threshold, calculate the rate we would like to maximize (in our example, maximize TPR) \end{itemize} @@ -113,8 +113,8 @@ This necessitates a different approach, to make these calculations differentiabl The way to overcome this problem in differentiability is not to calculate the TPR and FPR directly, but to estimate them by fitting probability distributions to the score output of the model at -every step. Contiguous probability distributions are contiguous w.r.t their defining parameters, and a derivation of the parameters w.r.t the distributions themselves can be made. -Additionally, we can calculate the TPR, FPR given the probability distributions CDF and ICDF functions. If we can gaurantee these functions to be differentiable, which proved to be the main challenge of this work, we can gaurantee the entire process to be differentiable. Once we do so, a derivative of the scores themselves w.r.t. the loss can be acheived. +every step. Continuous probability distributions are continuous with respect to their defining parameters, and a derivation of the parameters with respect to the distributions themselves can be made. +Additionally, we can calculate the TPR, FPR given the probability distributions CDF and ICDF functions. If we can guarantee these functions to be differentiable, which proved to be the main challenge of this work, we can guarantee the entire process to be differentiable. Once we do so, a derivative of the scores themselves with respect to the loss can be achieved. \subsection{Per-Threshold ROLL Loss} @@ -163,7 +163,7 @@ Using this notation, at a threshold $\tau$: \begin{align} \operatorname{TPR}(\tau) &= 1 - \hat{F}_1(\tau), \label{eq:tpr-cdf} \\ \operatorname{FPR}(\tau) &= 1 - \hat{F}_0(\tau). \label{eq:fpr-cdf} -\end{align}t +\end{align} Let $\hat{F}_1^{-1}$ and $\hat{F}_0^{-1}$ denote the quantile functions of $P_{\hat{\phi}_1}$ and $P_{\hat{\phi}_0}$, respectively. The threshold achieving a target TPR of $\alpha$ follows directly @@ -273,8 +273,7 @@ $1 - \operatorname{AUC}$. Since $1 - \operatorname{TPR}(\alpha) = \begin{equation} \mathcal{L}_{\text{AOC}} = \int_0^1\mathcal{L}_{\text{ROLL-TPR@FPR}}(\alpha)\,d\alpha. \end{equation} -Direct integration is not tractable, but the integral is well-approximated by a Riemann -sum. Evaluating at 99 evenly-spaced FPR values $\alpha = i/100$ for $i = 1, \ldots, 99$ +Direct integration is not tractable, but the integral is well-approximated by averaging out sampled points. Evaluating at 99 evenly-spaced FPR values $\alpha = i/100$ for $i = 1, \ldots, 99$ (excluding the degenerate endpoints 0 and 1), the ROLL-AOC loss is: \begin{equation} \mathcal{L}_{\text{ROLL-AOC}} = \frac{1}{99}\sum_{i=1}^{99}\mathcal{L}_{\text{ROLL-TPR@FPR}}\!\left(\frac{i}{100}\right) @@ -291,6 +290,25 @@ The concrete per-threshold gradient for the KDE instantiation is derived in \Cref{sec:roll-instantiations}; gradients for the parametric cases are in \Cref{appendix:gauss-grad,appendix:beta-roll}. +\Cref{fig:roll-aoc-roc} gives a geometric view of this objective. + +\begin{figure}[H] + \centering + \includegraphics[width=0.62\textwidth]{content/method/figures/roll_aoc_roc.pdf} + \caption{Geometric interpretation of ROLL-AOC. The ROC curve (orange) maps + each FPR value $\alpha$ to $\operatorname{TPR}(\alpha)$. + \textbf{Green}: area under the curve (AUC), the quantity we maximize. + \textbf{Red}: area over the curve + ($\mathrm{AOC} = 1 - \mathrm{AUC} = \mathcal{L}_{\text{ROLL-AOC}}$), + the loss we minimize. + Dots mark 10 evenly-spaced FPR sample points $\alpha_i$; vertical + segments show the per-threshold loss contribution + $1 - \operatorname{TPR}(\alpha_i) = \mathcal{L}_{\text{ROLL-TPR@FPR}}(\alpha_i)$ + at each point. Averaging these contributions (99 in practice, 10 shown + for clarity) gives the value of \eqref{eq:roll-aoc}.} + \label{fig:roll-aoc-roc} +\end{figure} + %------------------------------------------------ @@ -336,7 +354,7 @@ As before, to calculate the loss, we calculate: \mathcal{L}_{\text{ROLL-TPR@FPR}}^{\text{KDE}}(f_{\theta}(\mathcal{B}) ; \alpha) = \hat{F}_1(\hat{F}_0^{-1}(1-\alpha)) \] -To calculate this, we first define the kernel function as $\sigma '$, and the CDF of the kernel function as $\sigma$. The approach used here is to define $\sigma$ as a sigmoid function,. +To calculate this, we first define the kernel function as $\sigma '$, and the CDF of the kernel function as $\sigma$. The approach used here is to define $\sigma$ as a sigmoid function. \begin{equation} \sigma(x ; v) = \left( 1 + \exp(-vx)\right)^{-1} \qquad \sigma'(x ; v) = \frac{v \cdot \exp(-v \cdot x)}{(1 + \exp(-vx))^2} @@ -358,9 +376,9 @@ We use bisection, which requires no derivative evaluation and is guaranteed to c for any strictly monotone CDF; the bracket construction and iteration are detailed in Appendix~\ref{appendix:kde-bisection}. -We can now relatively easily calculate $\hat{F}_1(\tau ; \mathbf{X}_1)$ using the formulat for $\hat{F}_{KDE}(\tau ; \mathbf{X})$ above. +We can now trivially compute $\hat{F}_1(\tau ; \mathbf{X}_1)$ using the formula for $\hat{F}_{KDE}(\tau ; \mathbf{X})$ above. -Importantly, we must save the calculation of $\tau$ for the backward derivation, as well as the calculated bandwidths $v_1, v_0$. +Note that $\tau$ is cached for use in the backward pass, along with the computed bandwidths $v_1, v_0$. \subsubsection{Gradient Derivation} @@ -408,7 +426,7 @@ A structural consequence of the ROLL formulation is that gradient mass is automa balanced between the two classes, regardless of their relative sizes in the batch. This stands in contrast to standard losses such as cross-entropy, where the total gradient contribution from each class is proportional to its count, making heavy class imbalance -a direct source of biased updates. Therefor, instead of needing to compensate for this +a direct source of biased updates. Therefore, instead of needing to compensate for this with loss-weighting per-class, fitting updates are made based equally off the results of both classes. @@ -430,44 +448,7 @@ independently of $|\mathcal{B}_0|$ and $|\mathcal{B}_1|$. \end{proposition} \begin{proof} -We treat each class separately via a uniform-shift argument. - -\medskip\noindent\textit{Sum over $\mathcal{B}_0$.} -From \Cref{eq:roll-gradient}, for $y_i = 0$: -\[ - \frac{\partial \mathcal{L}}{\partial f_\theta(\mathbf{x}_i)} - = \frac{\partial \hat{F}_1(\tau)}{\partial \tau} - \cdot \frac{\partial \tau}{\partial f_\theta(\mathbf{x}_i)} -\] -We claim $\sum_{\mathbf{x}_i \in \mathcal{B}_0}\frac{\partial \tau}{\partial f_\theta(\mathbf{x}_i)} = 1$. -Shift all negative scores uniformly: $f_\theta(\mathbf{x}_i) \to f_\theta(\mathbf{x}_i) + \delta$ for -$\mathbf{x}_i \in \mathcal{B}_0$. By translation invariance, $\hat{F}_0$ simply translates, so -$\tau = \hat{F}_0^{-1}(1-\alpha)$ shifts by exactly $\delta$. Differentiating with respect to $\delta$ at -$\delta = 0$: -\[ - 1 = \frac{\mathrm{d}\tau}{\mathrm{d}\delta}\bigg|_{\delta=0} - = \sum_{\mathbf{x}_i \in \mathcal{B}_0} \frac{\partial \tau}{\partial f_\theta(\mathbf{x}_i)} -\] -Summing the $y_i = 0$ gradients therefore gives: -\begin{equation} - \sum_{\mathbf{x}_i \in \mathcal{B}_0} - \frac{\partial \mathcal{L}}{\partial f_\theta(\mathbf{x}_i)} - = \frac{\partial \hat{F}_1(\tau)}{\partial \tau} \cdot 1 - = \frac{\partial \hat{F}_1(\tau)}{\partial \tau} - \label{eq:grad-balance-b0} -\end{equation} - -\medskip\noindent\textit{Sum over $\mathcal{B}_1$.} -For $y_i = 1$, $\frac{\partial \mathcal{L}}{\partial f_\theta(\mathbf{x}_i)} = \frac{\partial \hat{F}_1(\tau)}{\partial f_\theta(\mathbf{x}_i)}$. -Shifting all positive scores by $\delta$ and applying translation invariance of $\hat{F}_1$: -$\hat{F}_1(\tau\,;\,\mathbf{s}+\delta\mathbf{1}) = \hat{F}_1(\tau-\delta\,;\,\mathbf{s})$. -Differentiating at $\delta = 0$: -\[ - \sum_{\mathbf{x}_i \in \mathcal{B}_1} - \frac{\partial \hat{F}_1(\tau)}{\partial f_\theta(\mathbf{x}_i)} - = -\frac{\partial \hat{F}_1(\tau)}{\partial \tau} -\] -Combining with \eqref{eq:grad-balance-b0} gives \eqref{eq:grad-balance}. +See \Cref{appendix:grad-balance}. \end{proof} The translation-invariance assumption holds for both the Gaussian distribution, @@ -479,7 +460,7 @@ is equivalent to an equal shift in $\tau$. The condition is necessary: without i score shift need not produce a rigid translation of $\hat{F}_k$, so the shift argument in the proof breaks down and the gradient sums need not be equal. -The Beta distribution only accepts values in the interval $\[0, 1\]$. Since it +The Beta distribution only accepts values in the interval $[0, 1]$. Since it is mapped only over an interval, the translation-invariance assumption does not hold for this distribution. @@ -625,5 +606,3 @@ distribution, producing very low gradient magnitudes and stalling convergence. The solution was to use a bandwidth scheduler. Starting with large bandwidths resulted in gradients that spread out more evenly across all scores, and fewer non-convergence runs occurred. The bandwidth scheduler artificially scales up the bandwidth at the beginning to speed up initial training, and then tapers back to restore the intended bandwidth in order to maximise results. - -% TODO: algorithm box — full training loop (forward → ROLL loss → custom backward → weight update) diff --git a/content/related_work/related_work.tex b/content/related_work/related_work.tex index 4d66540..e64b04b 100644 --- a/content/related_work/related_work.tex +++ b/content/related_work/related_work.tex @@ -62,9 +62,9 @@ where $x_1 \sim \mathcal{D}_1$ and $x_0 \sim \mathcal{D}_0$ are drawn independen \subsection{AUC as a metric of model performance} -The AUC is a direct representation of the performance of a classifier, as opposed to a loss. There are instances where the loss may be minimized, yet seperation might be minimal. These two metrics might correlate, but do not necessarily correspond. +The AUC is a direct representation of the performance of a classifier, as opposed to a loss. There are instances where the loss may be minimized, yet separation might be minimal. These two metrics might correlate, but do not necessarily correspond. -An example of this is a result for which all true samples receive a score of $0.51$ and all false samples receie a score of $0.49$. Using many losses, including BCE, this would result in a relatively high loss value. On this score however, the AUC is $1$. The model perfectly seperates the samples, so further training is not necessary. +An example of this is a result for which all true samples receive a score of $0.51$ and all false samples receive a score of $0.49$. Using many losses, including BCE, this would result in a relatively high loss value. On this score however, the AUC is $1$. The model perfectly separates the samples, so further training is not necessary. Direct AUC optimization can be ideal with optimizing for imbalanced datasets. With most losses such as BCE or focal, the loss is calculated per-sample and then summed (or averaged). In order to properly train for both true and false populations, the scores are weighted, so that equal weight falls on both the true and the false populations. With direct AUC optimization, the imbalance does not affect the calculation, and the reweighting can be forgone. @@ -72,9 +72,9 @@ The noise-robustness properties of ranking-based objectives are discussed in \Cr \subsection{AUC optimization in literature} -While AUC as a metric for model performance has existed for a while, methods to optimize for it directly are relatively recent. At it's core, it is a non-trivial problem to solve. Existing efforts to directly optimize AUC have been based on the Wilcoxon-Mann-Whitney interpretation of AUC. However, directly calculating the afformentioned probability of a random positive score behing higher than a negative one introduces two complications. The first is that one must iterate over $n^2$ pairs to cover every posible pair. Additionally, the pairwise function one must evaluate ( $\mathbb{P}(f(x_1) > f(x_0))$ ) is a non-contiguous stepwise function, and is therefor on-differentiable. +While AUC as a metric for model performance has existed for a while, methods to optimize for it directly are relatively recent. At it's core, it is a non-trivial problem to solve. Existing efforts to directly optimize AUC have been based on the Wilcoxon-Mann-Whitney interpretation of AUC. However, directly calculating the aforementioned probability of a random positive score being higher than a negative one introduces two complications. The first is that one must iterate over $n^2$ pairs to cover every possible pair. Additionally, the pairwise function one must evaluate ($\mathbb{P}(f(x_1) > f(x_0))$) is a discontinuous stepwise function, and is therefore non-differentiable. -The non-contiguous stepwise nature of the evaluated pairwise function is generally fixed by using a surrogate, either sigmoid-like or hinge functions are applied to the score difference~\cite{cortes2003auc}. +The discontinuous stepwise nature of the evaluated pairwise function is generally addressed by using a surrogate, either sigmoid-like or hinge functions are applied to the score difference~\cite{cortes2003auc}. \citet{yuan2021auc} proposed a compositional stochastic gradient framework that reformulates AUC maximization as a min-max saddle-point problem, enabling mini-batch training without maintaining all pairwise scores in memory. Their PESG optimizer and the LibAUC library are the primary practical tools for deep AUC maximization and serve as the main AUC baseline in this thesis. % ============================================================ @@ -182,7 +182,11 @@ Intermediate values therefore trade noise tolerance for faster convergence. We evaluate GCE at $q = 0.7$ as a baseline in the Experiments chapter. \citet{zhou2021asymmetric} extend the theoretical framework to asymmetric noise, introducing the \emph{asymmetry ratio} to quantify how noise tolerance degrades when flip rates differ -between classes. +between classes, and propose an asymmetric loss that applies distinct focusing parameters to +positive and negative samples: easy negatives are downweighted more aggressively than positives, +counteracting both gradient dominance from numerous easy negatives in imbalanced settings and +the increased noise sensitivity that comes with symmetric focusing. +This asymmetric loss is evaluated as a baseline (\textbf{Asym.}) in \Cref{chapter:experiments}. \citet{feng2020can} confirm that standard cross-entropy cannot be made noise-tolerant through simple modification, establishing robust losses as a genuinely distinct family rather than a patch on existing objectives. @@ -265,13 +269,13 @@ This gives the KDE cumulative distribution function a closed form as well: It is rare for a dataset to have an equal amount of true and false samples. Class imbalance is something that must be taken into account during training on most datasets. Extreme imbalance exacerbates this issue further - for a dataset with an imbalance ratio of $100$, -a \emph{constant} classifier (outputting only the most probable class) acheives a very good result. +a \emph{constant} classifier (outputting only the most probable class) achieves a very good result. Without correction, many learning methods will find a local minima in a relatively trivial solution, such as constant output, and have a hard time adjusting. Even if not in this local minima, less emphasis is put on the rare class during training, as it contributes less to the loss metric, and the model tends to generalize on the rare class poorly. -Dealing with this depends on the loss used. For most losses, for which the loss for each sample is calculated seperately, +Dealing with this depends on the loss used. For most losses, for which the loss for each sample is calculated separately, the solution is to simply weight the losses for each class differently, by multiplying the loss for the rare class so that it contributes equally. Other approaches using pairwise losses, such as those implemented in LibAUC \cite{yuan2021auc}, naturally weight positive and negative contributions to learning through their implementation. @@ -323,7 +327,7 @@ The NP lemma provides the theoretically optimal solution but assumes the class-c $p(\mathbf{x} \mid y=0)$ and $p(\mathbf{x} \mid y=1)$ are known. In practice these densities must be estimated from data. A model must be fit to the data in order to estimate these probabilities, meaning that -there is no gaurantee on optimality. +there is no guarantee on optimality. Further work regarding \emph{Neyman-Pearson classification} adapts the NP principle to the finite-sample setting using nonparametric methods diff --git a/main.tex b/main.tex index e720b75..0fda90d 100644 --- a/main.tex +++ b/main.tex @@ -192,7 +192,7 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %Title and names for the article -\newcommand{\thesistitle}{\textbf{Noise-Robust Gradient-Based Learning Utilizing Rate Optimized Likelyhood Loss}} +\newcommand{\thesistitle}{\textbf{Noise-Robust Gradient-Based Learning Utilizing Rate Optimized Likelihood Loss}} \newcommand{\thesistitlehe}{\textbf{למידה עמידה לרעש מבוססת גרדיאנט תוך שימוש בפונקציית הפסד קירוב-הסתברות}} \newcommand{\thesisauthorname}{\textbf{Aner Zakobar}} @@ -256,46 +256,51 @@ \begin{appendices} -\chapter{Some title for apendix A} -\label{appendix:numerically_distinguished_comp} -\addtocontents{tocheb}{\contentsline{chapter}{\protect\numberline{נספח א}{\quad\qquadדרישת תאימות כלשהי}}{{\beginL\thepage\endL}}} -\input{content/appendixs/appendix_a} - \chapter{Gaussian ROLL: Forward Pass and Gradient Derivation} \label{appendix:gauss-grad} -\addtocontents{tocheb}{\contentsline{chapter}{\protect\numberline{נספח ב}{\quad\qquadנגזרת גאוסיאנית של ROLL}}{{\beginL\thepage\endL}}} +\addtocontents{tocheb}{\contentsline{chapter}{\protect\numberline{נספח א}{\quad\qquadנגזרת גאוסיאנית של ROLL}}{{\beginL\thepage\endL}}} \input{content/appendixs/appendix_gauss_grad} \chapter{Beta ROLL: Forward Pass and Gradient} \label{appendix:beta-roll} -\addtocontents{tocheb}{\contentsline{chapter}{\protect\numberline{נספח ג}{\quad\qquadBeta ROLL: אמידה ונגזרת}}{{\beginL\thepage\endL}}} +\addtocontents{tocheb}{\contentsline{chapter}{\protect\numberline{נספח ב}{\quad\qquadBeta ROLL: אמידה ונגזרת}}{{\beginL\thepage\endL}}} \input{content/appendixs/appendix_beta_roll} \chapter{KDE ROLL: Gradient Derivation} \label{appendix:kde-grad} -\addtocontents{tocheb}{\contentsline{chapter}{\protect\numberline{נספח ד}{\quad\qquadנגזרת KDE של ROLL}}{{\beginL\thepage\endL}}} +\addtocontents{tocheb}{\contentsline{chapter}{\protect\numberline{נספח ג}{\quad\qquadנגזרת KDE של ROLL}}{{\beginL\thepage\endL}}} \input{content/appendixs/appendix_kde_grad} \chapter{KDE ROLL: Sigmoid Kernel — Explicit Equations} \label{appendix:kde-sigmoid} -\addtocontents{tocheb}{\contentsline{chapter}{\protect\numberline{נספח ה}{\quad\qquadKDE ROLL: ניסוח מפורש עם גרעין סיגמואיד}}{{\beginL\thepage\endL}}} +\addtocontents{tocheb}{\contentsline{chapter}{\protect\numberline{נספח ד}{\quad\qquadKDE ROLL: ניסוח מפורש עם גרעין סיגמואיד}}{{\beginL\thepage\endL}}} \input{content/appendixs/appendix_kde_sigmoid} \chapter{KDE ROLL: Bisection for CDF Inversion} \label{appendix:kde-bisection} -\addtocontents{tocheb}{\contentsline{chapter}{\protect\numberline{נספח ו}{\quad\qquadKDE ROLL: היפוך CDF בשיטת חצייה}}{{\beginL\thepage\endL}}} +\addtocontents{tocheb}{\contentsline{chapter}{\protect\numberline{נספח ה}{\quad\qquadKDE ROLL: היפוך CDF בשיטת חצייה}}{{\beginL\thepage\endL}}} \input{content/appendixs/appendix_kde_bisection} \chapter{KDE ROLL: Newton--Raphson Inversion (Superseded)} \label{appendix:kde-nr} -\addtocontents{tocheb}{\contentsline{chapter}{\protect\numberline{נספח ז}{\quad\qquadKDE ROLL: היפוך ניוטון-רפסון}}{{\beginL\thepage\endL}}} +\addtocontents{tocheb}{\contentsline{chapter}{\protect\numberline{נספח ו}{\quad\qquadKDE ROLL: היפוך ניוטון-רפסון}}{{\beginL\thepage\endL}}} \input{content/appendixs/appendix_kde_nr} \chapter{ROLL Loss: Implementation Listing} \label{appendix:roll-code} -\addtocontents{tocheb}{\contentsline{chapter}{\protect\numberline{נספח ח}{\quad\qquadROLL: קוד מימוש}}{{\beginL\thepage\endL}}} +\addtocontents{tocheb}{\contentsline{chapter}{\protect\numberline{נספח ז}{\quad\qquadROLL: קוד מימוש}}{{\beginL\thepage\endL}}} \input{content/appendixs/appendix_roll_code} +\chapter{KEEL Benchmark: Noise Tables at 5\% and 10\%} +\label{appendix:keel-noise} +\addtocontents{tocheb}{\contentsline{chapter}{\protect\numberline{נספח ח}{\quad\qquadKEEL: טבלאות רעש 5\% ו-10\%}}{{\beginL\thepage\endL}}} +\input{content/appendixs/appendix_keel_noise} + +\chapter{Proof of the Gradient Balance Proposition} +\label{appendix:grad-balance} +\addtocontents{tocheb}{\contentsline{chapter}{\protect\numberline{נספח ט}{\quad\qquadהוכחת טענת איזון הגרדיאנט}}{{\beginL\thepage\endL}}} +\input{content/appendixs/appendix_grad_balance} + \end{appendices} %~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~%