التكنولوجيا والويب

استخدام شبكات Bayesian للتنبؤ بحجم الخدمات الإضافية في المستشفيات | بواسطة غابي فيرزينو


مثال بايثون باستخدام متغيرات الإدخال التشخيصية

نحو علم البيانات
صورة من Unsplash ، بواسطة EJ Strat

منذ أن كنت أعمل مع بيانات الرعاية الصحية (ما يقرب من 10 سنوات حتى الآن) ، كان التنبؤ بحجم المريض في المستقبل أمرًا صعبًا. هناك الكثير من التبعيات التي يجب مراعاتها – طلبات المريض وشدتها ، والاحتياجات الإدارية ، وقيود غرفة الفحص ، ومزود مريض للتو ، وعاصفة ثلجية سيئة. بالإضافة إلى ذلك ، يمكن أن يكون للسيناريوهات غير المتوقعة تأثيرات متتالية على الجدولة وتخصيص الموارد التي تتعارض حتى مع أفضل توقعات Excel.

هذه الأنواع من المشكلات مثيرة حقًا لمحاولة حلها من منظور البيانات ، واحدة لأنها صعبة ويمكنك مضغها لبعض الوقت ، ولكن أيضًا لأنه حتى التحسينات الطفيفة يمكن أن تؤدي إلى مكاسب كبيرة (على سبيل المثال ، تحسين إنتاجية المريض ، وانخفاض أوقات انتظار ، ومقدمو خدمات أكثر سعادة ، وتكاليف أقل).

كيف تحلها بعد ذلك؟ حسنًا ، توفر لنا Epic الكثير من البيانات ، بما في ذلك السجلات الفعلية لوقت وصول المرضى لمواعيدهم. مع معرفة المخرجات التاريخية ، نحن بشكل أساسي في فضاء التعلم الخاضع للإشراف ، وتعد شبكات Bayesian Networks (BNs) نماذج بيانية احتمالية جيدة.

بينما يمكن اتخاذ معظم القرارات بشأن مُدخل واحد (على سبيل المثال ، “هل يجب أن أحضر معطف واق من المطر؟” ، إذا كان الإدخال “إنها تمطر” ، فإن القرار هو “نعم”) ، يمكن أن تتعامل BNs بسهولة مع اتخاذ قرارات أكثر تعقيدًا – تلك التي تنطوي على مدخلات متعددة ، متفاوتة الاحتمالات والتبعيات. في هذه المقالة ، سأذهب إلى “لوحة الخدش” في لغة الثعبان وهي BN بسيطة للغاية يمكنها إنتاج درجة احتمالية لمريض يصل خلال شهرين بناءً على الاحتمالات المعروفة لثلاثة عوامل: الأعراض ، ومرحلة السرطان ، وهدف العلاج.

فهم شبكات بايزي:

تعتبر شبكة بايز في جوهرها تمثيلاً رسوميًا لتوزيع احتمالي مشترك باستخدام الرسم البياني غير الدوري الموجه (DAG). تمثل العقد في DAG متغيرات عشوائية ، وتشير الحواف الموجهة إلى العلاقات السببية أو التبعيات الشرطية بين هذه المتغيرات. كما هو الحال بالنسبة لجميع مشاريع علوم البيانات ، فإن قضاء الكثير من الوقت مع أصحاب المصلحة في البداية لرسم خريطة سير العمل بشكل صحيح (على سبيل المثال ، المتغيرات) المشاركة في صنع القرار أمر بالغ الأهمية للتنبؤات عالية الجودة.

لذلك ، سأبتكر سيناريو نجتمع فيه مع شركائنا في طب أورام الثدي ويوضحون أن ثلاثة متغيرات حاسمة لتحديد ما إذا كان المريض سيحتاج إلى موعد في شهرين: الأعراض ، ومرحلة السرطان ، وهدف العلاج. أنا أصنع هذا وأنا أكتب ، لكن دعنا نذهب معه.

(في الواقع ، سيكون هناك العشرات من العوامل التي تؤثر على أحجام المرضى في المستقبل ، بعضها من تبعيات فردية أو متعددة ، والبعض الآخر مستقل تمامًا ولكن لا يزال مؤثرًا).

سأقول إن سير العمل يشبه ما سبق: تعتمد المرحلة على أعراضهم ، لكن نوع العلاج مستقل عن هؤلاء ويؤثر أيضًا على الموعد الذي يحدث في غضون شهرين.

بناءً على ذلك ، سنقوم بإحضار البيانات لهذه المتغيرات من مصدر بياناتنا (بالنسبة لنا ، Epic) ، والتي قد تحتوي مرة أخرى معروف قيم عقدة النتيجة (Appointment_2months) بعنوان “yes” أو “no”.

# install the packages
import pandas as pd # for data manipulation
import networkx as nx # for drawing graphs
import matplotlib.pyplot as plt # for drawing graphs

!pip install pybbn
# for creating Bayesian Belief Networks (BBN)
from pybbn.graph.dag import Bbn
from pybbn.graph.edge import Edge, EdgeType
from pybbn.graph.jointree import EvidenceBuilder
from pybbn.graph.node import BbnNode
from pybbn.graph.variable import Variable
from pybbn.pptc.inferencecontroller import InferenceController

# Create nodes by manually typing in probabilities
Symptom = BbnNode(Variable(0, 'Symptom', ('Non-Malignant', 'Malignant')), (0.30658, 0.69342))
Stage = BbnNode(Variable(1, 'Stage', ('Stage_III_IV', 'Stage_I_II')), (0.92827, 0.07173,
0.55760, 0.44240))
TreatmentTypeCat = BbnNode(Variable(2, 'TreatmentTypeCat', ('Adjuvant/Neoadjuvant', 'Treatment', 'Therapy')), (0.58660, 0.24040, 0.17300))
Appointment_2weeks = BbnNode(Variable(3, 'Appointment_2weeks', ('No', 'Yes')), (0.92314, 0.07686,
0.89072, 0.10928,
0.76008, 0.23992,
0.64250, 0.35750,
0.49168, 0.50832,
0.32182, 0.67818))

أعلاه ، دعنا ندخل بعض درجات الاحتمالية يدويًا للمستويات في كل متغير (عقدة). في الممارسة العملية ، يمكنك استخدام الجدول الترافقي لتحقيق ذلك.

على سبيل المثال ، بالنسبة لمتغير الأعراض ، سأحصل على ترددات من مستويين ، حوالي 31 ٪ غير خبيثة و 69 ٪ خبيثة.

الصورة من قبل المؤلف

بعد ذلك ، نأخذ في الاعتبار المتغير التالي ، والمرحلة ، والجدولي الذي يحتوي على Symptom للحصول على هذه الترددات.

الصورة من قبل المؤلف

وهكذا وهكذا دواليك ، حتى يتم تحديد جميع الجداول الجدلية بين أزواج الوالدين والطفل.

الآن ، تتضمن معظم BNs العديد من العلاقات بين الوالدين والطفل ، لذلك يمكن أن يصبح حساب الاحتمالات مملاً (وعرضة للخطأ بشكل كبير) ، لذلك يمكن للوظيفة أدناه حساب مصفوفة الاحتمالات لأي عقدة فرعية تتوافق مع 0 أو 1 أو 2 من الوالدين.

# This function helps to calculate probability distribution, which goes into BBN (note, can handle up to 2 parents)
def probs(data, child, parent1=None, parent2=None):
if parent1==None:
# Calculate probabilities
prob=pd.crosstab(data(child), 'Empty', margins=False, normalize="columns").sort_index().to_numpy().reshape(-1).tolist()
elif parent1!=None:
# Check if child node has 1 parent or 2 parents
if parent2==None:
# Caclucate probabilities
prob=pd.crosstab(data(parent1),data(child), margins=False, normalize="index").sort_index().to_numpy().reshape(-1).tolist()
else:
# Caclucate probabilities
prob=pd.crosstab((data(parent1),data(parent2)),data(child), margins=False, normalize="index").sort_index().to_numpy().reshape(-1).tolist()
else: print("Error in Probability Frequency Calculations")
return prob

ثم نقوم بإنشاء عقد BN الفعلية والشبكة نفسها:

# Create nodes by using our earlier function to automatically calculate probabilities
Symptom = BbnNode(Variable(0, 'Symptom', ('Non-Malignant', 'Malignant')), probs(df, child='SymptomCat'))
Stage = BbnNode(Variable(1, 'Stage', ('Stage_I_II', 'Stage_III_IV')), probs(df, child='StagingCat', parent1='SymptomCat'))
TreatmentTypeCat = BbnNode(Variable(2, 'TreatmentTypeCat', ('Adjuvant/Neoadjuvant', 'Treatment', 'Therapy')), probs(df, child='TreatmentTypeCat'))
Appointment_2months = BbnNode(Variable(3, 'Appointment_2months', ('No', 'Yes')), probs(df, child='Appointment_2months', parent1='StagingCat', parent2='TreatmentTypeCat'))

# Create Network
bbn = Bbn() \
.add_node(Symptom) \
.add_node(Stage) \
.add_node(TreatmentTypeCat) \
.add_node(Appointment_2months) \
.add_edge(Edge(Symptom, Stage, EdgeType.DIRECTED)) \
.add_edge(Edge(Stage, Appointment_2months, EdgeType.DIRECTED)) \
.add_edge(Edge(TreatmentTypeCat, Appointment_2months, EdgeType.DIRECTED))

# Convert the BBN to a join tree
join_tree = InferenceController.apply(bbn)

وكلنا جاهزون. لنقم الآن بتشغيل بعض الافتراضات من خلال BN لدينا ونقيم المخرجات.

تقييم مخرجات BN

أولاً ، دعنا نلقي نظرة على احتمالية كل عقدة كما هي ، دون الإعلان عن أي شروط على وجه التحديد.

# Define a function for printing marginal probabilities
# Probabilities for each node
def print_probs():
for node in join_tree.get_bbn_nodes():
potential = join_tree.get_bbn_potential(node)
print("Node:", node)
print("Values:")
print(potential)
print('----------------')

# Use the above function to print marginal probabilities
print_probs()

Node: 1|Stage|Stage_I_II,Stage_III_IV
Values:
1=Stage_I_II|0.67124
1=Stage_III_IV|0.32876
----------------
Node: 0|Symptom|Non-Malignant,Malignant
Values:
0=Non-Malignant|0.69342
0=Malignant|0.30658
----------------
Node: 2|TreatmentTypeCat|Adjuvant/Neoadjuvant,Treatment,Therapy
Values:
2=Adjuvant/Neoadjuvant|0.58660
2=Treatment|0.17300
2=Therapy|0.24040
----------------
Node: 3|Appointment_2weeks|No,Yes
Values:
3=No|0.77655
3=Yes|0.22345
----------------

بمعنى ، جميع المرضى في مجموعة البيانات هذه لديهم احتمالية بنسبة 67٪ لكونهم Stage_I_II ، واحتمال 69٪ بأن يكونوا غير خبيثين ، واحتمال 58٪ بالحاجة إلى علاج مساعد / نيوادجوفانت ، و 22٪ منهم فقط احتاجوا إلى موعد لمدة شهرين من الآن.

يمكننا الحصول على ذلك بسهولة من جداول التردد البسيطة بدون BN.

لكن الآن ، دعنا نطرح سؤالاً أكثر شرطية: ما هو احتمال أن يحتاج المريض إلى رعاية في غضون شهرين بالنظر إلى أن لديه Stage = Stage_I_II ولديه TreatmentTypeCat = Therapy. ضع في اعتبارك أيضًا حقيقة أن مقدم الخدمة لا يعرف شيئًا عن أعراضه حتى الآن (ربما لم ير المريض بعد).

سنقوم بتشغيل ما نعرف أنه صحيح في العقد:

# To add evidence of events that happened so probability distribution can be recalculated
def evidence(ev, nod, cat, val):
ev = EvidenceBuilder() \
.with_node(join_tree.get_bbn_node_by_name(nod)) \
.with_evidence(cat, val) \
.build()
join_tree.set_observation(ev)

# Add more evidence
evidence('ev1', 'Stage', 'Stage_I_II', 1.0)
evidence('ev2', 'TreatmentTypeCat', 'Therapy', 1.0)
# Print marginal probabilities
print_probs()

الذي يعود:

Node: 1|Stage|Stage_I_II,Stage_III_IV
Values:
1=Stage_I_II|1.00000
1=Stage_III_IV|0.00000
----------------
Node: 0|Symptom|Non-Malignant,Malignant
Values:
0=Non-Malignant|0.57602
0=Malignant|0.42398
----------------
Node: 2|TreatmentTypeCat|Adjuvant/Neoadjuvant,Treatment,Therapy
Values:
2=Adjuvant/Neoadjuvant|0.00000
2=Treatment|0.00000
2=Therapy|1.00000
----------------
Node: 3|Appointment_2months|No,Yes
Values:
3=No|0.89072
3=Yes|0.10928
----------------

هذا المريض لديه فرصة 11٪ فقط للوصول خلال شهرين.

ملاحظة حول أهمية متغيرات مدخلات الجودة:

يعتمد نجاح BN في تقديم تقدير موثوق للزيارة المستقبلية بشكل كبير على رسم خرائط دقيقة لسير العمل لرعاية المرضى. عادة ما يحتاج المرضى الذين يقدمون عرضًا مشابهًا ، في ظروف مماثلة ، إلى خدمات مماثلة. إن تبديل تلك المدخلات ، التي يمكن أن تمتد خصائصها من السريرية إلى الإدارية ، تتوافق في النهاية مع مسار حتمي إلى حد ما لاحتياجات الخدمة. ولكن كلما كان الإسقاط الزمني أكثر تعقيدًا أو بعيدًا ، زادت الحاجة إلى عناصر BN أكثر تحديدًا وتعقيدًا مع مدخلات عالية الجودة.

إليكم السبب:

  1. تمثيل دقيق: يجب أن يعكس هيكل شبكة بايز العلاقات الفعلية بين المتغيرات. يمكن أن تؤدي المتغيرات المختارة بشكل سيئ أو التبعيات التي يساء فهمها إلى تنبؤات ورؤى غير دقيقة.
  2. الاستدلال الفعال: تعزز متغيرات إدخال الجودة من قدرة النموذج على أداء الاستدلال الاحتمالي. عندما يتم توصيل المتغيرات بدقة بناءً على اعتمادها الشرطي ، يمكن للشبكة توفير رؤى أكثر موثوقية.
  3. تعقيد أقل: يمكن أن يؤدي تضمين المتغيرات غير الملائمة أو الزائدة عن الحاجة إلى تعقيد النموذج بلا داع وزيادة المتطلبات الحسابية. تعمل مدخلات الجودة على تبسيط الشبكة ، مما يجعلها أكثر كفاءة.

شكرا للقراءة. يسعدني التواصل مع أي شخص على LinkedIn! إذا كنت مهتمًا بتقاطع علم البيانات والرعاية الصحية أو إذا كانت لديك تحديات مثيرة للاهتمام لمشاركتها ، فالرجاء ترك تعليق أو رسالة مباشرة.

تحقق من بعض مقالاتي الأخرى:

لماذا يتم المبالغة في وصف الفصول المتوازنة

رموز CPT الهندسية المميزة

7 خطوات لتصميم شبكة عصبية أساسية


اكتشاف المزيد من إشراق العالم

اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

زر الذهاب إلى الأعلى