penuX: סיווג פתוגנים ב-MIMIC-III/IV — קובץ אחד, PyTorch בלבד, בלי Pandas

דמו/Research Pipeline שמאמן מסווג רב-מחלקתי לקטגוריות פתוגנים מתוך מיקרוביולוגיה, חשיפה לאנטיביוטיקה וויטליים מוקדמים — עם קליברציה ומדדי הערכה עשירים.

בענף mimic3+4 של penuX יש רעיון פשוט (וכמעט חתרני בעולם ה-ML הרפואי): לקחת בעיה אמיתית, נתונים גדולים, והרבה “כאב תשתיתי” — ולהכניס הכול לפייפליין שאפשר להבין ולהריץ בלי להקים מפלצת ETL.

הלב של הענף הוא mimic3.py: סקריפט “קובץ אחד” שמבצע גילוי אוטומטי של דאטה MIMIC-III / MIMIC-IV demo, קורא CSV ב-streaming (כלומר: בלי Pandas), מאמן מודל היברידי ב-PyTorch, ומפיק סט רחב של מדדים — כולל קליברציה ובדיקות הטיה לפי תתי-קבוצות. :contentReference[oaicite:0]{index=0}

חשוב: הפרויקט מוגדר כ-Research/Demo בלבד — לא לשימוש קליני. :contentReference[oaicite:1]{index=1}

מה המודל מנסה לנבא?

המטרה היא לנבא מחלקת פתוגן קבועה מראש (תוויות באותיות גדולות) — מתוך שילוב של טקסט קטגוריאלי ממיקרוביולוגיה, חשיפה לאנטיביוטיקות (one-hot בינארי) וויטליים/בדיקות מוקדמות. :contentReference[oaicite:2]{index=2}

אילו פיצ’רים נכנסים?

לפי ה-README, המודל משתמש ב:

  • טקסט ממיקרוביולוגיה: spec_type_desc ו-interpretation אחרי ניקוי בסיסי (lowercase וכיווץ רווחים). :contentReference[oaicite:3]{index=3}
  • חשיפה לאנטיביוטיקות ב-one-hot: לדוגמה vancomycin, ciprofloxacin, meropenem, piperacillin, ceftriaxone. :contentReference[oaicite:4]{index=4}
  • ויטליים/מעבדה מוקדמים (בסדר דרוש): temperature_c, wbc, spo2, age. :contentReference[oaicite:5]{index=5}

מה מיוחד בארכיטקטורה?

זה לא “עוד MLP על מספרים”. מדובר ב-Hybrid model: ענף טקסטואלי (Embedding → Conv1D → RNN → BiLSTM) + ענף נומרי, ואז איחוד ו-MLP לסיווג הסופי. :contentReference[oaicite:6]{index=6}

בנוסף, יש Early Stopping לפי יעד Accuracy או F1 (ברירת מחדל: יעד Accuracy=0.95), ואפשרות לאתחולי אימון חוזרים עד הגעה ליעד/יציבות. :contentReference[oaicite:7]{index=7}

מחלקות היעד: “Fixed order” ומיפוי נשלט

הענף מגדיר רשימת מחלקות קבועה (fixed order, באותיות גדולות). בין המחלקות יש פתוגנים נפוצים, MRSA, וגם B:OTHER / V:OTHER. :contentReference[oaicite:8]{index=8}

המיפוי למחלקות נשלט דרך map_org() — ואם B:OTHER משתלטת על ההתפלגות, ההמלצה היא להרחיב את כללי המיפוי שם. :contentReference[oaicite:9]{index=9}

דרישות דאטה: MIMIC-III מול MIMIC-IV demo

הסקריפט יודע לעבוד בשני “טופולוגיות” של תיקיות: :contentReference[oaicite:10]{index=10}

MIMIC-III (שורש “שטוח” של CSVים)

נדרשים קבצים (case-insensitive, .csv או .csv.gz) כגון: MICROBIOLOGYEVENTS, PRESCRIPTIONS, ADMISSIONS, PATIENTS, D_ITEMS, CHARTEVENTS, D_LABITEMS, LABEVENTS. :contentReference[oaicite:11]{index=11}

MIMIC-IV demo (תיקיות hosp/ ו-icu/)

שורש שמכיל hosp/ ו-icu/, כשהסקריפט פותר אוטומטית את הקבצים המקבילים. :contentReference[oaicite:12]{index=12}

תזכורת פרקטית: גם אם MIMIC הוא דה-מזוהה, הוא עדיין דאטה רגיש ומחייב הרשאות/מדיניות שימוש מסודרת. :contentReference[oaicite:13]{index=13}

התקנה והרצה

ה-README מציע Python 3.9+ והתקנה מינימלית:

pip install numpy scikit-learn
pip install torch
pip install matplotlib   # אופציונלי (גרפים ל-PNG)
pip install scipy        # אופציונלי (p-values טובים יותר)

(GitHub)

הרצה:

python mimic3.py

(GitHub)

במהלך הריצה, הסקריפט (בגדול) מגלה שורשי דאטה, פותר נתיבי קבצים ל-MIMIC-III/IV, בונה תוויות מהמיקרוביולוגיה דרך map_org, בונה one-hot לחשיפה לאנטיביוטיקה לפי hadm_id, מחשב ויטליים/מעבדה בחלון השעות הראשונות מהקבלה, מאמן את המודל ומדפיס/שומר תוצרים. (GitHub)

טיפ פרקטי: גילוי שורשי דאטה בלי כאב ראש

אפשר להגדיר:

MIMIC_AUTOROOTS="/data/mimic3_demo_1_4,/data/mimic-iv-demo-2.2"

כדי לכוון את ה-auto discovery. (GitHub)

“כפתורי כוונון” דרך משתני סביבה

הענף חושף המון knobs, אבל הנה הסט הכי שימושי להתחלה: (GitHub)

  • חלון/Batching: HOURS_WINDOW (ברירת מחדל 24), BATCH_SIZE (64)
  • עצירה מוקדמת: TARGET_STOP_METRIC (acc/f1), TARGET_ACC, TARGET_F1, EARLY_PATIENCE, ועוד
  • Loss: LOSS_NAME (ce/wce/focal/cb_focal), FOCAL_GAMMA, CB_BETA, LOSS_LABEL_SMOOTHING, BOTHER_EXTRA_DOWNWEIGHT
  • טקסט/רצף: MAX_TEXT_TOKENS, TEXT_SEQ_LEN, EMBED_DIM, CNN_FILTERS, RNN_UNITS, LSTM_UNITS, MIMIC_ACTIVATIONS
  • Device: DEVICE (cpu/cuda/auto) (GitHub)

מה מקבלים בסוף? “מדדים שמרגישים Production”

מעבר ל-accuracy, הפייפליין כולל:

  • התפלגות תוויות וסדר פיצ’רים נומריים שנאכף (כולל הויטליים + האנטיביוטיקות). (GitHub)
  • דוחות precision/recall/F1 פר-מחלקה + דו"ח MRSA מול MSSA. (GitHub)
  • Confusion matrix + ניתוח One-vs-Rest (TP/FP/FN/TN, Sens/Spec/PPV/F1). (GitHub)
  • ROC-AUC ו-PR-AUC (OvR, וגם macro/weighted). (GitHub)
  • קליברציה: ECE + Brier + טבלת reliability. (GitHub)
  • Bias checks “best effort” אם יש עמודות מתאימות. (GitHub)

בקיצור: זה לא רק “המודל הצליח”, אלא גם ניסיון אמיתי להבין איפה הוא מצליח, איפה הוא טועה, ועד כמה הוא בטוח בעצמו.


מגבלות (בכוונה) ומה הייתי משפר מכאן

  • Streaming במקום Pandas: מעולה לזיכרון — פחות מעולה למהירות. זה דמו חכם, לא מערכת אופטימיזציה ל-I/O. (GitHub)
  • תלות חזקה ב-map_org(): איכות המיפוי תשפיע ישירות על התפלגות הכיתות ועל “הבריחה” ל-B:OTHER. (GitHub)
  • הקשר רפואי: גם דמו צריך להישאר עם גבולות ברורים (“לא לשימוש קליני”). (GitHub)

סיכום

אם אתם אוהבים פרויקטים שמעדיפים פשטות, שחזוריות, ומדדים אמיתיים על פני “סטאק מפואר” — הענף mimic3+4 של penuX הוא אחלה דוגמה למה אפשר להשיג עם החלטות הנדסיות ממוקדות: קובץ אחד, בלי Pandas, PyTorch בלבד, ו-evaluation שמכבד את הבעיה. (GitHub)

עודכן לאחרונה December 31, 2025: Update 31-12-2025.md (162afc8)