Spaces:
Running
Running
Commit Β·
a28b2ed
1
Parent(s): faba353
Table view polish: gold/silver/bronze shimmer + wider sweep + all 8 metrics
Browse files- Table view re-rendered as HTML with per-cell rank badges (top-3 per column
get a small gold/silver/bronze 01/02/03 chip in the top-left)
- Top-3 cells get a rich diagonal gradient (gold / silver / bronze) plus a
wide soft animated reflection sweeping across (variant B: 140% width,
multi-stop bright peak, ~5.6s linear loop, staggered per rank)
- Table-layout: fixed with equal-width metric columns; model column 22%
- All 8 metrics in the table (Accuracy, AUC, F1, Precision, Recall,
Cross-entropy, Elo, % over XGBoost). Cache rebuilt to 72 combos.
- Cross-entropy sorts ascending (lower-is-better)
- Drop the "Evaluation / Public datasets" tag chips from the section header
- Intro: add the ~190 OpenML classification datasets framing
- app.py +206 -30
- build_figures_cache.py +2 -2
- figures_cache.json +0 -0
app.py
CHANGED
|
@@ -750,6 +750,137 @@ body, .gradio-container, .prose, button, input, select, textarea {
|
|
| 750 |
.nk-bar-plot .modebar-container,
|
| 751 |
.nk-bar-plot .js-plotly-plot .plotly .modebar { display: none !important; }
|
| 752 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 753 |
/* Filter frame: visually group all filter controls together */
|
| 754 |
.nk-filter-frame {
|
| 755 |
border: 1px solid var(--nk-line) !important;
|
|
@@ -1310,7 +1441,7 @@ with gr.Blocks(css=css, theme=nk_theme, head=NAV_HEAD_JS) as demo:
|
|
| 1310 |
"""
|
| 1311 |
Tabular foundation models β TabPFN, TabICL, TabDPT, Seldon, Mitra, Limix, and others β are the most active frontier in tabular ML. They promise general-purpose performance without per-task training, but it's hard to tell which ones actually deliver, and where.
|
| 1312 |
|
| 1313 |
-
**TabBench is a benchmark dedicated to tracking that frontier.** We evaluate every released tabular foundation model on
|
| 1314 |
|
| 1315 |
Pick a vertical to see which model leads, browse the per-model scores in the table view, or read the methodology below for evaluation details.
|
| 1316 |
"""
|
|
@@ -1347,7 +1478,7 @@ with gr.Blocks(css=css, theme=nk_theme, head=NAV_HEAD_JS) as demo:
|
|
| 1347 |
_rows_min = int(public_per_dataset_with_meta['rows'].min())
|
| 1348 |
_rows_max = int(public_per_dataset_with_meta['rows'].max())
|
| 1349 |
|
| 1350 |
-
gr.Markdown('## <span class="nk-num">02</span>Leaderboard
|
| 1351 |
gr.Markdown(' ')
|
| 1352 |
|
| 1353 |
# Filter band: ONE frame, three rows ---------------------
|
|
@@ -1419,29 +1550,71 @@ with gr.Blocks(css=css, theme=nk_theme, head=NAV_HEAD_JS) as demo:
|
|
| 1419 |
elem_classes=["nk-bar-plot"],
|
| 1420 |
visible=True,
|
| 1421 |
)
|
| 1422 |
-
|
| 1423 |
-
|
| 1424 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1425 |
"Cross_entropy": "Cross-entropy",
|
| 1426 |
-
"Elo_score": "Elo",
|
| 1427 |
-
|
| 1428 |
-
}
|
| 1429 |
-
|
| 1430 |
-
|
| 1431 |
-
|
| 1432 |
-
|
| 1433 |
-
|
| 1434 |
-
|
| 1435 |
-
|
| 1436 |
-
|
| 1437 |
-
|
| 1438 |
-
|
| 1439 |
-
|
| 1440 |
-
|
| 1441 |
-
|
| 1442 |
-
|
| 1443 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1444 |
visible=False,
|
|
|
|
| 1445 |
)
|
| 1446 |
|
| 1447 |
# Load pre-built figures cache built by build_figures_cache.py.
|
|
@@ -1462,7 +1635,7 @@ with gr.Blocks(css=css, theme=nk_theme, head=NAV_HEAD_JS) as demo:
|
|
| 1462 |
df = df[(df['features'].fillna(0) >= min_features) &
|
| 1463 |
(df['rows'].fillna(0) >= min_samples)]
|
| 1464 |
if df.empty:
|
| 1465 |
-
empty = pd.DataFrame(columns=['model', 'Accuracy', 'AUC', 'Elo_score', '%β over XGBoost'])
|
| 1466 |
return empty, df
|
| 1467 |
df = compute_elo_for_subset(df, metric="Accuracy")
|
| 1468 |
df = compute_pct_improvement_over_baseline(df, baseline_model="xgboost", metric="Accuracy")
|
|
@@ -1518,10 +1691,12 @@ with gr.Blocks(css=css, theme=nk_theme, head=NAV_HEAD_JS) as demo:
|
|
| 1518 |
|
| 1519 |
if use_cache and view == "Table":
|
| 1520 |
table = pd.DataFrame(_figures_cache[raw]["table"])
|
| 1521 |
-
|
|
|
|
|
|
|
| 1522 |
return (
|
| 1523 |
gr.update(visible=False),
|
| 1524 |
-
gr.update(visible=True, value=
|
| 1525 |
)
|
| 1526 |
|
| 1527 |
# Slow path: any non-default slider β compute live.
|
|
@@ -1536,10 +1711,11 @@ with gr.Blocks(css=css, theme=nk_theme, head=NAV_HEAD_JS) as demo:
|
|
| 1536 |
gr.update(visible=False),
|
| 1537 |
)
|
| 1538 |
else:
|
| 1539 |
-
|
|
|
|
| 1540 |
return (
|
| 1541 |
gr.update(visible=False),
|
| 1542 |
-
gr.update(visible=True, value=
|
| 1543 |
)
|
| 1544 |
|
| 1545 |
_filter_inputs = [view_selector, metric_selector, industry_selector, features_slider, samples_slider]
|
|
@@ -1580,7 +1756,7 @@ with gr.Blocks(css=css, theme=nk_theme, head=NAV_HEAD_JS) as demo:
|
|
| 1580 |
gr.Markdown("""
|
| 1581 |
- **Neuralk** β [neuralk.ai](https://www.neuralk.ai/)
|
| 1582 |
- **Package documentation** β [docs.neuralk-ai.com/api](https://docs.neuralk-ai.com/api/)
|
| 1583 |
-
- **Previous
|
| 1584 |
""")
|
| 1585 |
|
| 1586 |
# Hidden placeholders so the rest of the navigation wiring
|
|
@@ -2105,4 +2281,4 @@ with gr.Blocks(css=css, theme=nk_theme, head=NAV_HEAD_JS) as demo:
|
|
| 2105 |
# appropriate nav button when the user hits Back/Forward. Also, if the URL
|
| 2106 |
# already has a #hash on first load, navigate to that pane.
|
| 2107 |
|
| 2108 |
-
demo.launch(ssr_mode=False, share=False)
|
|
|
|
| 750 |
.nk-bar-plot .modebar-container,
|
| 751 |
.nk-bar-plot .js-plotly-plot .plotly .modebar { display: none !important; }
|
| 752 |
|
| 753 |
+
/* ===== Leaderboard table view (HTML, with per-cell rank badge) ===== */
|
| 754 |
+
.nk-lb-wrap { padding: 0 !important; }
|
| 755 |
+
.nk-empty-table {
|
| 756 |
+
padding: 32px; text-align: center; color: var(--nk-muted);
|
| 757 |
+
font-family: 'Geist Mono', monospace; font-size: 12px;
|
| 758 |
+
}
|
| 759 |
+
table.nk-lb {
|
| 760 |
+
width: 100%;
|
| 761 |
+
border-collapse: collapse;
|
| 762 |
+
background: var(--nk-surface);
|
| 763 |
+
border: 1px solid var(--nk-line);
|
| 764 |
+
border-radius: 10px;
|
| 765 |
+
overflow: hidden;
|
| 766 |
+
font-family: 'Geist Mono', monospace;
|
| 767 |
+
table-layout: fixed; /* equal-width metric columns */
|
| 768 |
+
}
|
| 769 |
+
/* Model column gets more room; the rest split the remainder equally. */
|
| 770 |
+
table.nk-lb th.mdl, table.nk-lb td.mdl { width: 22%; }
|
| 771 |
+
table.nk-lb th:not(.mdl), table.nk-lb td:not(.mdl) { width: auto; }
|
| 772 |
+
table.nk-lb th {
|
| 773 |
+
font-size: 11px; text-transform: uppercase; letter-spacing: 0.04em;
|
| 774 |
+
padding: 10px 14px; text-align: right; color: var(--nk-muted);
|
| 775 |
+
border-bottom: 1px solid var(--nk-line);
|
| 776 |
+
background: var(--nk-surface);
|
| 777 |
+
font-weight: 500;
|
| 778 |
+
}
|
| 779 |
+
table.nk-lb th.mdl { text-align: left; }
|
| 780 |
+
table.nk-lb td {
|
| 781 |
+
padding: 14px 18px;
|
| 782 |
+
font-size: 13px;
|
| 783 |
+
text-align: right;
|
| 784 |
+
border-bottom: 1px solid var(--nk-line);
|
| 785 |
+
position: relative;
|
| 786 |
+
vertical-align: middle;
|
| 787 |
+
color: var(--nk-ink);
|
| 788 |
+
overflow: hidden; /* clip shimmer overlay */
|
| 789 |
+
}
|
| 790 |
+
table.nk-lb td.mdl {
|
| 791 |
+
text-align: left;
|
| 792 |
+
font-family: 'BDO Grotesk', 'Inter', sans-serif;
|
| 793 |
+
font-weight: 500;
|
| 794 |
+
overflow: visible;
|
| 795 |
+
}
|
| 796 |
+
table.nk-lb tr:last-child td { border-bottom: none; }
|
| 797 |
+
table.nk-lb tr:hover td:not(.plated) { background: var(--nk-hover); }
|
| 798 |
+
|
| 799 |
+
/* Top-left rank-badge */
|
| 800 |
+
.nk-rank-badge {
|
| 801 |
+
position: absolute;
|
| 802 |
+
top: 4px; left: 4px;
|
| 803 |
+
display: inline-block;
|
| 804 |
+
font-family: 'Geist Mono', ui-monospace, SFMono-Regular, monospace;
|
| 805 |
+
font-size: 9px;
|
| 806 |
+
font-weight: 500;
|
| 807 |
+
letter-spacing: 0.04em;
|
| 808 |
+
color: #ffffff !important;
|
| 809 |
+
padding: 2px 4px;
|
| 810 |
+
border-radius: 3px;
|
| 811 |
+
line-height: 1;
|
| 812 |
+
z-index: 3;
|
| 813 |
+
box-shadow: 0 1px 2px rgba(6,5,16,0.25);
|
| 814 |
+
}
|
| 815 |
+
.nk-rb-1 { background: linear-gradient(180deg, #d4a72c, #8a6614); }
|
| 816 |
+
.nk-rb-2 { background: linear-gradient(180deg, #7a818c, #4a525c); }
|
| 817 |
+
.nk-rb-3 { background: linear-gradient(180deg, #a06736, #6a3f1a); }
|
| 818 |
+
|
| 819 |
+
/* ===== Top-3 "plated" cells: rich diagonal gradient + animated reflection ===== */
|
| 820 |
+
table.nk-lb td.plated > .val {
|
| 821 |
+
position: relative; z-index: 2;
|
| 822 |
+
text-shadow: 0 1px 0 rgba(255,255,255,0.5);
|
| 823 |
+
}
|
| 824 |
+
.p-1 {
|
| 825 |
+
background:
|
| 826 |
+
radial-gradient(ellipse at 25% 0%, rgba(255,255,255,0.6) 0%, transparent 55%),
|
| 827 |
+
linear-gradient(135deg,
|
| 828 |
+
#fff8d3 0%, #ffeea1 12%, #ffd866 28%, #f5c44e 42%,
|
| 829 |
+
#e0a82b 55%, #f5c44e 68%, #ffd866 82%, #ffeea1 92%, #fff8d3 100%);
|
| 830 |
+
box-shadow:
|
| 831 |
+
inset 0 1px 0 rgba(255,255,255,0.7),
|
| 832 |
+
inset 0 -1px 0 rgba(138,102,20,0.4),
|
| 833 |
+
inset 0 0 0 1px rgba(212,167,44,0.35);
|
| 834 |
+
}
|
| 835 |
+
.p-2 {
|
| 836 |
+
background:
|
| 837 |
+
radial-gradient(ellipse at 25% 0%, rgba(255,255,255,0.6) 0%, transparent 55%),
|
| 838 |
+
linear-gradient(135deg,
|
| 839 |
+
#f6f7f9 0%, #e2e5ea 12%, #c4c9d1 28%, #adb3bd 42%,
|
| 840 |
+
#8a909b 55%, #adb3bd 68%, #c4c9d1 82%, #e2e5ea 92%, #f6f7f9 100%);
|
| 841 |
+
box-shadow:
|
| 842 |
+
inset 0 1px 0 rgba(255,255,255,0.7),
|
| 843 |
+
inset 0 -1px 0 rgba(74,82,92,0.4),
|
| 844 |
+
inset 0 0 0 1px rgba(154,163,173,0.35);
|
| 845 |
+
}
|
| 846 |
+
.p-3 {
|
| 847 |
+
background:
|
| 848 |
+
radial-gradient(ellipse at 25% 0%, rgba(255,255,255,0.55) 0%, transparent 55%),
|
| 849 |
+
linear-gradient(135deg,
|
| 850 |
+
#ffe2cd 0%, #f0bc94 12%, #d99767 28%, #c47e4b 42%,
|
| 851 |
+
#9c5e2c 55%, #c47e4b 68%, #d99767 82%, #f0bc94 92%, #ffe2cd 100%);
|
| 852 |
+
box-shadow:
|
| 853 |
+
inset 0 1px 0 rgba(255,255,255,0.6),
|
| 854 |
+
inset 0 -1px 0 rgba(74,40,15,0.4),
|
| 855 |
+
inset 0 0 0 1px rgba(184,115,51,0.35);
|
| 856 |
+
}
|
| 857 |
+
/* Animated sweeping reflection β wide soft cinematic sweep (variant B) */
|
| 858 |
+
@keyframes nk-shimmer { 0% { left: -180%; } 100% { left: 180%; } }
|
| 859 |
+
.plated::before {
|
| 860 |
+
content: '';
|
| 861 |
+
position: absolute;
|
| 862 |
+
top: -60%; left: -180%;
|
| 863 |
+
width: 140%; height: 220%;
|
| 864 |
+
background: linear-gradient(115deg,
|
| 865 |
+
transparent 10%,
|
| 866 |
+
rgba(255,255,255,0.20) 28%,
|
| 867 |
+
rgba(255,255,255,0.50) 40%,
|
| 868 |
+
rgba(255,255,255,0.85) 47%,
|
| 869 |
+
rgba(255,255,255,1.0) 50%,
|
| 870 |
+
rgba(255,255,255,0.85) 53%,
|
| 871 |
+
rgba(255,255,255,0.50) 60%,
|
| 872 |
+
rgba(255,255,255,0.20) 72%,
|
| 873 |
+
transparent 90%);
|
| 874 |
+
transform: skewX(-18deg);
|
| 875 |
+
pointer-events: none;
|
| 876 |
+
filter: blur(1px);
|
| 877 |
+
animation: nk-shimmer 5.6s linear infinite;
|
| 878 |
+
z-index: 1;
|
| 879 |
+
}
|
| 880 |
+
.p-1::before { animation-delay: 0s; animation-duration: 5s; }
|
| 881 |
+
.p-2::before { animation-delay: 1.6s; animation-duration: 5.8s; }
|
| 882 |
+
.p-3::before { animation-delay: 3.2s; animation-duration: 6.4s; }
|
| 883 |
+
|
| 884 |
/* Filter frame: visually group all filter controls together */
|
| 885 |
.nk-filter-frame {
|
| 886 |
border: 1px solid var(--nk-line) !important;
|
|
|
|
| 1441 |
"""
|
| 1442 |
Tabular foundation models β TabPFN, TabICL, TabDPT, Seldon, Mitra, Limix, and others β are the most active frontier in tabular ML. They promise general-purpose performance without per-task training, but it's hard to tell which ones actually deliver, and where.
|
| 1443 |
|
| 1444 |
+
**TabBench is a benchmark dedicated to tracking that frontier.** We evaluate every released tabular foundation model on **~190 classification datasets curated from OpenML**, spanning healthcare, finance, retail, and other verticals, all filtered to be IID across rows. Foundation models are compared head-to-head against the strongest classical baselines (XGBoost, CatBoost, LightGBM) and tuned neural networks (RealMLP, TabM, ModernNCA).
|
| 1445 |
|
| 1446 |
Pick a vertical to see which model leads, browse the per-model scores in the table view, or read the methodology below for evaluation details.
|
| 1447 |
"""
|
|
|
|
| 1478 |
_rows_min = int(public_per_dataset_with_meta['rows'].min())
|
| 1479 |
_rows_max = int(public_per_dataset_with_meta['rows'].max())
|
| 1480 |
|
| 1481 |
+
gr.Markdown('## <span class="nk-num">02</span>Leaderboard')
|
| 1482 |
gr.Markdown(' ')
|
| 1483 |
|
| 1484 |
# Filter band: ONE frame, three rows ---------------------
|
|
|
|
| 1550 |
elem_classes=["nk-bar-plot"],
|
| 1551 |
visible=True,
|
| 1552 |
)
|
| 1553 |
+
# --- Pretty-display name maps + table HTML builder ---
|
| 1554 |
+
_MODEL_DISPLAY_FULL = {
|
| 1555 |
+
"xgboost": "XGBoost", "catboost": "CatBoost", "lightgbm": "LightGBM",
|
| 1556 |
+
"realmlp": "RealMLP", "tabm": "TabM",
|
| 1557 |
+
"modern_nca": "ModernNCA", "modernnca": "ModernNCA",
|
| 1558 |
+
"tabpfn": "TabPFN v2.5", "tabpfn_2_5": "TabPFN v2.5", "tabpfn_v3": "TabPFN v3.0",
|
| 1559 |
+
"tabicl": "TabICL v1.1", "tabicl_v1": "TabICL v1.1", "tabicl_v2": "TabICL v2.0",
|
| 1560 |
+
"tabdpt": "TabDPT", "limix": "LimiX", "mitra": "Mitra",
|
| 1561 |
+
"seldon": "Seldon", "nicl": "NICL", "sap": "SAP RPT-1",
|
| 1562 |
+
}
|
| 1563 |
+
_METRIC_DISPLAY_FULL = {
|
| 1564 |
+
"Accuracy": "Accuracy", "AUC": "AUC", "F1_score": "F1",
|
| 1565 |
+
"Precision": "Precision", "Recall": "Recall",
|
| 1566 |
"Cross_entropy": "Cross-entropy",
|
| 1567 |
+
"Elo_score": "Elo", "%β over XGBoost": "% over XGBoost",
|
| 1568 |
+
}
|
| 1569 |
+
_LOWER_IS_BETTER = {"Cross_entropy"}
|
| 1570 |
+
|
| 1571 |
+
def _fmt_metric(v, m):
|
| 1572 |
+
if pd.isna(v): return ""
|
| 1573 |
+
if m == "Elo_score": return f"{int(round(v))}"
|
| 1574 |
+
if m == "%β over XGBoost": return f"{v:+.2f}"
|
| 1575 |
+
return f"{v:.3f}"
|
| 1576 |
+
|
| 1577 |
+
def _table_html(df):
|
| 1578 |
+
"""Render the agg dataframe to HTML with top-3 rank badges per column.
|
| 1579 |
+
|
| 1580 |
+
df is expected to have raw column names (model, Accuracy, AUC, ...).
|
| 1581 |
+
"""
|
| 1582 |
+
if df is None or df.empty:
|
| 1583 |
+
return '<div class="nk-empty-table">No data for this filter</div>'
|
| 1584 |
+
metric_cols = [c for c in df.columns if c != 'model']
|
| 1585 |
+
# Per-column rank: 1 = best per metric (min for lower-is-better, max otherwise).
|
| 1586 |
+
rank_per_col = {}
|
| 1587 |
+
for m in metric_cols:
|
| 1588 |
+
vals = df[m].tolist()
|
| 1589 |
+
ascending = m in _LOWER_IS_BETTER
|
| 1590 |
+
# Get the rank-3 set
|
| 1591 |
+
idxs = list(range(len(vals)))
|
| 1592 |
+
idxs.sort(key=lambda i: (vals[i] if vals[i] is not None and not pd.isna(vals[i]) else (float('inf') if ascending else float('-inf'))), reverse=not ascending)
|
| 1593 |
+
rank_per_col[m] = {i: r+1 for r, i in enumerate(idxs[:3])}
|
| 1594 |
+
|
| 1595 |
+
h = ['<table class="nk-lb">']
|
| 1596 |
+
h.append('<thead><tr><th class="mdl">Model</th>')
|
| 1597 |
+
for m in metric_cols:
|
| 1598 |
+
h.append(f'<th>{_METRIC_DISPLAY_FULL.get(m, m)}</th>')
|
| 1599 |
+
h.append('</tr></thead><tbody>')
|
| 1600 |
+
for i in range(len(df)):
|
| 1601 |
+
model_raw = df.iloc[i]['model']
|
| 1602 |
+
model_disp = _MODEL_DISPLAY_FULL.get(model_raw, model_raw)
|
| 1603 |
+
h.append(f'<tr><td class="mdl">{model_disp}</td>')
|
| 1604 |
+
for m in metric_cols:
|
| 1605 |
+
v = df.iloc[i][m]
|
| 1606 |
+
rank = rank_per_col[m].get(i)
|
| 1607 |
+
cell_extra = f" plated p-{rank}" if rank else ""
|
| 1608 |
+
badge = f'<span class="nk-rank-badge nk-rb-{rank}">{rank:02d}</span>' if rank else ''
|
| 1609 |
+
h.append(f'<td class="num{cell_extra}">{badge}<span class="val">{_fmt_metric(v, m)}</span></td>')
|
| 1610 |
+
h.append('</tr>')
|
| 1611 |
+
h.append('</tbody></table>')
|
| 1612 |
+
return ''.join(h)
|
| 1613 |
+
|
| 1614 |
+
ranking_table = gr.HTML(
|
| 1615 |
+
value=_table_html(public_enter_model_agg.round(4)),
|
| 1616 |
visible=False,
|
| 1617 |
+
elem_classes=["nk-lb-wrap"],
|
| 1618 |
)
|
| 1619 |
|
| 1620 |
# Load pre-built figures cache built by build_figures_cache.py.
|
|
|
|
| 1635 |
df = df[(df['features'].fillna(0) >= min_features) &
|
| 1636 |
(df['rows'].fillna(0) >= min_samples)]
|
| 1637 |
if df.empty:
|
| 1638 |
+
empty = pd.DataFrame(columns=['model', 'Accuracy', 'AUC', 'F1_score', 'Precision', 'Recall', 'Cross_entropy', 'Elo_score', '%β over XGBoost'])
|
| 1639 |
return empty, df
|
| 1640 |
df = compute_elo_for_subset(df, metric="Accuracy")
|
| 1641 |
df = compute_pct_improvement_over_baseline(df, baseline_model="xgboost", metric="Accuracy")
|
|
|
|
| 1691 |
|
| 1692 |
if use_cache and view == "Table":
|
| 1693 |
table = pd.DataFrame(_figures_cache[raw]["table"])
|
| 1694 |
+
# Sort by the selected metric (lower is better for Cross_entropy)
|
| 1695 |
+
ascending = metric in _LOWER_IS_BETTER
|
| 1696 |
+
sorted_df = table.sort_values(by=metric, ascending=ascending).round(4).reset_index(drop=True) if not table.empty else table
|
| 1697 |
return (
|
| 1698 |
gr.update(visible=False),
|
| 1699 |
+
gr.update(visible=True, value=_table_html(sorted_df)),
|
| 1700 |
)
|
| 1701 |
|
| 1702 |
# Slow path: any non-default slider β compute live.
|
|
|
|
| 1711 |
gr.update(visible=False),
|
| 1712 |
)
|
| 1713 |
else:
|
| 1714 |
+
ascending = metric in _LOWER_IS_BETTER
|
| 1715 |
+
sorted_df = agg.sort_values(by=metric, ascending=ascending).round(4).reset_index(drop=True) if not agg.empty else agg
|
| 1716 |
return (
|
| 1717 |
gr.update(visible=False),
|
| 1718 |
+
gr.update(visible=True, value=_table_html(sorted_df)),
|
| 1719 |
)
|
| 1720 |
|
| 1721 |
_filter_inputs = [view_selector, metric_selector, industry_selector, features_slider, samples_slider]
|
|
|
|
| 1756 |
gr.Markdown("""
|
| 1757 |
- **Neuralk** β [neuralk.ai](https://www.neuralk.ai/)
|
| 1758 |
- **Package documentation** β [docs.neuralk-ai.com/api](https://docs.neuralk-ai.com/api/)
|
| 1759 |
+
- **Previous version of TabBench** β [https://dashboard.neuralk-ai.com/](https://dashboard.neuralk-ai.com/)
|
| 1760 |
""")
|
| 1761 |
|
| 1762 |
# Hidden placeholders so the rest of the navigation wiring
|
|
|
|
| 2281 |
# appropriate nav button when the user hits Back/Forward. Also, if the URL
|
| 2282 |
# already has a #hash on first load, navigate to that pane.
|
| 2283 |
|
| 2284 |
+
demo.launch(ssr_mode=False, share=False)
|
build_figures_cache.py
CHANGED
|
@@ -43,7 +43,7 @@ INDUSTRY_BUCKETS = [
|
|
| 43 |
"Social/Public",
|
| 44 |
"Other",
|
| 45 |
]
|
| 46 |
-
METRICS = ["Accuracy", "AUC", "Elo_score", "%β over XGBoost"]
|
| 47 |
|
| 48 |
# Same metadata merge as the app does at boot.
|
| 49 |
meta_df = pd.DataFrame(json.load(open("public_datasets_info.json")))
|
|
@@ -63,7 +63,7 @@ def build_one(industry, metric):
|
|
| 63 |
return None, [], 0
|
| 64 |
df = compute_elo_for_subset(df, metric="Accuracy")
|
| 65 |
df = compute_pct_improvement_over_baseline(df, baseline_model="xgboost", metric="Accuracy")
|
| 66 |
-
agg = df.groupby('model')[['Accuracy', 'AUC', 'Elo_score', '%β over XGBoost']].mean().reset_index()
|
| 67 |
fig = plot_global_model_ranking_plotly(agg, metric=metric, per_dataset_df=df)
|
| 68 |
return fig.to_plotly_json(), agg.round(6).to_dict(orient="records"), int(df['dataset_id'].nunique())
|
| 69 |
|
|
|
|
| 43 |
"Social/Public",
|
| 44 |
"Other",
|
| 45 |
]
|
| 46 |
+
METRICS = ["Accuracy", "AUC", "F1_score", "Precision", "Recall", "Cross_entropy", "Elo_score", "%β over XGBoost"]
|
| 47 |
|
| 48 |
# Same metadata merge as the app does at boot.
|
| 49 |
meta_df = pd.DataFrame(json.load(open("public_datasets_info.json")))
|
|
|
|
| 63 |
return None, [], 0
|
| 64 |
df = compute_elo_for_subset(df, metric="Accuracy")
|
| 65 |
df = compute_pct_improvement_over_baseline(df, baseline_model="xgboost", metric="Accuracy")
|
| 66 |
+
agg = df.groupby('model')[['Accuracy', 'AUC', 'F1_score', 'Precision', 'Recall', 'Cross_entropy', 'Elo_score', '%β over XGBoost']].mean().reset_index()
|
| 67 |
fig = plot_global_model_ranking_plotly(agg, metric=metric, per_dataset_df=df)
|
| 68 |
return fig.to_plotly_json(), agg.round(6).to_dict(orient="records"), int(df['dataset_id'].nunique())
|
| 69 |
|
figures_cache.json
CHANGED
|
The diff for this file is too large to render.
See raw diff
|
|
|