alexandreabraham commited on
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

Files changed (3) hide show
  1. app.py +206 -30
  2. build_figures_cache.py +2 -2
  3. 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 a broad, IID-filtered dataset universe spanning healthcare, finance, retail, and other verticals, and compare them head-to-head against the strongest classical baselines (XGBoost, CatBoost, LightGBM) and tuned neural networks (RealMLP, TabM, ModernNCA).
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\n<span class="nk-tag">Evaluation</span> &nbsp;<span class="nk-tag nk-tag--orange">Public datasets</span>')
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
- _initial_table = public_enter_model_agg.round(4).rename(columns={
1423
- "model": "Model",
1424
- "F1_score": "F1",
 
 
 
 
 
 
 
 
 
 
1425
  "Cross_entropy": "Cross-entropy",
1426
- "Elo_score": "Elo",
1427
- "%β†— over XGBoost": "% over XGBoost",
1428
- })
1429
- if "Model" in _initial_table.columns:
1430
- _initial_table["Model"] = _initial_table["Model"].map(lambda m: {
1431
- "xgboost": "XGBoost", "catboost": "CatBoost", "lightgbm": "LightGBM",
1432
- "realmlp": "RealMLP", "tabm": "TabM",
1433
- "modern_nca": "ModernNCA", "modernnca": "ModernNCA",
1434
- "tabpfn": "TabPFN v2.5", "tabpfn_2_5": "TabPFN v2.5", "tabpfn_v3": "TabPFN v3.0",
1435
- "tabicl": "TabICL v1.1", "tabicl_v1": "TabICL v1.1", "tabicl_v2": "TabICL v2.0",
1436
- "tabdpt": "TabDPT", "limix": "LimiX", "mitra": "Mitra",
1437
- "seldon": "Seldon", "nicl": "NICL", "sap": "SAP RPT-1",
1438
- }.get(m, m))
1439
- ranking_table = gr.DataFrame(
1440
- value=_initial_table,
1441
- interactive=False,
1442
- wrap=True,
1443
- type="pandas",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
- sorted_df = table.sort_values(by=metric, ascending=False).round(4).reset_index(drop=True) if not table.empty else table
 
 
1522
  return (
1523
  gr.update(visible=False),
1524
- gr.update(visible=True, value=_prettify_table(sorted_df)),
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
- sorted_df = agg.sort_values(by=metric, ascending=False).round(4).reset_index(drop=True) if not agg.empty else agg
 
1540
  return (
1541
  gr.update(visible=False),
1542
- gr.update(visible=True, value=_prettify_table(sorted_df)),
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 dashboard** β€” [tabbench-dashboard.netlify.app](https://tabbench-dashboard.netlify.app/)
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