SeaWolf-AI commited on
Commit
b9ffb6b
ยท
verified ยท
1 Parent(s): 038e03e

LEADBOARD v1.1 - spec, opening boards, measured baselines

Browse files

8-clause spec, 5 time-split boards with measured noise floors and mandated baselines.

Dockerfile ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # HF Spaces runs the container as a non-root user; write only under paths we own.
2
+ FROM python:3.11-slim
3
+ RUN useradd -m -u 1000 user
4
+ WORKDIR /app
5
+ COPY requirements.txt .
6
+ RUN pip install --no-cache-dir -r requirements.txt
7
+ COPY . .
8
+ RUN mkdir -p /app/data && chown -R user:user /app
9
+ USER user
10
+ ENV LB_LEDGER=/app/data/ledger.jsonl
11
+ EXPOSE 7860
12
+ CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860"]
README.md CHANGED
@@ -1,10 +1,25 @@
1
  ---
2
- title: Leadboard
3
- emoji: ๐Ÿ†
4
- colorFrom: green
5
- colorTo: red
6
  sdk: docker
 
7
  pinned: false
 
 
 
 
 
 
 
8
  ---
9
 
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
1
  ---
2
+ title: LEADBOARD
3
+ emoji: ๐ŸŽฏ
4
+ colorFrom: blue
5
+ colorTo: gray
6
  sdk: docker
7
+ app_port: 7860
8
  pinned: false
9
+ short_description: One yardstick for drug prediction tools
10
+ tags:
11
+ - drug-discovery
12
+ - admet
13
+ - leaderboard
14
+ - benchmark
15
+ - cheminformatics
16
  ---
17
 
18
+ # LEADBOARD
19
+
20
+ ์‹ ์•ฝ ์˜ˆ์ธก ๋„๊ตฌ๋ฅผ, ๋ถ„์•ผ๋ณ„๋กœ, ๊ฐ™์€ ์žฃ๋Œ€๋กœ ์žฐ๋‹ค.
21
+
22
+ ์ •๋‹ต์€ ๋ฐฐํฌํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋Œ€์‹  ์ฑ„์ ์ž๊ฐ€ ๋จผ์ € ๊ณต๊ฐœํ•œ๋‹ค โ€”
23
+ ์•„๋ฌด๊ฒƒ๋„ ํ•™์Šตํ•˜์ง€ ์•Š์€ ๊ธฐ์ค€์„ , ๊ทธ ๋ถ„์•ผ์˜ ์‹คํ—˜ ์žก์Œ ๋ฐ”๋‹ฅ, ์ ์ˆ˜๋งˆ๋‹ค์˜ ๋ฐ์ดํ„ฐยท์ฑ„์ ๊ธฐ ์ง€๋ฌธ.
24
+
25
+ ๊ทœ๊ฒฉ v1.1 (8๊ฐœ ์กฐํ•ญ) ยท FINAL-Bench / VIDRAFT
app.py ADDED
@@ -0,0 +1,85 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # -*- coding: utf-8 -*-
2
+ """LEADBOARD โ€” ์‹ ์•ฝ ์˜ˆ์ธก ๋„๊ตฌ๋ฅผ ๋ถ„์•ผ๋ณ„๋กœ ๊ฐ™์€ ์žฃ๋Œ€์— ์„ธ์šฐ๋Š” ์‹œํ—˜๋Œ€.
3
+
4
+ **์ด ์„œ๋น„์Šค๊ฐ€ ํ•˜๋Š” ์ผ**: ๋ถ€๋ฌธ ์นด๋“œ๋ฅผ ์„œ๋น™ํ•˜๊ณ , ์ œ์ถœ์„ ๋ฐ›์•„ ์›์žฅ์— ์ ๋Š”๋‹ค.
5
+ **ํ•˜์ง€ ์•Š๋Š” ์ผ**: ์ฑ„์ . ์ •๋‹ต์€ ์ด ์ปจํ…Œ์ด๋„ˆ์— ์—†๋‹ค (๊ทœ๊ฒฉ 1์กฐ).
6
+ ์ฑ„์ ์€ ๋ณ„๋„ ์›Œ์ปค๊ฐ€ ๋น„๊ณต๊ฐœ ์›์žฅ์—์„œ ๋Œ๋ฆฐ๋‹ค. ์—ฌ๊ธฐ์— ๋ผ๋ฒจ์„ ๋‘๋ฉด
7
+ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ๋ฐ›๋Š” ๋ˆ„๊ตฌ๋‚˜ ์ •๋‹ต์„ ๊ฐ–๊ฒŒ ๋œ๋‹ค.
8
+
9
+ ๋ถ€๋ฌธ ์นด๋“œ์—๋Š” ์ฑ„์ ์— ํ•„์š”ํ•œ ๋ชจ๋“  ๊ณต๊ฐœ ์ •๋ณด๊ฐ€ ๋“ค์–ด ์žˆ๋‹ค - ์žก์Œ ๋ฐ”๋‹ฅ, ๊ธฐ์ค€์„  ์„ฑ์ ,
10
+ ํ™€๋“œ์•„์›ƒ ๋ฐฉ์‹, ๋ฐ์ดํ„ฐ ์ง€๋ฌธ. **์ฐธ๊ฐ€์ž๊ฐ€ ์šฐ๋ฆฌ ์ฑ„์ ์„ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ด๋‹ค.**
11
+ """
12
+ import glob
13
+ import hashlib
14
+ import io
15
+ import json
16
+ import os
17
+ import time
18
+
19
+ from fastapi import FastAPI
20
+ from fastapi.middleware.gzip import GZipMiddleware
21
+ from fastapi.responses import FileResponse, JSONResponse
22
+
23
+ HERE = os.path.dirname(os.path.abspath(__file__))
24
+ DATA = os.path.join(HERE, "data")
25
+ SPEC_VERSION = "v1.1"
26
+
27
+ app = FastAPI(title="LEADBOARD")
28
+ app.add_middleware(GZipMiddleware, minimum_size=1024)
29
+
30
+ _CACHE = {"t": 0, "v": None}
31
+
32
+
33
+ def _sha(path):
34
+ h = hashlib.sha256()
35
+ with open(path, "rb") as f:
36
+ for b in iter(lambda: f.read(65536), b""):
37
+ h.update(b)
38
+ return h.hexdigest()[:16]
39
+
40
+
41
+ def boards():
42
+ """๋ถ€๋ฌธ ์นด๋“œ๋ฅผ ๋ชจ์•„ ์ค€๋‹ค. 2์กฐ์— ๋”ฐ๋ผ ๊ฐ ์นด๋“œ์˜ ์ง€๋ฌธ์„ ํ•จ๊ป˜ ๋‚ธ๋‹ค."""
43
+ if _CACHE["v"] and time.time() - _CACHE["t"] < 60:
44
+ return _CACHE["v"]
45
+ out = []
46
+ for p in sorted(glob.glob(os.path.join(DATA, "*_card.json"))):
47
+ try:
48
+ d = json.load(io.open(p, encoding="utf-8"))
49
+ except Exception:
50
+ continue
51
+ nf = d.get("noise_floor") or {}
52
+ base = d.get("baselines") or {}
53
+ best = None
54
+ for k, v in base.items():
55
+ if best is None or v["mae"] < base[best]["mae"]:
56
+ best = k
57
+ d["dataset_sha"] = _sha(p)
58
+ d["spec"] = SPEC_VERSION
59
+ d["best_baseline"] = best
60
+ # ๋ชจ๋ธ ์˜ค์ฐจ๊ฐ€ ์‹คํ—˜ ์˜ค์ฐจ์˜ ๋ช‡ ๋ฐฐ์ธ๊ฐ€. 1 ์— ๊ฐ€๊นŒ์šธ์ˆ˜๋ก ์ธก์ • ํ•œ๊ณ„์— ๋ถ™์–ด ์žˆ๋‹ค.
61
+ if best and nf.get("sd_single"):
62
+ d["error_over_noise"] = round(base[best]["mae"] / nf["sd_single"], 2)
63
+ # ํ•™์Šต ๊ธฐ์ค€์„ ์ด ์ƒ์ˆ˜ ์˜ˆ์ธก์„ ๋„˜์—ˆ๋Š”๊ฐ€. 3์กฐ๊ฐ€ ํ‘œ์— ๋‚จ๊ธฐ๋Š” ์‚ฌ์‹ค.
64
+ if "์ƒ์ˆ˜ ์˜ˆ์ธก" in base and "Morgan+LightGBM" in base:
65
+ d["beats_constant"] = base["Morgan+LightGBM"]["mae"] < base["์ƒ์ˆ˜ ์˜ˆ์ธก"]["mae"]
66
+ out.append(d)
67
+ out.sort(key=lambda x: -x.get("n_test", 0))
68
+ _CACHE.update(t=time.time(), v=out)
69
+ return out
70
+
71
+
72
+ @app.get("/")
73
+ def index():
74
+ return FileResponse(os.path.join(HERE, "index.html"))
75
+
76
+
77
+ @app.get("/api/boards")
78
+ def api_boards():
79
+ return JSONResponse({"spec": SPEC_VERSION, "n": len(boards()), "boards": boards()})
80
+
81
+
82
+ @app.get("/api/health")
83
+ def health():
84
+ return {"ok": True, "boards": len(boards()), "spec": SPEC_VERSION,
85
+ "scoring_here": False}
data/egfr_card.json ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "board": "EGFR",
3
+ "target": "CHEMBL203",
4
+ "type": "IC50",
5
+ "cut": 2022,
6
+ "threshold": 7.0,
7
+ "n_train": 9231,
8
+ "n_test": 1565,
9
+ "positive_rate": 0.5891373801916933,
10
+ "noise_floor": {
11
+ "pairs": 36119,
12
+ "compounds": 1221,
13
+ "median": 0.7832196231327178,
14
+ "mean": 1.001829417173794,
15
+ "p75": 1.474959594551807,
16
+ "p90": 2.215294491882492,
17
+ "sd_single": 0.8881466464306685
18
+ },
19
+ "baselines": {
20
+ "์ƒ์ˆ˜ ์˜ˆ์ธก": {
21
+ "auroc": 0.5,
22
+ "prauc": 0.5891373801916933,
23
+ "mae": 0.9960533038964834
24
+ },
25
+ "์ตœ๊ทผ์ ‘ ์ด์›ƒ": {
26
+ "auroc": 0.5653230349871636,
27
+ "prauc": 0.6233627561582259,
28
+ "mae": 1.192082140711924
29
+ },
30
+ "Morgan+LightGBM": {
31
+ "auroc": 0.5626553944869326,
32
+ "prauc": 0.6411612126697581,
33
+ "mae": 1.0701786646876255
34
+ }
35
+ },
36
+ "near_threshold": 874,
37
+ "holdout": "time-split(first-report-year)",
38
+ "built": "2026-08-22"
39
+ }
data/her2_card.json ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "board": "HER2",
3
+ "target": "CHEMBL1824",
4
+ "type": "IC50",
5
+ "cut": 2022,
6
+ "threshold": 7.0,
7
+ "n_train": 2262,
8
+ "n_test": 236,
9
+ "positive_rate": 0.5508474576271186,
10
+ "noise_floor": {
11
+ "pairs": 2694,
12
+ "compounds": 223,
13
+ "median": 0.35962471092982806,
14
+ "mean": 0.5617396930944518,
15
+ "p75": 0.7970365945440179,
16
+ "p90": 1.4785959402856683,
17
+ "sd_single": 0.4979961818213226
18
+ },
19
+ "baselines": {
20
+ "์ƒ์ˆ˜ ์˜ˆ์ธก": {
21
+ "auroc": 0.5,
22
+ "prauc": 0.5508474576271186,
23
+ "mae": 1.0639157321898522
24
+ },
25
+ "์ตœ๊ทผ์ ‘ ์ด์›ƒ": {
26
+ "auroc": 0.6084179970972423,
27
+ "prauc": 0.61201465958597,
28
+ "mae": 1.245037797485603
29
+ },
30
+ "Morgan+LightGBM": {
31
+ "auroc": 0.7604136429608127,
32
+ "prauc": 0.7849782771815919,
33
+ "mae": 0.9163787230821009
34
+ }
35
+ },
36
+ "near_threshold": 65,
37
+ "holdout": "time-split(first-report-year)",
38
+ "built": "2026-08-22"
39
+ }
data/herg_card.json ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "board": "hERG",
3
+ "target": "CHEMBL240",
4
+ "type": "IC50",
5
+ "cut": 2022,
6
+ "threshold": 5.0,
7
+ "n_train": 8450,
8
+ "n_test": 1338,
9
+ "positive_rate": 0.585949177877429,
10
+ "noise_floor": {
11
+ "pairs": 5185,
12
+ "compounds": 857,
13
+ "median": 0.14793898523038607,
14
+ "mean": 0.47494876125752883,
15
+ "p75": 0.6690067809585756,
16
+ "p90": 1.3377444185444354,
17
+ "sd_single": 0.4210538663630575
18
+ },
19
+ "baselines": {
20
+ "์ƒ์ˆ˜ ์˜ˆ์ธก": {
21
+ "auroc": 0.5,
22
+ "prauc": 0.585949177877429,
23
+ "mae": 0.5887837936811489
24
+ },
25
+ "์ตœ๊ทผ์ ‘ ์ด์›ƒ": {
26
+ "auroc": 0.56607327046342,
27
+ "prauc": 0.6209289133630831,
28
+ "mae": 0.7761432713342975
29
+ },
30
+ "Morgan+LightGBM": {
31
+ "auroc": 0.6063324246666175,
32
+ "prauc": 0.703536813371362,
33
+ "mae": 0.5986207163323017
34
+ }
35
+ },
36
+ "near_threshold": 696,
37
+ "holdout": "time-split(first-report-year)",
38
+ "built": "2026-08-22"
39
+ }
data/kit_card.json ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "board": "KIT",
3
+ "target": "CHEMBL1936",
4
+ "type": "IC50",
5
+ "cut": 2022,
6
+ "threshold": 7.0,
7
+ "n_train": 1788,
8
+ "n_test": 158,
9
+ "positive_rate": 0.44936708860759494,
10
+ "noise_floor": {
11
+ "pairs": 1112,
12
+ "compounds": 148,
13
+ "median": 0.2277576092268765,
14
+ "mean": 0.4820099895784595,
15
+ "p75": 0.8325089127062366,
16
+ "p90": 1.3783444526086566,
17
+ "sd_single": 0.4273138205482797
18
+ },
19
+ "baselines": {
20
+ "์ƒ์ˆ˜ ์˜ˆ์ธก": {
21
+ "auroc": 0.5,
22
+ "prauc": 0.44936708860759494,
23
+ "mae": 0.957307716818397
24
+ },
25
+ "์ตœ๊ทผ์ ‘ ์ด์›ƒ": {
26
+ "auroc": 0.5853164966812369,
27
+ "prauc": 0.4971840536892239,
28
+ "mae": 1.1300454240335485
29
+ },
30
+ "Morgan+LightGBM": {
31
+ "auroc": 0.6422211429496519,
32
+ "prauc": 0.661580797441272,
33
+ "mae": 0.9250771660303996
34
+ }
35
+ },
36
+ "near_threshold": 40,
37
+ "holdout": "time-split(first-report-year)",
38
+ "built": "2026-08-22"
39
+ }
data/vegfr2_card.json ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "board": "VEGFR2",
3
+ "target": "CHEMBL279",
4
+ "type": "IC50",
5
+ "cut": 2022,
6
+ "threshold": 7.0,
7
+ "n_train": 9125,
8
+ "n_test": 637,
9
+ "positive_rate": 0.37990580847723704,
10
+ "noise_floor": {
11
+ "pairs": 10578,
12
+ "compounds": 1058,
13
+ "median": 0.5253393438279943,
14
+ "mean": 0.8597664104703135,
15
+ "p75": 1.276896315947262,
16
+ "p90": 2.3187587626244124,
17
+ "sd_single": 0.7622042646013418
18
+ },
19
+ "baselines": {
20
+ "์ƒ์ˆ˜ ์˜ˆ์ธก": {
21
+ "auroc": 0.5,
22
+ "prauc": 0.37990580847723704,
23
+ "mae": 0.963882867319296
24
+ },
25
+ "์ตœ๊ทผ์ ‘ ์ด์›ƒ": {
26
+ "auroc": 0.6542786902395648,
27
+ "prauc": 0.4889038202589405,
28
+ "mae": 0.9911654472219389
29
+ },
30
+ "Morgan+LightGBM": {
31
+ "auroc": 0.7233654147923423,
32
+ "prauc": 0.6187042221833905,
33
+ "mae": 0.8203045097805136
34
+ }
35
+ },
36
+ "near_threshold": 301,
37
+ "holdout": "time-split(first-report-year)",
38
+ "built": "2026-08-22"
39
+ }
index.html ADDED
@@ -0,0 +1,215 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="ko">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width,initial-scale=1">
6
+ <title>LEADBOARD โ€” ์‹ ์•ฝ ์˜ˆ์ธก ๋„๊ตฌ ์‹œํ—˜๋Œ€</title>
7
+ <!-- <head> ๋Š” ์„ ํƒ์ด ์•„๋‹ˆ๋‹ค: ํ”Œ๋žซํผ์ด ์ž๊ธฐ ํƒœ๊ทธ๋ฅผ ๋ฌธ์„œ์— ์ฃผ์ž…ํ•˜๋Š”๋ฐ, ๋ฐ›์„ head ๊ฐ€ ์—†์œผ๋ฉด
8
+ ๊ทธ๊ฒƒ๋“ค์ด doctype ์•ž์— ๋†“์ด๊ณ  ํŽ˜์ด์ง€ ์ „์ฒด๊ฐ€ ์ฟผํฌ ๋ชจ๋“œ๋กœ ๋–จ์–ด์ง„๋‹ค. -->
9
+ <style>
10
+ :root{
11
+ --bg:#f6f7f9; --card:#fff; --ink:#15171c; --muted:#68707d; --line:#e3e6ea;
12
+ --accent:#2a4d8f; --accent-soft:#e9eff9; --edge:#c8d4e8;
13
+ --warn:#8a5a00; --warn-soft:#fff6e0; --good:#1d7a4d;
14
+ --mono:ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,monospace;
15
+ }
16
+ @media (prefers-color-scheme: dark){
17
+ :root:not([data-theme="light"]){
18
+ --bg:#0f1115; --card:#171a20; --ink:#e7eaee; --muted:#98a0ac; --line:#282d36;
19
+ --accent:#7aa2e8; --accent-soft:#161e2c; --edge:#2f3a4d;
20
+ --warn:#e0b23c; --warn-soft:#282112; --good:#4cc98a;
21
+ }
22
+ }
23
+ :root[data-theme="dark"]{
24
+ --bg:#0f1115; --card:#171a20; --ink:#e7eaee; --muted:#98a0ac; --line:#282d36;
25
+ --accent:#7aa2e8; --accent-soft:#161e2c; --edge:#2f3a4d;
26
+ --warn:#e0b23c; --warn-soft:#282112; --good:#4cc98a;
27
+ }
28
+ *{box-sizing:border-box}
29
+ body{margin:0;background:var(--bg);color:var(--ink);line-height:1.72;
30
+ font-family:-apple-system,BlinkMacSystemFont,"Pretendard","Apple SD Gothic Neo",
31
+ "Malgun Gothic",Segoe UI,Roboto,sans-serif;-webkit-font-smoothing:antialiased}
32
+ .wrap{max-width:860px;margin:0 auto;padding:0 20px 96px}
33
+ code,.mono{font-family:var(--mono)}
34
+ header{padding:70px 0 38px;border-bottom:1px solid var(--line);margin-bottom:40px}
35
+ .brand{font-size:clamp(38px,8vw,62px);font-weight:800;letter-spacing:-.035em;margin:0 0 6px;line-height:1.02}
36
+ .brand span{color:var(--accent)}
37
+ .kr{font-size:15px;color:var(--muted);margin:0 0 26px}
38
+ .tag{font-size:clamp(19px,3.4vw,26px);font-weight:700;line-height:1.45;margin:0 0 10px;letter-spacing:-.015em}
39
+ .tag-en{font-size:14px;color:var(--muted);font-style:italic;margin:0}
40
+ h2{font-size:13px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;
41
+ color:var(--accent);margin:56px 0 18px}
42
+ h3{font-size:19px;font-weight:700;margin:30px 0 10px;letter-spacing:-.01em}
43
+ p{margin:0 0 16px}.lead{font-size:17px}
44
+ .quote{border-left:3px solid var(--accent);padding:4px 0 4px 18px;margin:22px 0;
45
+ font-size:18px;font-weight:600;line-height:1.6}
46
+ .fig{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:20px 22px;
47
+ margin:20px 0;font-family:var(--mono);font-size:13.5px;line-height:2.0;overflow-x:auto}
48
+ .fig .n{color:var(--accent);font-weight:700}.fig .dim{color:var(--muted)}
49
+ .fig .big{font-size:17px;font-weight:700}
50
+ .note{background:var(--warn-soft);border:1px solid color-mix(in srgb,var(--warn) 30%,transparent);
51
+ border-radius:10px;padding:14px 18px;font-size:14.5px;margin:22px 0}
52
+ table{width:100%;border-collapse:collapse;font-size:14px;margin:18px 0}
53
+ th{text-align:right;font-weight:600;color:var(--muted);font-size:12px;letter-spacing:.04em;
54
+ text-transform:uppercase;padding:8px 10px;border-bottom:1px solid var(--line)}
55
+ th:first-child,td:first-child{text-align:left}
56
+ td{padding:11px 10px;border-bottom:1px solid var(--line);text-align:right;font-family:var(--mono)}
57
+ td:first-child{font-family:inherit;font-weight:600}
58
+ .tw{overflow-x:auto}
59
+ .bad{color:var(--warn);font-weight:700}.ok{color:var(--good)}
60
+ ol.cl{list-style:none;counter-reset:c;padding:0;margin:20px 0}
61
+ ol.cl li{counter-increment:c;position:relative;padding:15px 0 15px 52px;border-top:1px solid var(--line)}
62
+ ol.cl li:last-child{border-bottom:1px solid var(--line)}
63
+ ol.cl li::before{content:counter(c);position:absolute;left:0;top:15px;width:30px;height:30px;
64
+ border-radius:50%;background:var(--accent-soft);color:var(--accent);font-weight:700;font-size:13px;
65
+ display:flex;align-items:center;justify-content:center;font-family:var(--mono)}
66
+ ol.cl b{display:block;font-size:16px;margin-bottom:3px}
67
+ ol.cl span{font-size:14.5px;color:var(--muted)}
68
+ footer{margin-top:72px;padding-top:26px;border-top:1px solid var(--line);
69
+ font-size:13px;color:var(--muted);display:flex;gap:18px;flex-wrap:wrap}
70
+ footer a{color:var(--accent);text-decoration:none}
71
+ footer a:hover{text-decoration:underline}
72
+ </style>
73
+ </head>
74
+ <body>
75
+ <div class="wrap">
76
+
77
+ <header>
78
+ <h1 class="brand">LEAD<span>BOARD</span></h1>
79
+ <p class="kr">๋ฆฌ๋“œ๋ณด๋“œ ยท AI ์‹ ์•ฝ ์˜ˆ์ธก ๋„๊ตฌ ์‹œํ—˜๋Œ€ ยท ๊ทœ๊ฒฉ v1.1</p>
80
+ <p class="tag">์‹ ์•ฝ ์˜ˆ์ธก ๋„๊ตฌ๋ฅผ,<br>๋ถ„์•ผ๋ณ„๋กœ, ๊ฐ™์€ ์žฃ๋Œ€๋กœ ์žฐ๋‹ค.</p>
81
+ <p class="tag-en">One yardstick, per discipline, for drug prediction tools.</p>
82
+ </header>
83
+
84
+ <h2>๋ฌด์—‡์„ ํ•˜๋Š” ๊ณณ์ธ๊ฐ€</h2>
85
+
86
+ <p class="lead">์‹ ์•ฝ์„ ๋งŒ๋“ค๋ ค๋ฉด ์‹คํ—˜ ์ „์— ์˜ˆ์ธกํ•ด์•ผ ํ•  ๊ฒƒ์ด ๋งŽ๊ณ , <strong>๋ถ„์•ผ๋งˆ๋‹ค ์ „๋ฌธ ๋„๊ตฌ๊ฐ€ ๋”ฐ๋กœ ์žˆ์Šต๋‹ˆ๋‹ค.</strong></p>
87
+
88
+ <div class="fig">
89
+ ํก์ˆ˜ยทํˆฌ๊ณผ <span class="dim">์žฅ์—์„œ ํก์ˆ˜๋˜๋Š”๊ฐ€</span><br>
90
+ ๋ถ„ํฌ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="dim">ํ˜ˆ์•ก ๋‹จ๋ฐฑ์งˆ์— ๋ถ™๋Š”๊ฐ€ ยท ๋‡Œ๊นŒ์ง€ ๊ฐ€๋Š”๊ฐ€</span><br>
91
+ ๋Œ€์‚ฌ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="dim">๊ฐ„์—์„œ ์–ผ๋งˆ๋‚˜ ๋นจ๋ฆฌ ์‚ฌ๋ผ์ง€๋Š”๊ฐ€</span><br>
92
+ ๋…์„ฑ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="dim">์‹ฌ์žฅ(hERG) ยท ๊ฐ„(DILI) ยท ๋ณ€์ด์›์„ฑ</span><br>
93
+ ํ‘œ์  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="dim">ํ‚ค๋‚˜์•„์ œ ์ˆ˜๋ฐฑ ๊ฐœ ์ค‘ ์–ด๋””์— ๋ถ™๋Š”๊ฐ€</span><br>
94
+ ์ž„์ƒ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="dim">์‚ฌ๋žŒ ๋ชธ์— ์–ผ๋งˆ๋‚˜ ๋‚จ๋Š”๊ฐ€ ยท ๋‹ค๋ฅธ ์•ฝ๊ณผ ๋ถ€๋”ชํžˆ๋Š”๊ฐ€</span>
95
+ </div>
96
+
97
+ <p>๊ฐ ์นธ๋งˆ๋‹ค ๋„๊ตฌ๊ฐ€ ์ˆ˜์‹ญ ๊ฐœ์”ฉ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” <strong>๊ทธ ์„ฑ๋Šฅ์„ ๋ˆ„๊ฐ€ ์žฌ๋А๋ƒ</strong>์ž…๋‹ˆ๋‹ค.
98
+ ์ง€๊ธˆ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž๊ธฐ ๋…ผ๋ฌธ์—์„œ, ์ž๊ธฐ๊ฐ€ ๊ณ ๋ฅธ ๋ฐ์ดํ„ฐ๋กœ ๋ฐœํ‘œํ•ฉ๋‹ˆ๋‹ค. ๊ฐ™์€ ๋ฌธ์ œ๋กœ ์žฐ ๊ฒŒ ์•„๋‹ˆ๋‹ˆ ๋น„๊ต๊ฐ€ ์•ˆ ๋ฉ๋‹ˆ๋‹ค.</p>
99
+
100
+ <div class="quote">์ž๋™์ฐจ ์—ฐ๋น„๋ฅผ ์ œ์กฐ์‚ฌ๊ฐ€ ์Šค์Šค๋กœ ์žฌ์„œ ๋ฐœํ‘œํ•˜๋ฉด ์•„๋ฌด๋„ ๋ฏฟ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.<br>
101
+ ๊ณต์ธ ์‹œํ—˜์†Œ๊ฐ€ ๊ฐ™์€ ์ฝ”์Šค์—์„œ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์žฌ๊ธฐ ๋•Œ๋ฌธ์— ๋น„๊ต๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.</div>
102
+
103
+ <p><strong>LEADBOARD๋Š” ๋ถ„์•ผ๋ณ„๋กœ, ๊ฐ™์€ ๋ฌธ์ œ๋กœ, ๊ฐ™์€ ์žฃ๋Œ€๋กœ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.</strong>
104
+ ์‹œํ—˜์ด ๊ณต์ •ํ•˜๋ ค๋ฉด ๋ฌธ์ œ๋ฅผ ๋ฏธ๋ฆฌ ์•Œ๋ ค์ฃผ๋ฉด ์•ˆ ๋˜๋ฏ€๋กœ, <strong>์ •๋‹ต์„ ๋ฐฐํฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.</strong>
105
+ ๋„๊ตฌ ๊ฐœ๋ฐœ์ž๋Š” ํ™”ํ•ฉ๋ฌผ์˜ ๊ตฌ์กฐ๋งŒ ๋ฐ›๊ณ , ์˜ˆ์ธก๊ฐ’์„ ์ œ์ถœํ•˜๋ฉด ์ฑ„์ ์€ ์šฐ๋ฆฌ๊ฐ€ ํ•ฉ๋‹ˆ๋‹ค.</p>
106
+
107
+ <h2>๊ทธ๋Ÿผ ์‹œํ—˜์†Œ๋Š” ๋ˆ„๊ฐ€ ๊ฒ€์ฆํ•˜๋‚˜</h2>
108
+
109
+ <p>๊ทธ๋ž˜์„œ ์ฑ„์ ์ž์ธ ์šฐ๋ฆฌ๊ฐ€ <strong>๋จผ์ €</strong> ๊ณต๊ฐœํ•ฉ๋‹ˆ๋‹ค โ€”
110
+ ์•„๋ฌด๊ฒƒ๋„ ํ•™์Šตํ•˜์ง€ ์•Š์€ <strong>๊ธฐ์ค€์„ </strong>, ๊ทธ ๋ถ„์•ผ์˜ <strong>์‹คํ—˜ ์˜ค์ฐจ ๋ฒ”์œ„</strong>,
111
+ ๊ทธ๋ฆฌ๊ณ  ์ ์ˆ˜๋งˆ๋‹ค ๊ฐ์ธ๋œ <strong>๋ฐ์ดํ„ฐยท์ฑ„์ ๊ธฐ ์ง€๋ฌธ</strong>.</p>
112
+
113
+ <p><strong>์šฐ๋ฆฌ ์ ์ˆ˜๋ฅผ ๋ฏฟ์–ด๋‹ฌ๋ผ๊ณ  ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ™•์ธํ•ด๋ณด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.</strong></p>
114
+
115
+ <h2>๊ฐœ๋ง‰ ๋ถ€๋ฌธ ยท ์‹ค์ธก</h2>
116
+
117
+ <p>์•„๋ž˜ ๊ฐ’์€ ์ „๋ถ€ <strong>์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ ์žฐ ๊ฒƒ</strong>์ž…๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋Š” ChEMBL_37,
118
+ ๋ถ„ํ• ์€ <strong>์ตœ์ดˆ ๋ณด๊ณ  ์—ฐ๋„ ๊ธฐ์ค€ 2022๋…„</strong>, ๊ธฐ์ค€์„ ์€ ํŠœ๋‹ ์—†๋Š” ๊ธฐ๋ณธ๊ฐ’์ž…๋‹ˆ๋‹ค.</p>
119
+
120
+ <div class="tw"><table id="bt">
121
+ <thead><tr>
122
+ <th>๋ถ€๋ฌธ</th><th>ํ…Œ์ŠคํŠธ</th><th>AUROC</th><th>์ตœ์„  ๊ธฐ์ค€์„  MAE</th>
123
+ <th>์‹คํ—˜ ์žก์Œ</th><th>์˜ค์ฐจรท์žก์Œ</th><th>์ž„๊ณ„ ๋…ธ์ถœ</th>
124
+ </tr></thead>
125
+ <tbody><tr><td colspan="7" style="text-align:center;color:var(--muted)">๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘โ€ฆ</td></tr></tbody>
126
+ </table></div>
127
+
128
+ <div class="note" id="rd"></div>
129
+
130
+ <h3>์ด ํ‘œ๋ฅผ ์ฝ๋Š” ๋ฒ•</h3>
131
+
132
+ <p><strong>์˜ค์ฐจรท์žก์Œ</strong>์ด ์ด ํ‘œ์˜ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค. 1์— ๊ฐ€๊นŒ์šธ์ˆ˜๋ก ๋ชจ๋ธ ์˜ค์ฐจ๊ฐ€ ์‹คํ—˜ ์˜ค์ฐจ์™€
133
+ ๊ฐ™์•„์ง„๋‹ค๋Š” ๋œป์ด๊ณ , ๊ทธ ์ง€์ ๋ถ€ํ„ฐ๋Š” ๋ชจ๋ธ์„ ๊ฐœ์„ ํ•ด๋„ <strong>์ธก์ •์˜ ํ”๋“ค๋ฆผ์„ ๋งžํžˆ๋Š” ์ผ</strong>์ด ๋ฉ๋‹ˆ๋‹ค.</p>
134
+
135
+ <p><strong>์ž„๊ณ„ ๋…ธ์ถœ</strong>์€ ๋ถ„๋ฅ˜ ์ž„๊ณ„์„ ์—์„œ ์‹คํ—˜ ์˜ค์ฐจ ํ•œ ์นธ ์•ˆ์— ์žˆ๋Š” ํ…Œ์ŠคํŠธ ํ™”ํ•ฉ๋ฌผ์˜ ๋น„์œจ์ž…๋‹ˆ๋‹ค.
136
+ ์ด ๊ฐ’์ด ๋†’์€ ๋ถ€๋ฌธ์€ ๋ผ๋ฒจ ์ž์ฒด๊ฐ€ ํ”๋“ค๋ฆฌ๋ฏ€๋กœ <strong>ํšŒ๊ท€๋ฅผ ์ฃผ์ง€ํ‘œ๋กœ</strong> ๋‘ก๋‹ˆ๋‹ค.</p>
137
+
138
+ <h2>๋ถ„ํ• ์„ ๋ฐ”๊พธ๋ฉด ์–ด๋–ป๊ฒŒ ๋˜๋Š”๊ฐ€</h2>
139
+
140
+ <p>๊ฐ™์€ ๋ฐ์ดํ„ฐ, ๊ฐ™์€ ๋ชจ๋ธ(Morgan+LightGBM ๊ธฐ๋ณธ๊ฐ’), ๊ฐ™์€ ํ…Œ์ŠคํŠธ ๋น„์œจ.
141
+ <strong>๋ถ„ํ•  ๋ฐฉ์‹๋งŒ</strong> ๋ฐ”๊ฟ” hERG์—์„œ ์ธก์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.</p>
142
+
143
+ <div class="fig">
144
+ ๋ฌด์ž‘์œ„ ๋ถ„ํ•  <span class="dim">(5์‹œ๋“œ ํ‰๊ท )</span> &nbsp;&nbsp;AUROC <span class="n">0.818</span> &nbsp;ยท MAE <span class="n">0.457</span><br>
145
+ ์‹œ๊ฐ„ ๋ถ„ํ•  &nbsp;&nbsp;<span class="dim">(2022 ๊ธฐ์ค€)</span> &nbsp;&nbsp;&nbsp;&nbsp;AUROC <span class="n">0.606</span> &nbsp;ยท MAE <span class="n">0.599</span><br>
146
+ <br>
147
+ <span class="big">AUROC โˆ’0.211 &nbsp;ยท&nbsp; MAE +0.142 log</span>
148
+ </div>
149
+
150
+ <p>๋ถ„ํ•  ๋ฐฉ์‹์ด ๊ณต์‹œ๋˜์ง€ ์•Š์€ ์ˆœ์œ„ํ‘œ์˜ ์ˆซ์ž๋Š” <strong>๊ทธ ์ž์ฒด๋กœ ๋น„๊ต๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.</strong>
151
+ ๊ฐ™์€ ๋ฐ์ดํ„ฐ์—์„œ ๋ถ„ํ•  ํ•˜๋‚˜๊ฐ€ AUROC๋ฅผ 0.21 ์›€์ง์ž…๋‹ˆ๋‹ค.</p>
152
+
153
+ <h2>์ฑ„์ ์ž๊ฐ€ ์Šค์Šค๋กœ์—๊ฒŒ ๋ถ€๊ณผํ•˜๋Š” 8๊ฐœ ์กฐํ•ญ</h2>
154
+
155
+ <ol class="cl">
156
+ <li><b>์ •๋‹ต์€ ๋ฐฐํฌํ•˜์ง€ ์•Š๋Š”๋‹ค</b><span>์‹œ๊ฐ„ ๋ถ„ํ•  ยท ์žฌํ๋ ˆ์ด์…˜ ยท ๋ฏธ๊ณต๊ฐœ ์‹ค์ธก์œผ๋กœ๋งŒ ํ™€๋“œ์•„์›ƒ์„ ๋งŒ๋“ค๊ณ , ๋ถ€๋ฌธ๋งˆ๋‹ค ์–ด๋А ๋ฐฉ์‹์ธ์ง€ ๋ช…์‹œํ•œ๋‹ค</span></li>
157
+ <li><b>์ ์ˆ˜๋งˆ๋‹ค ๋‘ ๊ฐœ์˜ ์ง€๋ฌธ</b><span>๋ฐ์ดํ„ฐ ํŒ๋ณธ๊ณผ ์ฑ„์  ์ฝ”๋“œ์˜ SHA-256. ์ง€๋ฌธ์ด ๋‹ค๋ฅธ ์ ์ˆ˜๋Š” ๊ฐ™์€ ํ‘œ์— ์„ธ์šฐ์ง€ ์•Š๋Š”๋‹ค</span></li>
158
+ <li><b>๊ธฐ์ค€์„ ์€ ํ‘œ์—์„œ ๋‚ด๋ ค๊ฐ€์ง€ ์•Š๋Š”๋‹ค</b><span>์ƒ์ˆ˜ ์˜ˆ์ธก ยท ์ตœ๊ทผ์ ‘ ์ด์›ƒ ยท Morgan+LightGBM ์˜๊ตฌ ๋“ฑ์žฌ. ๋ชป ๋„˜์€ ์ œ์ถœ์€ ๊ธฐ์ค€์„  ์•„๋ž˜ ๊ทธ๋Œ€๋กœ ํ‘œ์‹œํ•œ๋‹ค</span></li>
159
+ <li><b>์žก์Œ ๋ฐ”๋‹ฅ์„ ๋จผ์ € ๊ณต์‹œํ•œ๋‹ค</b><span>๊ฐ™์€ ํ™”ํ•ฉ๋ฌผ์„ ์„œ๋กœ ๋‹ค๋ฅธ ๋…ผ๋ฌธ์—์„œ ์žฐ ์ฐจ์ด๋กœ ์‚ฐ์ถœํ•œ๋‹ค. ๊ทธ ์•ˆ์— ๋“  ์ œ์ถœ์€ ๊ฐ™์€ ๊ณ„๋‹จ์— ๋ฌถ๋Š”๋‹ค</span></li>
160
+ <li><b>๋ˆ„์ถœ์€ ๋งค ์ œ์ถœ๋งˆ๋‹ค ๊ฒ€์‚ฌํ•œ๋‹ค</b><span>๊ตฌ์กฐ ๋™์ผ ยท ๊ณจ๊ฒฉ ์ค‘๋ณต ยท Tanimoto ๊ทผ์ ‘๋„ ยท ์‚ฌ์ „ํ•™์Šต ์˜ค์—ผ. ๊ฒฐ๊ณผ๋Š” ์ ์ˆ˜์™€ ํ•จ๊ป˜ ๊ณต์‹œํ•œ๋‹ค</span></li>
161
+ <li><b>๊ฒฐ๊ณผ ์ œ์ถœ๊ณผ ๋ชจ๋ธ ์ œ์ถœ์„ ๊ตฌ๋ถ„ํ•œ๋‹ค</b><span>์ปจํ…Œ์ด๋„ˆ๊นŒ์ง€ ์ œ์ถœํ•ด ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ ๋Œ๋ ค๋ณธ ๊ฒƒ๋งŒ [๊ฒ€์ฆ๋จ] ํ‘œ์‹œ๋ฅผ ๋ฐ›๋Š”๋‹ค</span></li>
162
+ <li><b>๋ฏธ์‚ฐ์ถœ์€ 0์ ์ด ์•„๋‹ˆ๋‹ค</b><span>๊ตฌํ•œ ์ถ•์€ ์ ์ˆ˜๋กœ ๋‚จ๊ธฐ๊ณ  ๋ชป ๊ตฌํ•œ ์ถ•์€ ๋น„์šด๋‹ค. ์ธก์ •ํ•˜์ง€ ๋ชปํ•œ ๊ฒƒ๊ณผ ์ธก์ •ํ•ด์„œ ๋‚˜์œ ๊ฒƒ์€ ๋‹ค๋ฅด๋‹ค</span></li>
163
+ <li><b>๋˜ํ’€์ด ์ œ์ถœ๋กœ๋Š” ์ˆœ์œ„๊ฐ€ ์˜ค๋ฅด์ง€ ์•Š๋Š”๋‹ค</b><span>์ง์ „ ์ตœ๊ณ ์ ์„ ์žก์Œ ๋ฐ”๋‹ฅ ์ด์ƒ์œผ๋กœ ๋„˜์—ˆ์„ ๋•Œ๋งŒ ์ƒˆ ์ ์ˆ˜๋ฅผ ๊ณต๊ฐœํ•œ๋‹ค (Blum &amp; Hardt, ICML 2015)</span></li>
164
+ </ol>
165
+
166
+ <h2>์ฐธ๊ฐ€</h2>
167
+
168
+ <div class="fig">
169
+ โ‘  ํ…Œ์ŠคํŠธ ํ™”ํ•ฉ๋ฌผ์˜ <span class="n">๊ตฌ์กฐ๋งŒ</span> ๋ฐ›๋Š”๋‹ค &nbsp;<span class="dim">๋ผ๋ฒจ์€ ์—†๋‹ค</span><br>
170
+ โ‘ก ์˜ˆ์ธก๊ฐ’์„ ์˜ฌ๋ฆฐ๋‹ค &nbsp;<span class="dim">predictions.csv โ€” compound_id, prediction [, uncertainty]</span><br>
171
+ โ‘ข ์ž๋™ ์ฑ„์  ยท ๋ˆ„์ถœ ๊ฒ€์‚ฌ ยท ์ง€๋ฌธ ๊ฐ์ธ<br>
172
+ โ‘ฃ ๊ธฐ์ค€์„  ยท ์žก์Œ ๋ฐ”๋‹ฅ๊ณผ ํ•จ๊ป˜ ํ‘œ์— ์˜ค๋ฅธ๋‹ค<br>
173
+ &nbsp;&nbsp;&nbsp;<span class="dim">์ปจํ…Œ์ด๋„ˆ๊นŒ์ง€ ์˜ฌ๋ฆฌ๋ฉด ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ ๋Œ๋ ค [๊ฒ€์ฆ๋จ]์„ ๋ถ™์ธ๋‹ค</span>
174
+ </div>
175
+
176
+ <div class="note">์ ‘์ˆ˜ ๊ฐœ์„ค ์ค€๋น„ ์ค‘์ž…๋‹ˆ๋‹ค. ํ™€๋“œ์•„์›ƒ๊ณผ ์žก์Œ ๋ฐ”๋‹ฅ์€ ์œ„ ํ‘œ๋Œ€๋กœ ํ™•์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.</div>
177
+
178
+ <footer>
179
+ <span>LEADBOARD ยท FINAL-Bench / VIDRAFT</span>
180
+ <a href="/api/boards">API</a>
181
+ <a href="https://huggingface.co/spaces/FINAL-Bench/open-discovery-challenge">Open Discovery Challenge</a>
182
+ <a href="https://huggingface.co/spaces/FINAL-Bench/open-materials-challenge">Open Materials Challenge</a>
183
+ </footer>
184
+
185
+ </div>
186
+ <script>
187
+ const f=(x,d=3)=>x==null?"โ€”":Number(x).toFixed(d);
188
+ fetch("/api/boards").then(r=>r.json()).then(d=>{
189
+ const tb=document.querySelector("#bt tbody"); tb.innerHTML="";
190
+ let win=0;
191
+ d.boards.forEach(b=>{
192
+ const bl=b.baselines||{}, best=b.best_baseline, nf=(b.noise_floor||{}).sd_single;
193
+ const au=Math.max(...Object.values(bl).map(v=>v.auroc||0));
194
+ const near=b.n_test?100*b.near_threshold/b.n_test:null;
195
+ if(b.beats_constant) win++;
196
+ const r=document.createElement("tr");
197
+ r.innerHTML=`<td>${b.board}</td><td>${(b.n_test||0).toLocaleString()}</td>`
198
+ +`<td>${f(au)}</td>`
199
+ +`<td>${f(bl[best]?.mae)} <span class="dim" style="font-size:11px">${best==="Morgan+LightGBM"?"":"("+best+")"}</span></td>`
200
+ +`<td>${f(nf)}</td>`
201
+ +`<td class="${b.error_over_noise<1.3?"bad":""}">${f(b.error_over_noise,2)}ร—</td>`
202
+ +`<td class="${near>45?"bad":""}">${near==null?"โ€”":near.toFixed(1)+"%"}</td>`;
203
+ tb.appendChild(r);
204
+ });
205
+ document.getElementById("rd").innerHTML =
206
+ `<strong>${d.n}๊ฐœ ๋ถ€๋ฌธ ์ค‘ ${win}๊ฐœ</strong>์—์„œ ํ•™์Šต ๊ธฐ์ค€์„ (Morgan+LightGBM)์ด ์ƒ์ˆ˜ ์˜ˆ์ธก์„ ๋„˜์—ˆ์Šต๋‹ˆ๋‹ค. `
207
+ +`๋‚˜๋จธ์ง€์—์„œ๋Š” <strong>์•„๋ฌด๊ฒƒ๋„ ํ•™์Šตํ•˜์ง€ ์•Š์€ ์ƒ์ˆ˜ ์˜ˆ์ธก์ด ๋” ์ •ํ™•ํ–ˆ์Šต๋‹ˆ๋‹ค.</strong> `
208
+ +`3์กฐ๊ฐ€ ์—†์—ˆ๋‹ค๋ฉด ์ด ์‚ฌ์‹ค์€ ํ‘œ์— ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.`;
209
+ }).catch(e=>{
210
+ document.querySelector("#bt tbody").innerHTML=
211
+ '<tr><td colspan="7" style="text-align:center;color:var(--muted)">๋ถ€๋ฌธ ์ž๋ฃŒ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค</td></tr>';
212
+ });
213
+ </script>
214
+ </body>
215
+ </html>
requirements.txt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ fastapi==0.115.0
2
+ uvicorn[standard]==0.30.6
3
+ pydantic==2.9.2