0Pricing
R Academy · درس

أشجار القرار: أساس النماذج التجميعية

أنشئ أشجار القرار وتصورها باستخدام rpart، وافهم المفاضلة بين الانحياز والتباين

أشجار القرار: أساس النماذج التجميعية درس مجاني في R Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في R Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة R Academy 4 دروس في المجموع.

كيفية تقسيم أشجار القرار

تُقسّم شجرة القرار مساحة السمات تكراريًا إلى مناطق مستطيلة. وفي كل عقدة، تبحث الخوارزمية في جميع السمات وجميع نقاط التقسيم الممكنة للعثور على التقسيم الذي يفصل متغير الهدف بأفضل صورة. والنتيجة شجرة من قواعد if-else.

library(rpart)

# Fit a classification tree
tree <- rpart(
  Species ~ .,
  data   = iris,
  method = 'class'  # use 'anova' for regression
)

print(tree)

معيارا التقسيم GINI وEntropy

يقيس معيار التقسيم عدم نقاء العقدة. ويقيس عدم نقاء Gini احتمال تصنيف عنصر مختار عشوائيًا تصنيفًا خاطئًا. أما Entropy، أي كسب المعلومات، فيقيس انخفاض الاضطراب المعلوماتي. وعادةً ما ينتج المعياران أشجارًا متشابهة؛ غير أن Gini أسرع في الحساب، وهو الإعداد الافتراضي في rpart.

# Default: Gini impurity (parms = list(split = 'gini'))
tree_gini <- rpart(Species ~ ., data = iris, method = 'class')

# Using information gain (entropy)
tree_entropy <- rpart(
  Species ~ ., data = iris, method = 'class',
  parms = list(split = 'information')
)

cat('Gini root split:', tree_gini$frame$var[1])
cat('Entropy root split:', tree_entropy$frame$var[1])

printcp() — جدول التعقيد

تطبع printcp(tree) جدول معامل التعقيد (CP). يعرض كل صف حجم الشجرة (عدد عمليات التقسيم)، والخطأ النسبي على بيانات التدريب، والخطأ المُتحقَّق منه بالتقاطع (xerror). يُستخدم جدول CP للعثور على المستوى الأمثل لتشذيب الشجرة.

tree <- rpart(medv ~ ., data = MASS::Boston, method = 'anova',
              control = rpart.control(minsplit = 5, cp = 0.001))

printcp(tree)

# Identify the CP with minimum cross-validated error
best_cp <- tree$cptable[
  which.min(tree$cptable[, 'xerror']),
  'CP'
]
cat('Best CP:', best_cp)

prune() — تشذيب الشجرة

تُشذّب prune(tree, cp) الشجرة إلى مستوى التعقيد المحدد بواسطة cp. يمنع التشذيب فرط التكيّف من خلال دمج الفروع التي تقدم قيمة تنبؤية محدودة. النهج المعتاد هو العثور على قيمة CP التي تقلل خطأ التحقق المتقاطع، ثم تشذيب الشجرة.

best_cp <- tree$cptable[
  which.min(tree$cptable[, 'xerror']), 'CP'
]

pruned_tree <- prune(tree, cp = best_cp)

cat('Original tree nodes:', nrow(tree$frame))
cat('Pruned tree nodes:', nrow(pruned_tree$frame))

rpart.plot() — تصوّر الشجرة

تنتج rpart.plot(tree) من حزمة rpart.plot تصوّرًا واضحًا وملوّنًا لشجرة القرار. تعرض كل عقدة داخلية قاعدة التقسيم، بينما تعرض كل ورقة الفئة المتوقعة ونسبة عينات التدريب.

library(rpart.plot)

tree <- rpart(Species ~ ., data = iris, method = 'class')
pruned <- prune(tree, cp = 0.02)

rpart.plot(
  pruned,
  type   = 4,     # split labels on branches
  extra  = 104,   # show class + probability
  fallen.leaves = TRUE
)

المفاضلة بين الانحياز والتباين

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

تتعامل أساليب التجميع، مثل الغابات العشوائية والتعزيز، مع هذه المفاضلة مباشرةً.

# Deep tree = low bias, high variance (overfits)
deep_tree <- rpart(medv ~ ., data = MASS::Boston,
                   control = rpart.control(minsplit = 2, cp = 0))

# Shallow tree = high bias, low variance (underfits)
shallow_tree <- rpart(medv ~ ., data = MASS::Boston,
                      control = rpart.control(maxdepth = 2))

cat('Deep nodes:', nrow(deep_tree$frame))
cat('Shallow nodes:', nrow(shallow_tree$frame))

فرط تكيّف شجرة القرار

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

set.seed(42)
train_idx <- sample(nrow(MASS::Boston), 400)
train_bos <- MASS::Boston[train_idx, ]
test_bos  <- MASS::Boston[-train_idx, ]

# Fully grown tree
full <- rpart(medv ~ ., data = train_bos,
              control = rpart.control(cp = 0, minsplit = 2))

train_pred <- predict(full, train_bos)
test_pred  <- predict(full, test_bos)

cat('Train RMSE:', sqrt(mean((train_pred - train_bos$medv)^2)))
cat('Test  RMSE:', sqrt(mean((test_pred  - test_bos$medv)^2)))

أهمية المتغيرات من rpart

يسجل rpart قيمة variable.importance لكل متنبئ، وهي إجمالي التحسن في معيار التقسيم المنسوب إلى ذلك المتغير عبر جميع عمليات التقسيم. ويعطي ذلك مؤشرًا سريعًا على الميزات التي تؤثر في قرارات النموذج.

tree <- rpart(medv ~ ., data = MASS::Boston, method = 'anova')

# Variable importance (sorted)
imp <- sort(tree$variable.importance, decreasing = TRUE)
print(imp)

# Quick barplot
barplot(imp, las = 2, main = 'Variable Importance',
        col = 'steelblue', cex.names = 0.8)

من الأشجار إلى التجميع

شجرة القرار المفردة غير مستقرة؛ إذ يؤدي أخذ عينات جديدة من البيانات إلى إنتاج أشجار مختلفة جدًا. وتستفيد أساليب التجميع من هذا عدم الاستقرار:

  • Bagging / Random Forests: تحسب متوسط عدد كبير من الأشجار المدربة على عينات مُنشأة بالـbootstrap.
  • Boosting: تبني الأشجار بالتتابع، بحيث تصحح كل شجرة أخطاء الشجرة السابقة.
  • يقلل كلا الأسلوبين التباين مع الحفاظ على القدرة التعبيرية للأشجار.
# Demonstrating instability of a single tree
set.seed(1); t1 <- rpart(medv ~ ., data = MASS::Boston[sample(506, 400), ])
set.seed(2); t2 <- rpart(medv ~ ., data = MASS::Boston[sample(506, 400), ])

# Root split may differ between trees
cat('Tree 1 root split:', t1$frame$var[1])
cat('Tree 2 root split:', t2$frame$var[1])

معاملات التحكم في rpart

تتحكم rpart.control() في كيفية نمو الشجرة. وتشمل المعاملات الأساسية: cp (عقوبة التعقيد)، وminsplit (الحد الأدنى لعدد الملاحظات لمحاولة إجراء تقسيم)، وminbucket (الحد الأدنى لحجم الورقة)، وmaxdepth. ويُعد فهم هذه المعاملات ضروريًا لضبط النماذج القائمة على الأشجار.

ctrl <- rpart.control(
  cp        = 0.005,  # complexity penalty
  minsplit  = 20,     # min obs to try a split
  minbucket = 7,      # min obs in any leaf
  maxdepth  = 10      # max tree depth
)

tree <- rpart(medv ~ ., data = MASS::Boston,
              method = 'anova', control = ctrl)

printcp(tree)

تقييم أداء الشجرة

بعد تشذيب الشجرة، قيّمها على مجموعة الاختبار المحجوزة. في الانحدار، احسب RMSE وR-squared؛ وفي التصنيف، احسب الدقة ومصفوفة الالتباس. قارن هذه المقاييس بمقاييس النماذج المرجعية لفهم القيمة التي تقدمها شجرة مفردة.

pruned_tree <- prune(tree, cp = best_cp)

test_pred <- predict(pruned_tree, newdata = test_bos)

rmse <- sqrt(mean((test_pred - test_bos$medv)^2))
ss_res <- sum((test_pred - test_bos$medv)^2)
ss_tot <- sum((test_bos$medv - mean(test_bos$medv))^2)
r2 <- 1 - ss_res / ss_tot

cat('RMSE:', round(rmse, 3))
cat('R2:', round(r2, 3))

تحقق سريع

أي عبارة تشرح بأفضل شكل الغرض من استدعاء prune(tree, cp = best_cp)؟

مراجعة أشجار القرار

أهم النقاط من درس أشجار القرار — أساس التجميع:

  • تقسم الأشجار فضاء الميزات تكراريًا؛ وتستخدم عمليات التقسيم معياري Gini أو الإنتروبيا.
  • تلائم rpart(y ~ ., data, method) الشجرة؛ بينما يعرض printcp() جدول التعقيد.
  • اعثر على قيمة CP التي تحقق الحد الأدنى من الخطأ المتحقق منه بالتقاطع، ثم استخدم prune(tree, cp).
  • تُصوّر rpart.plot() بنية الشجرة.
  • تفرط الأشجار العميقة في التكيّف (انحياز منخفض وتباين مرتفع)، بينما لا تلائم الأشجار الضحلة البيانات بما يكفي.
  • يرتب tree$variable.importance المتنبئات حسب إجمالي التحسن الناتج عن عمليات التقسيم.
  • تتغلب أساليب التجميع (الغابات العشوائية والتعزيز) على عدم استقرار الشجرة المفردة.
# Standard rpart workflow
tree <- rpart(y ~ ., data = train, method = 'anova',
              control = rpart.control(cp = 0.001))

best_cp <- tree$cptable[which.min(tree$cptable[, 'xerror']), 'CP']
pruned  <- prune(tree, cp = best_cp)

test_pred <- predict(pruned, newdata = test)
rmse <- sqrt(mean((test_pred - test$y)^2))
cat('Pruned Tree RMSE:', rmse)

الأسئلة الشائعة

هل درس «أشجار القرار: أساس النماذج التجميعية» مجاني؟

نعم — نص درس «أشجار القرار: أساس النماذج التجميعية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة R Academy، انتقل إلى CoddyKit PRO. تتضمن دورة R Academy 4 دروس في المجموع.

ماذا ستتعلم في «أشجار القرار: أساس النماذج التجميعية»؟

أنشئ أشجار القرار وتصورها باستخدام rpart، وافهم المفاضلة بين الانحياز والتباين تتمرن على R Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ R Academy؟

لا تُشترط خبرة سابقة. R Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «أشجار القرار: أساس النماذج التجميعية»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس R Academy هذا؟

نعم. كل درس في R Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. أشجار القرار: أساس النماذج التجميعية
  2. الغابات العشوائية باستخدام ranger
  3. التعزيز التدرجي باستخدام xgboost
  4. أهمية السمات وتفسير النماذج
← العودة إلى R Academy