شجرة القرار في R: شجرة التصنيف مع مثال

⚡ ملخص ذكي

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

  • 🌳 التعريف الأساسي: تقوم الشجرة بتقسيم فضاء المتنبئات بشكل متكرر، وتختار عند كل عقدة التقسيم الذي يقلل من عدم نقاء الفئة بشكل كبير.
  • 🔄 تحضير البيانات: قم بخلط ملف Titanic المرتب باستخدام sample()، ثم قم بإسقاط أعمدة المعرف، وقم بتحويل العوامل، ثم قم بإزالة الصفوف NA.
  • 🛠️ صيغة النموذج: قم باستدعاء rpart(survived~., data = data_train, method = 'class') وقم بعرض النتيجة باستخدام rpart.plot(fit, extra = 106).
  • ⚙️ ضبط: تُتيح وظيفة rpart.control() إمكانية الوصول إلى minsplit و minbucket و maxdepth و cp، مما يرفع الدقة إلى 79.90 بالمائة.
  • 📊 التقييم: قم بإنشاء مصفوفة الارتباك باستخدام table()، ثم اقسم القطر الرئيسي على المجموع للحصول على دقة اختبار تبلغ 78.47 بالمائة.

شجرة القرار في R

ما هي أشجار القرار؟

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

قبل بناء شجرة في الكود، من المفيد معرفة كيف تحدد الشجرة مكان الانقسام.

كيف تعمل شجرة القرار؟

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

يتبع النمو إجراءً جشعًا يُسمى التقسيم الثنائي المتكرر:

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

لأن كل سؤال يقارن متغيرًا واحدًا بعتبة معينة، فإن الخوارزمية لا تحتاج أبدًا إلى تغيير الحجم أو الترميز الوهمي.

مؤشر جيني مقابل الإنتروبيا في أشجار القرار

يمكن قياس تلك الشوائب بطريقتين، ويتيح لك برنامج rpart الاختيار بينهما.

المعايير مؤشر جيني الإنتروبيا (كسب المعلومات)
المعادلة 1 – مجموع مربعات نسب الفئات -مجموع p مضروبًا في log2(p)
نطاق (صفان) 0 إلى 0.5 0 إلى 1
حساب أسرع، بدون استخدام اللوغاريتم أبطأ، ويستخدم اللوغاريتمات
إعداد rpart الترتيب parms = list(split = “information”)
fit_entropy <- rpart(survived~., data = data_train, method = 'class',
    parms = list(split = "information"))

في الواقع العملي، يختار كلا المعيارين نفس التقسيم في معظم الأوقات، لذا فإن مؤشر جيني الافتراضي هو خيار آمن.

مزايا وعيوب أشجار القرار

توضح لك المفاضلات متى تكون الشجرة الواحدة كافية ومتى يجب الانتقال إلى مجموعة من الأشجار.

المزايا

  • قابلة للتفسير بالكامل: النموذج المُلائم عبارة عن رسم بياني يمكن لأي صاحب مصلحة قراءته.
  • الحد الأدنى من المعالجة المسبقة: لا حاجة إلى تغيير الحجم أو التوحيد، وتعمل العوامل بشكل طبيعي.
  • يتولى كلا المهمتين: يُستخدم الخيار method = 'class' لتركيب مصنف، بينما يُستخدم الخيار method = 'anova' لتركيب شجرة انحدار.
  • سريع التدريب: يمكن استيعاب مجموعات البيانات الكبيرة في ثوانٍ، لذا فإن الأشجار تشكل أساسًا أوليًا مفيدًا.

عيوب

  • تباين عالٍ: يمكن لتغيير بسيط في بيانات التدريب أن ينتج شجرة مختلفة تمامًا.
  • عرضة للتخصيص الزائد: تنمو الشجرة غير المقيدة حتى تصبح كل ورقة نقية ما لم يقيدها كل من cp و maxdepth.
  • تقسيمات متوازية المحاور فقط: تحتاج الحدود القطرية إلى العديد من القطع على شكل درج.

يكمن الحل للضعفين الأولين في حساب متوسط ​​عدد كبير من الأشجار، وهو ما يفعله غابة عشوائية لا.

كيفية تدريب وتصور شجرة القرار في لغة البرمجة R

لبناء شجرة القرار الأولى في لغة R، ستعمل من خلال سبع خطوات:

  • الخطوة 1: استيراد البيانات
  • الخطوة 2: تنظيف مجموعة البيانات
  • الخطوة 3: إنشاء مجموعة تدريب/اختبار
  • الخطوة 4: بناء النموذج
  • الخطوة 5: قم بالتنبؤ
  • الخطوة 6: قياس الأداء
  • الخطوة 7: ضبط المعلمات الفائقة

الخطوة 1) استيراد البيانات

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

set.seed(678)
path <- 'https://raw.githubusercontent.com/guru99-edu/R-Programming/master/titanic_data.csv'
titanic <-read.csv(path)
head(titanic)

الإخراج:

##   X pclass survived                                            name    sex
## 1 1      1        1                   Allen, Miss. Elisabeth Walton female
## 2 2      1        1                  Allison, Master. Hudson Trevor   male
## 3 3      1        0                    Allison, Miss. Helen Loraine female
## 4 4      1        0            Allison, Mr. Hudson Joshua Creighton   male
## 5 5      1        0 Allison, Mrs. Hudson J C (Bessie Waldo Daniels) female
## 6 6      1        1                             Anderson, Mr. Harry   male
##       age sibsp parch ticket     fare   cabin embarked
## 1 29.0000     0     0  24160 211.3375      B5        S
## 2  0.9167     1     2 113781 151.5500 C22 C26        S
## 3  2.0000     1     2 113781 151.5500 C22 C26        S
## 4 30.0000     1     2 113781 151.5500 C22 C26        S
## 5 25.0000     1     2 113781 151.5500 C22 C26        S
## 6 48.0000     0     0  19952  26.5500     E12        S
##                         home.dest
## 1                    St Louis, MO
## 2 Montreal, PQ / Chesterville, ON
## 3 Montreal, PQ / Chesterville, ON
## 4 Montreal, PQ / Chesterville, ON
## 5 Montreal, PQ / Chesterville, ON
## 6                    New York, NY
tail(titanic)

الإخراج:

##         X pclass survived                      name    sex  age sibsp
## 1304 1304      3        0     Yousseff, Mr. Gerious   male   NA     0
## 1305 1305      3        0      Zabour, Miss. Hileni female 14.5     1
## 1306 1306      3        0     Zabour, Miss. Thamine female   NA     1
## 1307 1307      3        0 Zakarian, Mr. Mapriededer   male 26.5     0
## 1308 1308      3        0       Zakarian, Mr. Ortin   male 27.0     0
## 1309 1309      3        0        Zimmerman, Mr. Leo   male 29.0     0
##      parch ticket    fare cabin embarked home.dest
## 1304     0   2627 14.4583              C          
## 1305     0   2665 14.4542              C          
## 1306     0   2665 14.4542              C          
## 1307     0   2656  7.2250              C          
## 1308     0   2670  7.2250              C          
## 1309     0 315082  7.8750              S

من مخرجات الرأس والذيل، يمكنك ملاحظة عدم خلط البيانات. هذه قضية كبيرة! عندما تقوم بتقسيم بياناتك بين مجموعة القطار ومجموعة الاختبار، ستختار فقط الراكب من الفئتين 1 و2 (لا يوجد راكب من الفئة 3 ضمن أعلى 80 بالمائة من الملاحظات)، مما يعني أن الخوارزمية لن ترى أبدًا ميزات راكب الفئة 3. سيؤدي هذا الخطأ إلى سوء التنبؤ.

للتغلب على هذه المشكلة، يمكنك استخدام الدالة Sample().

shuffle_index <- sample(1:nrow(titanic))
head(shuffle_index)

شرح رمز شجرة القرار R

  • Sample(1:nrow(titanic)): إنشاء قائمة عشوائية من الفهرس من 1 إلى 1309 (أي الحد الأقصى لعدد الصفوف).

الإخراج:

## [1]  288  874 1078  633  887  992

سوف تستخدم هذا الفهرس لخلط مجموعة البيانات العملاقة.

titanic <- titanic[shuffle_index, ]
head(titanic)

الإخراج:

##         X pclass survived
## 288   288      1        0
## 874   874      3        0
## 1078 1078      3        1
## 633   633      3        0
## 887   887      3        1
## 992   992      3        1
##                                                           name    sex age
## 288                                      Sutton, Mr. Frederick   male  61
## 874                   Humblen, Mr. Adolf Mathias Nicolai Olsen   male  42
## 1078                                 O'Driscoll, Miss. Bridget female  NA
## 633  Andersson, Mrs. Anders Johan (Alfrida Konstantia Brogren) female  39
## 887                                        Jermyn, Miss. Annie female  NA
## 992                                           Mamee, Mr. Hanna   male  NA
##      sibsp parch ticket    fare cabin embarked           home.dest## 288      0     0  36963 32.3208   D50        S     Haddenfield, NJ
## 874      0     0 348121  7.6500 F G63        S                    
## 1078     0     0  14311  7.7500              Q                    
## 633      1     5 347082 31.2750              S Sweden Winnipeg, MN
## 887      0     0  14313  7.7500              Q                    
## 992      0     0   2677  7.2292              C	

الخطوة 2) تنظيف مجموعة البيانات

تحتوي عدة متغيرات على قيم مفقودة (NA). تتم عملية التنظيف على ثلاثة أجزاء:

  • قم بحذف المتغيرات home.dest و cabin و name و X و ticket
  • إنشاء متغيرات عامل لـ pclass ونجا
  • إسقاط NA
library(dplyr)
# Drop variables
clean_titanic <- titanic %>%
select(-c(home.dest, cabin, name, X, ticket)) %>% 
#Convert to factor level
	mutate(pclass = factor(pclass, levels = c(1, 2, 3), labels = c('Upper', 'Middle', 'Lower')),
	survived = factor(survived, levels = c(0, 1), labels = c('No', 'Yes'))) %>%
na.omit()
glimpse(clean_titanic)

Code تفسير

  • حدد(-c(home.dest, Cabin, name, X, Ticket)): قم بإسقاط المتغيرات غير الضرورية
  • pclass = factor(pclass, levels = c(1,2,3), labels= c('Upper', 'Middle', 'Lower')): أضف التسمية إلى المتغير pclass. يصبح 1 هو Upper، ويصبح 2 هو Middle، ويصبح 3 هو Lower
  • عامل(نجا، المستويات = c(0،1)، التصنيفات = c('لا'، 'نعم')): أضف تصنيفات إلى المتغير نجا. 0 يصبح لا و1 يصبح نعم
  • na.omit(): إزالة ملاحظات NA

الإخراج:

## Observations: 1,045
## Variables: 8
## $ pclass   <fctr> Upper, Lower, Lower, Upper, Middle, Upper, Middle, U...
## $ survived <fctr> No, No, No, Yes, No, Yes, Yes, No, No, No, No, No, Y...
## $ sex      <fctr> male, male, female, female, male, male, female, male...
## $ age      <dbl> 61.0, 42.0, 39.0, 49.0, 29.0, 37.0, 20.0, 54.0, 2.0, ...
## $ sibsp    <int> 0, 0, 1, 0, 0, 1, 0, 0, 4, 0, 0, 1, 1, 0, 0, 0, 1, 1,...
## $ parch    <int> 0, 0, 5, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 2, 0, 4, 0,...
## $ fare     <dbl> 32.3208, 7.6500, 31.2750, 25.9292, 10.5000, 52.5542, ...
## $ embarked <fctr> S, S, S, S, S, S, S, S, S, C, S, S, S, Q, C, S, S, C...		

الخطوة 3) إنشاء مجموعة تدريب/اختبار

قبل تدريب النموذج الخاص بك، تحتاج إلى تنفيذ خطوتين:

  • إنشاء قطار ومجموعة اختبار: يمكنك تدريب النموذج على مجموعة القطار واختبار التنبؤ على مجموعة الاختبار (أي البيانات غير المرئية)
  • قم بتثبيت rpart.plot من وحدة التحكم

الممارسة الشائعة هي تقسيم البيانات بنسبة 80/20، حيث يعمل 80 بالمائة من البيانات على تدريب النموذج، و20 بالمائة في عمل التنبؤات. تحتاج إلى إنشاء إطارين منفصلين للبيانات. لا تريد لمس مجموعة الاختبار حتى تنتهي من بناء النموذج الخاص بك. يمكنك إنشاء اسم دالة create_train_test() الذي يأخذ ثلاث وسائط.

create_train_test(df, size = 0.8, train = TRUE)
arguments:
-df: Dataset used to train the model.
-size: Size of the split. By default, 0.8. Numerical value
-train: If set to `TRUE`, the function creates the train set, otherwise the test set. Default value sets to `TRUE`. Boolean value.You need to add a Boolean parameter because R does not allow to return two data frames simultaneously.
create_train_test <- function(data, size = 0.8, train = TRUE) {
    n_row = nrow(data)
    total_row = size * n_row
    train_sample <- 1: total_row
    if (train == TRUE) {
        return (data[train_sample, ])
    } else {
        return (data[-train_sample, ])
    }
}

Code تفسير

  • الوظيفة (البيانات، الحجم = 0.8، القطار = TRUE): أضف الوسائط في الوظيفة
  • n_row = nrow(data): حساب عدد الصفوف في مجموعة البيانات
  • Total_row = size*n_row: قم بإرجاع الصف n لإنشاء مجموعة القطار
  • Train_sample <- 1:total_row: حدد الصف الأول من الصفوف n
  • if (train ==TRUE){ } else { }: إذا تم ضبط الشرط على true، قم بإرجاع مجموعة القطار، وإلا قم بإرجاع مجموعة الاختبار.

يمكنك اختبار وظيفتك والتحقق من البعد.

data_train <- create_train_test(clean_titanic, 0.8, train = TRUE)
data_test <- create_train_test(clean_titanic, 0.8, train = FALSE)
dim(data_train)

الإخراج:

## [1] 836   8
dim(data_test)

الإخراج:

## [1] 209   8

تحتوي مجموعة بيانات التدريب على 836 صفًا و8 أعمدة، بينما تحتوي مجموعة بيانات الاختبار على 209 صفوف ونفس الأعمدة الثمانية.

يمكنك استخدام الدالة Prop.table() مع table() للتحقق من صحة عملية التوزيع العشوائي.

prop.table(table(data_train$survived))

الإخراج:

##
##        No       Yes 
## 0.5944976 0.4055024
prop.table(table(data_test$survived))

الإخراج:

## 
##        No       Yes 
## 0.5789474 0.4210526

وفي كلتا مجموعتي البيانات، فإن عدد الناجين هو نفسه، حوالي 40 بالمائة.

قم بتثبيت rpart.plot

rpart.plot غير متوفر من مكتبات conda. يمكنك تثبيته من وحدة التحكم:

install.packages("rpart.plot")

الخطوة 4) بناء النموذج

أنت الآن جاهز لبناء النموذج. صيغة دالة شجرة القرار rpart() هي:

rpart(formula, data=, method='')
arguments:			
- formula: The function to predict
- data: Specifies the data frame
- method:			
- "class" for a classification tree 			
- "anova" for a regression tree	

يمكنك استخدام طريقة الفصل لأنك تتنبأ بالفصل.

library(rpart)
library(rpart.plot)
fit <- rpart(survived~., data = data_train, method = 'class')
rpart.plot(fit, extra = 106)

Code تفسير

  • rpart(): الدالة التي تناسب النموذج. الحجج هي:
    • نجا ~.: صيغة أشجار القرار
    • البيانات = data_train: مجموعة البيانات
    • الطريقة = 'الفئة': تناسب النموذج الثنائي
  • rpart.plot(fit, extra= 106): يرسم الشجرة. تم ضبط الوسيط الإضافي على 106، والذي يعرض احتمالية الفئة الثانية بالإضافة إلى النسبة المئوية للملاحظات في كل عقدة. يمكنك الرجوع إلى المقالة القصيرة لمزيد من المعلومات حول الاختيارات الأخرى.

الإخراج:

 بناء نموذج لأشجار القرار في R

تبدأ من العقدة الجذرية، في أعلى الرسم البياني، وعلى عمق 0 من 3:

  1. في الأعلى، هو الاحتمال العام للبقاء على قيد الحياة. ويبين نسبة الركاب الذين نجوا من الحادث. نجا 41 بالمائة من الركاب.
  2. تستفسر هذه العقدة عما إذا كان الراكب ذكراً. إذا كانت الإجابة بنعم، تنتقل إلى الفرع الأيسر من العقدة الجذرية (العمق 1). 63% من الركاب ذكور، واحتمالية بقائهم على قيد الحياة 21%.
  3. في العقدة الثانية، تسأل ما إذا كان عمر الراكب الذكر أكبر من 3.5 سنة. إذا كانت الإجابة بنعم، فإن فرصة البقاء على قيد الحياة هي 19 بالمائة.
  4. عليك أن تستمر على هذا المنوال لفهم الميزات التي تؤثر على احتمالية البقاء على قيد الحياة.

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

تستخدم الدالة rpart() افتراضيًا جيني يُستخدم مقياس عدم التجانس لاختيار كل تقسيم. كلما ارتفعت قيمة جيني، زاد اختلاط الفئات داخل تلك العقدة، لذا تختار الخوارزمية دائمًا التقسيم الذي يُقللها إلى أدنى حد.

الخطوة 5) قم بالتنبؤ

يمكنك التنبؤ بمجموعة بيانات الاختبار الخاصة بك. للقيام بالتنبؤ، يمكنك استخدام وظيفة التنبؤ (). بناء الجملة الأساسي للتنبؤ بشجرة قرار R هو:

predict(fitted_model, df, type = 'class')
arguments:
- fitted_model: This is the object stored after model estimation. 
- df: Data frame used to make the prediction
- type: Type of prediction			
    - 'class': for classification			
    - 'prob': to compute the probability of each class			
    - 'vector': Predict the mean response at the node level	

أنت الآن تتوقع، لكل راكب من الركاب الـ 209 في مجموعة الاختبار، ما إذا كان النموذج يتوقع نجاتهم من الاصطدام.

predict_unseen <-predict(fit, data_test, type = 'class')

Code تفسير

  • توقع (fit، data_test، type = 'class'): توقع الفئة (0/1) لمجموعة الاختبار

والآن قارن بين الفئات المتوقعة والنتائج الحقيقية.

table_mat <- table(data_test$survived, predict_unseen)
table_mat

Code تفسير

  • table(data_test$survived, predict_unseen): أنشئ جدولًا طوارئًا للفئات المتوقعة مقابل النتيجة الحقيقية

الإخراج:

##      predict_unseen
##        No Yes
##   No  106  15
##   Yes  30  58

تمثل الصفوف القيم الفعلية، بينما تمثل الأعمدة التوقعات. وقد حدد النموذج بشكل صحيح 106 من غير الناجين و58 من الناجين، ولكنه صنف 15 من غير الناجين على أنهم ناجون و30 من الناجين على أنهم متوفون.

الخطوة 6) قياس الأداء

يمكنك حساب مقياس الدقة لمهمة التصنيف باستخدام الارتباك مصفوفة:

استخدم الارتباك مصفوفة هو خيار أفضل لتقييم أداء التصنيف. الفكرة العامة هي حساب عدد المرات التي يتم فيها تصنيف المثيلات الحقيقية على أنها خاطئة.

قياس أداء أشجار القرار في R

يمثل كل صف في مصفوفة الارتباك هدفًا فعليًا، بينما يمثل كل عمود هدفًا متوقعًا. ويتناول الصف الأول من هذه المصفوفة الركاب الذين توفوا (الفئة السلبية): تم تصنيف 106 منهم بشكل صحيح على أنهم متوفون (صحيح سلبيبينما تم تصنيف 15 شخصًا بشكل خاطئ على أنهم ناجون (إيجابية كاذبة). أما الصف الثاني فيتناول الناجين: تم التعرف على 58 منهم بشكل صحيح (صحيح إيجابيبينما تم تفويت 30 حالة (سلبي خطأ).

يمكنك حساب اختبار الدقة من مصفوفة الارتباك :

قياس أداء أشجار القرار في R

إنها نسبة الإيجابية الحقيقية والسالبة الحقيقية إلى مجموع المصفوفة. باستخدام R، يمكنك البرمجة على النحو التالي:

accuracy_Test <- sum(diag(table_mat)) / sum(table_mat)

Code تفسير

  • sum(diag(table_mat)): مجموع القطر
  • sum(table_mat): مجموع المصفوفة.

يمكنك طباعة دقة مجموعة الاختبار:

print(paste('Accuracy for test', accuracy_Test))

الإخراج:

## [1] "Accuracy for test 0.784688995215311"

بلغت دقة النموذج على مجموعة الاختبار 0.7847، أي ما يعادل 78.47%. كرر العملية على مجموعة التدريب لمعرفة مدى فرط ملاءمة النموذج.

الخطوة 7) ضبط المعلمات الفائقة

تحتوي شجرة القرار في R على معلمات مختلفة تتحكم في جوانب الملاءمة. في مكتبة شجرة القرار rpart، يمكنك التحكم في المعلمات باستخدام الدالة rpart.control(). في الكود التالي، يمكنك تقديم المعلمات التي ستقوم بضبطها. يمكنك الرجوع إلى المقالة القصيرة لمعلمات أخرى.

rpart.control(minsplit = 20, minbucket = round(minsplit/3), maxdepth = 30)
Arguments:
-minsplit: Set the minimum number of observations in the node before the algorithm perform a split
-minbucket: Set the minimum number of observations in a terminal node, i.e. the leaf
-maxdepth: Set the maximum depth of any node of the final tree. The root node is treated as depth 0

سنتصرف على النحو التالي:

  • إنشاء وظيفة لإرجاع الدقة
  • ضبط الحد الأقصى للعمق
  • قم بضبط الحد الأدنى لعدد العينات التي يجب أن تحتوي عليها العقدة قبل أن تتمكن من الانقسام
  • ضبط الحد الأدنى لعدد العينة التي يجب أن تحتوي عليها العقدة الورقية

يمكنك كتابة وظيفة لعرض الدقة. يمكنك ببساطة تغليف الكود الذي استخدمته من قبل:

  1. توقع: توقع_غير مرئي <- توقع (مناسب، data_test، اكتب = 'class')
  2. إنتاج الجدول: table_mat <- table(data_test$survived,predict_unseen)
  3. دقة الحساب: اختبار الدقة <- sum(diag(table_mat))/sum(table_mat)
accuracy_tune <- function(fit) {
    predict_unseen <- predict(fit, data_test, type = 'class')
    table_mat <- table(data_test$survived, predict_unseen)
    accuracy_Test <- sum(diag(table_mat)) / sum(table_mat)
    accuracy_Test
}

الآن، اضبط المعايير وجرّب تحسين النموذج الافتراضي. للتذكير، يجب أن تتجاوز دقة النموذج 0.7847.

control <- rpart.control(minsplit = 4,
    minbucket = round(5 / 3),
    maxdepth = 3,
    cp = 0)
tune_fit <- rpart(survived~., data = data_train, method = 'class', control = control)
accuracy_tune(tune_fit)

الإخراج:

## [1] 0.7990431

مع المعلمة التالية:

minsplit = 4
minbucket = round(5/3)
maxdepth = 3
cp = 0

ترتفع الدقة من 0.7847 إلى 0.7990، لذا فإن الشجرة المعدلة تتفوق على التكوين الافتراضي بنحو 1.4 نقطة مئوية.

أشجار القرار في لغة R: مرجع سريع للوظائف

يسرد الجدول أدناه كل دالة مستخدمة في الخطوات السبع المذكورة أعلاه، بالإضافة إلى الحزمة التي توفرها والمعلمات التي تتوقعها. R.

المكتبة الهدف الوظيفة الفئه المعاملات تفاصيل
rpart شجرة تصنيف القطارات في R ربارت () فئة الصيغة، مدافع، الطريقة
rpart تدريب شجرة الانحدار ربارت () أنوفا الصيغة، مدافع، الطريقة
rpart ارسم الأشجار rpart.plot() نموذج مناسب
قاعدة تنبأ تنبؤ() فئة النموذج المجهز، النوع
قاعدة تنبأ تنبؤ() غالبا النموذج المجهز، النوع
قاعدة تنبأ تنبؤ() ناقلات النموذج المجهز، النوع
rpart المعلمات السيطرة rpart.control() com.minsplit قم بتعيين الحد الأدنى لعدد الملاحظات في العقدة قبل إجراء الخوارزمية للتقسيم
com.minbucket حدد الحد الأدنى لعدد الملاحظات في العقدة الطرفية، أي الورقة
أقصى عمق حدد أقصى عمق لأي عقدة في الشجرة النهائية. تُعامل العقدة الجذرية على أنها بعمق صفر.
rpart نموذج القطار مع معلمة التحكم ربارت () الصيغة، df، الطريقة، التحكم

ملاحظة: قم بتدريب النموذج على بيانات التدريب واختبار الأداء على مجموعة بيانات غير مرئية، أي مجموعة الاختبار.

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

تُناسب كلتاهما أشجار التصنيف والانحدار. تُنفذ دالة rpart() خوارزمية CART مع تقليم مُدمج مُتحقق منه عبر التحقق المتبادل من خلال cp، وتتكامل مع rpart.plot للحصول على رسوم بيانية واضحة، مما يجعلها الخيار الأكثر شيوعًا.

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

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

تُعدّ أشجار القرار أساس الذكاء الاصطناعي القابل للتفسير في مجالات الائتمان والتأمين والرعاية الصحية، حيث قد يطلب المنظمون معرفة الأسباب الدقيقة وراء القرار. كما تُشكّل هذه الأشجار أساس نماذج التعلم في خوارزميات تعزيز التدرج ونماذج الغابات العشوائية.

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

تلخيص هذه التدوينة بـ: