أشجار القرار: النظرية والتنفيذ
شوائب Gini، وكسب المعلومات، وعمق الشجرة، وفرط الملاءمة — باستخدام sklearn DecisionTreeClassifier.
أشجار القرار: النظرية والتنفيذ درس مجاني في Learn AI with Python على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Learn AI with Python، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Learn AI with Python 4 دروس في المجموع.
ما شجرة القرار
تُقسّم شجرة القرار البيانات إلى فروع استنادًا إلى قيم الميزات، فتطرح أسئلة بنعم أو لا حتى تصل إلى تنبؤ عند عقدة ورقية.
تختبر كل عقدة داخلية ميزة واحدة، ويمثل كل فرع نتيجة، وتعيّن كل عقدة ورقية فئة. يسهل تفسير الأشجار لأن بإمكانك تتبّع مسار القرارات.
شوائب جيني
تقيس شوائب جيني مدى اختلاط الفئات في العقدة. وتكون قيمة جيني في العقدة النقية، التي تنتمي جميع عناصرها إلى فئة واحدة، مساوية للصفر.
الصيغة هي Gini = 1 - sum(p_i^2)، حيث تمثل p_i نسبة الفئة i. تختار الشجرة التقسيمات التي تقلل الشوائب بأكبر قدر.
import numpy as np
def gini(labels):
classes, counts = np.unique(labels, return_counts=True)
probs = counts / counts.sum()
return 1 - np.sum(probs ** 2)
print(gini([0, 0, 1, 1])) # 0.5 (max mix)
print(gini([0, 0, 0, 0])) # 0.0 (pure)كسب المعلومات والانتروبيا
معيار بديل للتقسيم هو كسب المعلومات، ويعتمد على الانتروبيا. والانتروبيا هي -sum(p_i * log2(p_i)).
كسب المعلومات = انتروبيا العقدة الأصلية - الانتروبيا الموزونة للعقد الفرعية. ينتج كل من جيني والانتروبيا عادةً أشجارًا متشابهة، لكن حساب جيني أسرع قليلًا.
import numpy as np
def entropy(labels):
_, counts = np.unique(labels, return_counts=True)
p = counts / counts.sum()
return -np.sum(p * np.log2(p))
print(entropy([0, 0, 1, 1])) # 1.0
print(entropy([0, 0, 0, 1])) # ~0.81تدريب DecisionTreeClassifier
توفر Scikit-learn الفئة DecisionTreeClassifier. وتختار معيار التقسيم باستخدام المعلمة criterion، وقيمتها gini أو entropy.
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
X, y = load_iris(return_X_y=True)
Xtr, Xte, ytr, yte = train_test_split(X, y, random_state=0)
clf = DecisionTreeClassifier(criterion="gini", random_state=0)
clf.fit(Xtr, ytr)
print("Accuracy:", clf.score(Xte, yte))فرط التكيّف و max_depth
تنمو الشجرة غير المقيّدة حتى تصبح كل عقدة ورقية نقية، فتحفظ الضوضاء بدلًا من تعلّم النمط. وهذا إفراط في التكيّف.
تحدّ المعلمة max_depth من عمق الشجرة، مما يجبرها على التعميم. العمق الأصغر = نموذج أبسط = إفراط أقل في التكيّف.
from sklearn.tree import DecisionTreeClassifier
shallow = DecisionTreeClassifier(max_depth=3, random_state=0)
deep = DecisionTreeClassifier(max_depth=None, random_state=0)
# shallow generalizes better on unseen data;
# deep often overfits the training setمعلمات التقليم المسبق الأخرى
إلى جانب max_depth، يمكنك التحكم في نمو الشجرة باستخدام:
min_samples_splitالحد الأدنى لعدد العينات اللازمة لتقسيم عقدةmin_samples_leafالحد الأدنى لعدد العينات في العقدة الورقيةmax_leaf_nodesحد أقصى لإجمالي العقد الورقية
تقلل هذه المعلمات جميعًا التباين وتكافح الإفراط في التكيّف.
from sklearn.tree import DecisionTreeClassifier
clf = DecisionTreeClassifier(
max_depth=5,
min_samples_split=10,
min_samples_leaf=5,
random_state=0,
)تصوير الشجرة باستخدام plot_tree
ترسم plot_tree الشجرة كاملة، بحيث يمكنك قراءة كل تقسيم وقيمة جيني وتوزيع الفئات في كل عقدة.
import matplotlib.pyplot as plt
from sklearn.tree import plot_tree
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
X, y = load_iris(return_X_y=True)
clf = DecisionTreeClassifier(max_depth=3).fit(X, y)
plt.figure(figsize=(12, 6))
plot_tree(clf, filled=True, feature_names=load_iris().feature_names)
plt.show()أهمية الميزات
بعد التدريب، تخبرك feature_importances_ بمقدار خفض كل ميزة للشوائب عبر جميع التقسيمات. ويبلغ مجموع القيم 1.0.
تُعد هذه طريقة سريعة لترتيب المدخلات الأكثر أهمية للنموذج.
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
data = load_iris()
clf = DecisionTreeClassifier(max_depth=3).fit(data.data, data.target)
for name, imp in zip(data.feature_names, clf.feature_importances_):
print(f"{name}: {imp:.3f}")التقليم وفق تعقيد التكلفة (ccp_alpha)
ينمّي التقليم اللاحق شجرة كاملة ثم يزيل الفروع الضعيفة. وتتحكم المعلمة ccp_alpha في شدة التقليم: إذ تزيل قيمة alpha الأعلى عددًا أكبر من العقد.
استخدم cost_complexity_pruning_path للعثور على قيم alpha المرشحة.
from sklearn.tree import DecisionTreeClassifier
base = DecisionTreeClassifier(random_state=0)
path = base.cost_complexity_pruning_path(Xtr, ytr)
alphas = path.ccp_alphas
pruned = DecisionTreeClassifier(ccp_alpha=0.01, random_state=0)
pruned.fit(Xtr, ytr)اختيار أفضل قيمة لـ Alpha
لاختيار ccp_alpha، درّب شجرة واحدة لكل قيمة alpha مرشحة، ثم قارن دقة التحقق. وتوازن أفضل قيمة alpha بين الدقة والبساطة.
from sklearn.tree import DecisionTreeClassifier
scores = []
for a in alphas:
t = DecisionTreeClassifier(ccp_alpha=a, random_state=0)
t.fit(Xtr, ytr)
scores.append((a, t.score(Xte, yte)))
best = max(scores, key=lambda s: s[1])
print("Best alpha:", best[0])نقاط القوة والضعف
الإيجابيات: سهلة التفسير، ولا تحتاج إلى تحجيم، وتتعامل مع الحدود غير الخطية وأنواع البيانات المختلطة.
السلبيات: تباينها مرتفع، إذ قد تؤدي تغييرات صغيرة في البيانات إلى قلب الشجرة، كما أنها عرضة للإفراط في التكيّف ولا تستخدم إلا تقسيمات محاذية للمحاور. وتحفّز هذه العيوب استخدام أساليب التجميع مثل الغابات العشوائية.
تحقق سريع
اختبر مدى فهمك لمفاهيم أشجار القرار.
مراجعة
مراجعة: تقسّم أشجار القرار البيانات باستخدام شوائب جيني أو كسب المعلومات. كافح الإفراط في التكيّف باستخدام التقليم المسبق مثل max_depth وmin_samples_leaf، أو التقليم اللاحق باستخدام ccp_alpha. افحص النماذج باستخدام plot_tree وfeature_importances_. ويدفع تباينها المرتفع إلى استخدام أساليب التجميع.
الأسئلة الشائعة
هل درس «أشجار القرار: النظرية والتنفيذ» مجاني؟
نعم — نص درس «أشجار القرار: النظرية والتنفيذ» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Learn AI with Python، انتقل إلى CoddyKit PRO. تتضمن دورة Learn AI with Python 4 دروس في المجموع.
ماذا ستتعلم في «أشجار القرار: النظرية والتنفيذ»؟
شوائب Gini، وكسب المعلومات، وعمق الشجرة، وفرط الملاءمة — باستخدام sklearn DecisionTreeClassifier. تتمرن على Learn AI with Python مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Learn AI with Python؟
لا تُشترط خبرة سابقة. Learn AI with Python على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «أشجار القرار: النظرية والتنفيذ»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Learn AI with Python هذا؟
نعم. كل درس في Learn AI with Python يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- أشجار القرار: النظرية والتنفيذ
- الغابات العشوائية وBagging
- التعزيز التدرجي: GBM وXGBoost
- LightGBM وCatBoost