تطبيق شبكة عصبية عميقة لكشف مرض السكري باستخدام التعلم العميق

المقدمة
يُعد مرض السكري من الأمراض المزمنة التي تؤثر على ملايين الأشخاص حول العالم، ويُعتبر الكشف المبكر عنه أمرًا بالغ الأهمية للحد من مضاعفاته. مع تطور التعلم العميق (Deep Learning)، أصبح بالإمكان تطوير شبكات عصبية عميقة (Deep Neural Networks – DNNs) قادرة على تحليل البيانات الطبية والتنبؤ بإصابة المرضى بالسكري بدقة عالية.
في هذا المقال، سنقوم ببناء نموذج شبكة عصبية عميقة (DNN) باستخدام TensorFlow وKeras لتشخيص مرض السكري، وذلك بالاعتماد على مجموعة بيانات مرض السكري الخاصة بمستشفى بيمبروك (Pima Indians Diabetes Dataset)، وهي مجموعة بيانات شهيرة تحتوي على معلومات سريرية لمرضى تم فحصهم.
1. شرح مجموعة بيانات مرض السكري
نظرة عامة على مجموعة البيانات
تُعد مجموعة بيانات مرض السكري الخاصة بمستشفى بيمبروك (Pima Indians Diabetes Dataset) واحدة من أكثر مجموعات البيانات استخدامًا في مجال تحليل البيانات الطبية والتعلم الآلي. تحتوي هذه المجموعة على 768 عينة، وتمثل بيانات طبية لنساء من قبيلة Pima الهندية (وهي قبيلة أمريكية معروفة بارتفاع معدل الإصابة بمرض السكري بين أفرادها).
يتم استخدام هذه البيانات لبناء نموذج يمكنه التنبؤ بإصابة الشخص بمرض السكري من عدمه استنادًا إلى مجموعة من المتغيرات الطبية.
شرح المتغيرات في مجموعة البيانات
تتكون مجموعة البيانات من 8 ميزات (Features) و متغير هدف (Label) كما يلي:
العمود | الوصف | نوع البيانات |
---|---|---|
Pregnancies | عدد مرات الحمل | عدد صحيح (int) |
Glucose | مستوى الجلوكوز في الدم بعد اختبار سكر الدم الصيامي | عدد عشري (float) |
BloodPressure | ضغط الدم الانقباضي (mm Hg) | عدد عشري (float) |
SkinThickness | سُمك الجلد عند قياسه بالملم | عدد عشري (float) |
Insulin | مستوى الإنسولين في الدم بعد ساعتين من اختبار تحمل الجلوكوز | عدد عشري (float) |
BMI (Body Mass Index) | مؤشر كتلة الجسم (الوزن بالكجم ÷ الطول بالمتر²) | عدد عشري (float) |
DiabetesPedigreeFunction | مقياس لاحتمالية وراثة السكري بناءً على تاريخ العائلة | عدد عشري (float) |
Age | عمر المريض بالسنوات | عدد صحيح (int) |
Outcome (التصنيف – Label) | 0: غير مصاب بالسكري / 1: مصاب بالسكري | عدد صحيح (0 أو 1) |
🔹 المتغير المستهدف (Label) هو “Outcome”، وهو متغير ثنائي القيم (0 أو 1):
- 0 = الشخص غير مصاب بالسكري.
- 1 = الشخص مصاب بالسكري.
كيفية استخدام البيانات في النموذج
في نموذج التعلم العميق (Deep Learning) الذي نبنيه، يتم استخدام هذه البيانات كما يلي:
- الميزات (Features): جميع الأعمدة باستثناء “Outcome” تُستخدم كمدخلات (Input) للنموذج.
- المتغير المستهدف (Label): العمود “Outcome” هو المخرجات (Output) التي نحاول التنبؤ بها باستخدام الشبكة العصبية.
2. تحميل البيانات وتحليلها
تحميل البيانات إلى Google Colab
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# تحميل مجموعة بيانات السكري
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv"
columns = ['Pregnancies', 'Glucose', 'BloodPressure', 'SkinThickness', 'Insulin', 'BMI', 'DiabetesPedigreeFunction', 'Age', 'Outcome']
df = pd.read_csv(url, names=columns)
# عرض أول 5 صفوف من البيانات
df.head()
استكشاف البيانات وتحليلها
# عرض معلومات البيانات
df.info()
# عرض الإحصائيات العامة
df.describe()
# التحقق من القيم الناقصة
df.isnull().sum()
3. تحضير البيانات للتدريب
تقسيم البيانات إلى ميزات وهدف
X = df.drop(columns=['Outcome']) # الميزات
y = df['Outcome'] # المتغير المستهدف
# تقسيم البيانات إلى تدريب واختبار
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
تطبيع البيانات
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
4. بناء نموذج الشبكة العصبية العميقة
import tensorflow as tf
from tensorflow import keras
# إنشاء النموذج
model = keras.Sequential([
keras.layers.Dense(16, activation='relu', input_shape=(X_train.shape[1],)),
keras.layers.Dense(32, activation='relu'),
keras.layers.Dense(16, activation='relu'),
keras.layers.Dense(1, activation='sigmoid')
])
# تجميع النموذج
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
# عرض ملخص النموذج
model.summary()
5. تدريب النموذج
history = model.fit(X_train, y_train, epochs=100, batch_size=16, validation_data=(X_test, y_test))
6. تقييم أداء النموذج
test_loss, test_acc = model.evaluate(X_test, y_test)
print(f"دقة النموذج على بيانات الاختبار: {test_acc:.2f}")
رسم منحنى دقة التدريب
plt.plot(history.history['accuracy'], label='دقة التدريب')
plt.plot(history.history['val_accuracy'], label='دقة التحقق')
plt.xlabel('عدد العصور (Epochs)')
plt.ylabel('الدقة')
plt.legend()
plt.title("تحسن الدقة مع مرور الوقت")
plt.show()
7. إجراء التنبؤات
y_pred = model.predict(X_test)
y_pred = (y_pred > 0.5).astype(int) # تحويل القيم إلى 0 أو 1
في الختام
نجحنا في بناء شبكة عصبية عميقة (DNN) باستخدام TensorFlow وKeras لتشخيص مرض السكري بناءً على بيانات مرضى حقيقيين. يمكن تحسين النموذج من خلال إضافة طبقات عصبية أكثر أو جمع المزيد من البيانات الطبية.