RETAIN هو نموذج تنبؤي قابل للتفسير لتطبيقات الرعاية الصحية. بالنظر إلى سجلات المرضى، يمكنه إجراء تنبؤات مع شرح كيفية مساهمة كل رمز طبي (رموز التشخيص، أو رموز الدواء، أو رموز الإجراءات) في كل زيارة في التنبؤ. التفسير ممكن بسبب استخدام آلية الانتباه العصبي.
باستخدام RETAIN، يمكنك حساب مدى مساهمة كل رمز طبي بشكل إيجابي/سلبي (التشخيص أو الدواء أو رمز الإجراء) في الزيارات المختلفة في النتيجة النهائية. في هذه الحالة، نتوقع ما إذا كان سيتم تشخيص إصابة المريض بقصور القلب (HF). يمكنك أن ترى أن الرموز المرتبطة بشكل كبير بـ HF تقدم مساهمات إيجابية. يتعلم RETAIN أيضًا الاهتمام بالمعلومات الجديدة أكثر من المعلومات القديمة. يمكنك أن ترى أن خلل ضربات القلب (CD) يقدم مساهمة أكبر كما يحدث في الزيارة الأخيرة.
تطبق RETAIN خوارزمية مقدمة في الورقة التالية:
RETAIN: An Interpretable Predictive Model for Healthcare using Reverse Time Attention Mechanism
Edward Choi, Mohammad Taha Bahadori, Joshua A. Kulas, Andy Schuetz, Walter F. Stewart, Jimeng Sun,
NIPS 2016, pp.3504-3512
تصوغ ورقة RETAIN النموذج على أنه قادر على التنبؤ في كل خطوة زمنية (على سبيل المثال، حاول التنبؤ بالتشخيصات التي سيحصل عليها المريض في كل زيارة)، وتعالج تصنيف التسلسل (على سبيل المثال، بالنظر إلى سجل المريض، هل سيتم تشخيص إصابته بقصور القلب في المستقبل؟) كحالة خاصة، حيث أن تصنيف التسلسل يجعل التنبؤ في الخطوة الزمنية الأخيرة فقط.
ومع ذلك، يتم تنفيذ هذا الرمز لأداء مهمة تصنيف التسلسل. على سبيل المثال، يمكنك استخدام هذا الرمز للتنبؤ بما إذا كان المريض المعين مريضًا بقصور القلب أم لا. أو يمكنك التنبؤ بما إذا كان سيتم إعادة قبول هذا المريض في المستقبل. سيتم إصدار الإصدار الأكثر عمومية من RETAIN في المستقبل.
الخطوة 1: التثبيت
تثبيت بايثون، Theano. نحن نستخدم بايثون 2.7، ثينو 0.8. يمكن تثبيت Theano بسهولة في Ubuntu كما هو مقترح هنا
إذا كنت تخطط لاستخدام حساب GPU، فقم بتثبيت CUDA
قم بتنزيل/استنساخ رمز الاحتفاظ
الخطوة 2: طريقة سريعة لاختبار الاحتفاظ باستخدام MIMIC-III
تصف هذه الخطوة كيفية تدريب RETAIN، مع الحد الأدنى لعدد الخطوات باستخدام MIMIC-III، للتنبؤ بوفيات المرضى باستخدام سجلات زيارتهم.
ستحتاج أولاً إلى طلب الوصول إلى MIMIC-III، وهي سجلات صحية إلكترونية متاحة للعامة تم جمعها من مرضى وحدة العناية المركزة على مدار 11 عامًا.
يمكنك استخدام "process_mimic.py" لمعالجة مجموعة بيانات MIMIC-III وإنشاء مجموعة بيانات تدريب مناسبة لـ RETAIN. ضع البرنامج النصي في نفس الموقع حيث توجد ملفات MIMIC-III CSV، وقم بتشغيل البرنامج النصي. أمر التنفيذ هو python process_mimic.py ADMISSIONS.csv DIAGNOSES_ICD.csv PATIENTS.csv <output file>
.
قم بتشغيل RETAIN باستخدام الملف ".seqs" و".morts" الذي تم إنشاؤه بواسطةprocess_mimic.py. يحتوي الملف ".seqs" على تسلسل الزيارات لكل مريض. تتكون كل زيارة من رموز تشخيصية متعددة. ومع ذلك، نوصي باستخدام الملف ".3digitICD9.seqs" بدلاً من ذلك، حيث ستكون النتائج أكثر قابلية للتفسير. (أو يمكنك استخدام برنامج التصنيف الطبي أحادي المستوى لـ ICD9 لتقليل عدد الرموز إلى بضع مئات، مما سيؤدي إلى تحسين الأداء بشكل أكبر) يحتوي ملف ".morts" على تسلسل علامات الوفيات لكل مريض. الأمر هو python retain.py <3digitICD9.seqs file> 942 <morts file> <output path> --simple_load --n_epochs 100 --keep_prob_context 0.8 --keep_prob_emb 0.5
. 942
هو عدد رموز ICD9 المكونة من 3 أرقام المستخدمة في مجموعة البيانات.
لاختبار النموذج للتفسير، يرجى الرجوع إلى الخطوة 6. لقد وجدت شخصيًا أن اليرقان في الفترة المحيطة بالولادة (ICD9 774) له علاقة عالية بالوفيات.
يصل النموذج إلى AUC أعلى من 0.8 باستخدام الأمر أعلاه، لكن التفسيرات ليست واضحة تمامًا. يمكنك ضبط المعلمات الفائقة، لكنني أشك في أن الأمور ستتحسن بشكل كبير. ففي نهاية المطاف، قام 7500 مريض فقط بأكثر من زيارة واحدة للمستشفى، ومعظمهم قام بزيارتين فقط.
الخطوة 3: كيفية إعداد مجموعة البيانات الخاصة بك
يجب أن تكون مجموعة بيانات التدريب الخاصة بـ RETAIN عبارة عن قائمة Python cPickled من قائمة القائمة. تتوافق القائمة الخارجية مع المرضى، والقائمة الوسيطة لتسلسل الزيارة التي قام بها كل مريض، والقائمة الداخلية للرموز الطبية (مثل رموز التشخيص، وأكواد الدواء، ورموز الإجراءات، وما إلى ذلك) التي حدثت خلال كل زيارة. أولاً، يجب تحويل الرموز الطبية إلى عدد صحيح. ثم يمكن رؤية زيارة واحدة كقائمة من الأعداد الصحيحة. ومن ثم يمكن رؤية المريض كقائمة من الزيارات. على سبيل المثال، يعني [5،8،15] أنه تم تعيين الرمز 5 و8 و15 للمريض في زيارة معينة. إذا قام المريض بزيارتين [1،2،3] و [4،5،6،7]، فيمكن تحويله إلى قائمة قائمة [[1،2،3]، [4،5،6،7] ]]. يمكن تمثيل العديد من المرضى كـ [[[1,2,3]، [4,5,6,7]]، [[2,4]، [8,3,1]، [3]]]، وهو ما يعني هناك مريضان حيث قام المريض الأول بزيارتين وقام المريض الثاني بثلاث زيارات. يجب أن يتم تخليل قائمة القائمة هذه باستخدام cPickle. وسوف نشير إلى هذا الملف باسم "ملف الزيارة".
العدد الإجمالي للرموز الطبية الفريدة مطلوب لتشغيل RETAIN. على سبيل المثال، إذا كانت مجموعة البيانات تستخدم 14000 رمز تشخيص و11000 رمز إجراء، فإن العدد الإجمالي هو 25000.
يجب أن تكون مجموعة بيانات التسمية (دعنا نسميها "ملف التسمية") عبارة عن قائمة Python cPickled. يتوافق كل عنصر مع التسمية الحقيقية لكل مريض. على سبيل المثال، يمكن أن يكون 1 هو مريض الحالة ويمكن أن يكون 0 هو مريض التحكم. إذا كان هناك مريضان حيث يكون المريض الأول فقط هو الحالة، فيجب أن يكون لدينا [1،0].
يجب أن يحتوي "ملف الزيارة" و"ملف التسمية" على 3 مجموعات على التوالي: مجموعة التدريب، ومجموعة التحقق من الصحة، ومجموعة الاختبار. يجب أن يكون امتداد الملف ".train"، و".valid"، و".test" على التوالي.
على سبيل المثال، إذا كنت تريد استخدام ملف يسمى "my_visit_sequences" باعتباره "ملف الزيارة"، فسيحاول RETAIN تحميل "my_visit_sequences.train" و"my_visit_sequences.valid" و"my_visit_sequences.test".
وهذا ينطبق أيضًا على "ملف التسمية"
يمكنك استخدام معلومات الوقت المتعلقة بالزيارات كمصدر إضافي للمعلومات. دعونا نسمي هذا "الملف الزمني". لاحظ أن معلومات الوقت يمكن أن تكون أي شيء: المدة بين الزيارات المتتالية، والعدد التراكمي للأيام منذ الزيارة الأولى، وما إلى ذلك. يجب إعداد "ملف الوقت" كقائمة بايثون cPickled. تتوافق القائمة الخارجية مع المرضى، والقائمة الداخلية تتعلق بالمعلومات الزمنية لكل زيارة. على سبيل المثال، بالنظر إلى "ملف الزيارة" [[[1,2,3], [4,5,6,7]], [[2,4], [8,3,1], [3]]] ، قد يبدو "الملف الزمني" المقابل له بالشكل [[0, 15], [0, 45, 23]]، إذا كنا نستخدم المدة بين الزيارات المتتالية. (بالطبع الأرقام مزيفة، ولقد قمت بتعيين مدة الزيارة الأولى على صفر.) استخدم خيار --time_file <path to time file>
لاستخدام "ملف الوقت" تذكر أن ".train"، ". صالحة"، تنطبق قاعدة ".test" أيضًا على "الملف الزمني" أيضًا.
إضافي: استخدام تمثيلات الكود الطبي الخاصة بك
يتعلم RETAIN داخليًا تمثيل المتجهات للرموز الطبية أثناء التدريب. تتم تهيئة هذه المتجهات بقيم عشوائية بالطبع.
ومع ذلك، يمكنك أيضًا استخدام تمثيلات الكود الطبي الخاصة بك، إذا كان لديك واحدة. (يمكن تدريبهم باستخدام خوارزميات مثل Skip-gram. ارجع إلى Med2Vec أو هذا للحصول على مزيد من التفاصيل.) إذا كنت تريد تقديم تمثيلات الكود الطبي، فيجب أن تكون قائمة (مصفوفة بشكل أساسي) من الصفوف N و أعمدة M حيث N هو عدد الرموز الفريدة في "ملف الزيارة" الخاص بك وM هو حجم تمثيلات التعليمات البرمجية. حدد المسار إلى ملف تمثيل التعليمات البرمجية الخاص بك باستخدام --embed_file <path to embedding file>
. بالإضافة إلى ذلك، حتى إذا كنت تستخدم تمثيلات الكود الطبي الخاصة بك، فيمكنك إعادة تدريبها (ويعرف أيضًا باسم ضبطها بدقة) أثناء تدريب RETAIN. استخدم خيار --embed_finetune
للقيام بذلك. إذا لم تكن تقدم تمثيلات التعليمات البرمجية الطبية الخاصة بك، فسوف تستخدم RETAIN واحدًا تمت تهيئته عشوائيًا، وهو ما يتطلب بوضوح عملية الضبط الدقيق هذه. نظرًا لأن الإعداد الافتراضي هو استخدام الضبط الدقيق، فلا داعي للقلق بشأن ذلك.
الخطوة 4: تشغيل الاحتفاظ
الحد الأدنى للإدخال الذي تحتاجه لتشغيل RETAIN هو "ملف الزيارة"، وعدد الرموز الطبية الفريدة في "ملف الزيارة"، و"ملف التسمية"، ومسار الإخراج. مسار الإخراج هو المكان الذي سيتم فيه حفظ الأوزان والسجل.
python retain.py <visit file> <# codes in the visit file> <label file> <output path>
سيؤدي تحديد خيار --verbose
إلى طباعة عملية التدريب بعد كل 10 دفعات صغيرة.
يمكنك تحديد حجم التضمين W_emb، وحجم الطبقة المخفية من GRU التي تولد ألفا، وحجم الطبقة المخفية من GRU التي تولد النسخة التجريبية. الأوامر المعنية هي --embed_size <integer>
و --alpha_hidden_dim_size <integer>
و --beta_hidden_dim_size <integer>
. على سبيل المثال --alpha_hidden_dim_size 128
سيخبر RETAIN باستخدام GRU مع طبقة مخفية ذات 128 بُعدًا لتوليد ألفا.
يتم تطبيق المتسربين في مكانين: 1) على تضمين الإدخال، 2) على ناقل السياق c_i. يمكن تعديل معدلات التسرب ذات الصلة باستخدام --keep_prob_embed {0.0, 1.0}
و --keep_prob_context {0.0, 1.0}
. تؤثر قيم التسرب على الأداء لذا يوصى بضبطها لتناسب بياناتك.
يمكن تطبيق عمليات تنظيم L2 على W_emb، وw_alpha، وW_beta، وw_output.
يمكن تحديد خيارات إضافية مثل حجم حجم الدفعة وعدد العصور وما إلى ذلك. يمكن الوصول إلى المعلومات التفصيلية عن طريق python retain.py --help
توصيتي الشخصية: استخدم التنظيم المعتدل (0.0001 ~ 0.001) على جميع الأوزان الأربعة، واستخدم التسرب المعتدل على ناقل السياق فقط. لكن هذا يعتمد كليًا على بياناتك، لذا يجب عليك دائمًا ضبط المعلمات الفائقة بنفسك.
الخطوة 5: الحصول على النتائج الخاصة بك
يتحقق RETAIN من AUC لمجموعة التحقق من الصحة بعد كل فترة، وإذا كان أعلى من جميع القيم السابقة، فسيتم حفظ النموذج الحالي. يتم إنشاء ملف النموذج بواسطة numpy.savez_compressed.
الخطوة 6: اختبار النموذج الخاص بك
باستخدام الملف "test_retain.py"، يمكنك حساب مساهمات كل رمز طبي في كل زيارة. أولاً، يجب أن يكون لديك نموذج مدرب تم حفظه بواسطة numpy.savez_compressed. لاحظ أنك بحاجة إلى معرفة التكوين الذي تدربت به على RETAIN (على سبيل المثال، استخدام --time_file
، واستخدام --use_log_time
.)
مرة أخرى، تحتاج إلى إعداد "ملف الزيارة" و"ملف التسمية" بنفس الطريقة. ومع ذلك، هذه المرة، لا تحتاج إلى اتباع قاعدة ".train"، ".valid"، ".test". سيحاول البرنامج النصي للاختبار تحميل اسم الملف كما هو محدد.
تحتاج أيضًا إلى معلومات التعيين بين الرموز الطبية الفعلية للسلسلة ورموز الأعداد الصحيحة الخاصة بها. (على سبيل المثال، تم تعيين "Hypertension" إلى 24) يجب أن يكون هذا الملف (دعنا نسميه "ملف التعيين") عبارة عن قاموس Python cPickled حيث المفاتيح هي سلسلة الرموز الطبية والقيم هي intergers المقابلة. (على سبيل المثال، ملف التعيين الذي تم إنشاؤه بواسطةprocess_mimic.py هو ملف ".types") هذا الملف مطلوب لطباعة مساهمات كل رمز طبي بتنسيق سهل الاستخدام.
بالنسبة للخيارات الإضافية مثل --time_file
أو --use_log_time
، يجب عليك استخدام نفس التكوين الذي قمت بتدريب النموذج به. للحصول على معلومات أكثر تفصيلاً، استخدم خيار "--مساعدة".
الحد الأدنى للإدخال لتشغيل البرنامج النصي للاختبار هو "ملف النموذج" و"ملف الزيارة" و"ملف التسمية" و"ملف التعيين" و"ملف الإخراج". "ملف الإخراج" هو المكان الذي سيتم فيه تخزين المساهمات. python test_retain.py <model file> <visit file> <label file> <mapping file> <output file>