penuX: סיווג פתוגנים ב-MIMIC-III/IV — קובץ אחד, PyTorch בלבד, בלי Pandas
בענף 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)