كيفية إنشاء غابات عشوائية في r (خطوة بخطوة)


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

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

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

إحدى الطرق التي يمكننا استخدامها لتقليل التباين في شجرة قرار واحدة هي بناء نموذج غابة عشوائي ، والذي يعمل على النحو التالي:

1. خذ عينات تمهيدية من مجموعة البيانات الأصلية.

2. قم بإنشاء شجرة قرارات لكل عينة تمهيدية.

  • عند إنشاء الشجرة، في كل مرة يتم فيها أخذ الانقسام بعين الاعتبار، تعتبر عينة عشوائية فقط من المتنبئين m مرشحين للانقسام من المجموعة الكاملة للمتنبئين p . بشكل عام، نختار m يساوي √p .

3. متوسط التوقعات من كل شجرة للحصول على النموذج النهائي.

وقد تبين أن الغابات العشوائية تميل إلى إنتاج نماذج أكثر دقة من أشجار القرار الواحد وحتى النماذج المعبأة .

يوفر هذا البرنامج التعليمي مثالاً خطوة بخطوة حول كيفية إنشاء نموذج غابة عشوائي لمجموعة بيانات في R.

الخطوة 1: تحميل الحزم اللازمة

أولاً، سنقوم بتحميل الحزم اللازمة لهذا المثال. في هذا المثال البسيط، نحتاج إلى حزمة واحدة فقط:

 library (randomForest)

الخطوة 2: ضبط نموذج الغابة العشوائية

في هذا المثال، سوف نستخدم مجموعة بيانات R مدمجة تسمى جودة الهواء والتي تحتوي على قياسات لجودة الهواء في مدينة نيويورك على مدار 153 يومًا فرديًا.

 #view structure of air quality dataset
str(airquality)

'data.frame': 153 obs. of 6 variables:
 $ Ozone: int 41 36 12 18 NA 28 23 19 8 NA ...
 $Solar.R: int 190 118 149 313 NA NA 299 99 19 194 ...
 $ Wind: num 7.4 8 12.6 11.5 14.3 14.9 8.6 13.8 20.1 8.6 ...
 $ Temp: int 67 72 74 62 56 66 65 59 61 69 ...
 $Month: int 5 5 5 5 5 5 5 5 5 5 ...
 $Day: int 1 2 3 4 5 6 7 8 9 10 ...

#find number of rows with missing values
sum(! complete . cases (airquality))

[1] 42

تحتوي مجموعة البيانات هذه على 42 صفًا بقيم مفقودة. لذلك، قبل تركيب نموذج الغابة العشوائي، سنقوم بملء القيم المفقودة في كل عمود بمتوسطات العمود:

 #replace NAs with column medians
for (i in 1: ncol (air quality)) {
  airquality[,i][ is . na (airquality[, i])] <- median (airquality[, i], na . rm = TRUE )
}

ذات صلة: كيفية احتساب القيم المفقودة في R

يوضح التعليمة البرمجية التالية كيفية ملاءمة نموذج الغابة العشوائي في R باستخدام وظيفة RandomForest() من حزمة RandomForest .

 #make this example reproducible
set.seed(1)

#fit the random forest model
model <- randomForest(
  formula = Ozone ~ .,
  data = airquality
)

#display fitted model
model

Call:
 randomForest(formula = Ozone ~ ., data = airquality) 
               Type of random forest: regression
                     Number of trees: 500
No. of variables tried at each split: 1

          Mean of squared residuals: 327.0914
                    % Var explained: 61

#find number of trees that produce lowest test MSE
which.min(model$mse)

[1] 82

#find RMSE of best model
sqrt(model$mse[ which . min (model$mse)]) 

[1] 17.64392

من النتيجة يمكننا أن نرى أن النموذج الذي أنتج أدنى اختبار لمتوسط مربع الخطأ (MSE) استخدم 82 شجرة.

يمكننا أيضًا أن نرى أن جذر متوسط مربع الخطأ لهذا النموذج كان 17.64392 . يمكننا أن نفكر في هذا باعتباره متوسط الفرق بين القيمة المتوقعة للأوزون والقيمة الفعلية المرصودة.

يمكننا أيضًا استخدام الكود التالي لإنتاج قطعة أرض لاختبار MSE بناءً على عدد الأشجار المستخدمة:

 #plot the MSE test by number of trees
plot(model)

اختبار MSE بعدد الأشجار في غابة عشوائية في R

ويمكننا استخدام الدالة varImpPlot() لإنشاء مخطط يعرض أهمية كل متغير متنبئ في النموذج النهائي:

 #produce variable importance plot
varImpPlot(model) 

غابة عشوائية في R

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

من الرسم البياني، يمكننا أن نرى أن الرياح هي المتغير الأكثر أهمية، تليها درجة الحرارة .

الخطوة 3: ضبط النموذج

افتراضيًا، تستخدم الدالة RandomForest() 500 شجرة و(إجمالي المتنبئين/3) تنبؤات تم اختيارها عشوائيًا كمرشحين محتملين لكل تقسيم. يمكننا ضبط هذه المعلمات باستخدام وظيفة tuneRF() .

يوضح الكود التالي كيفية العثور على النموذج الأمثل باستخدام المواصفات التالية:

  • ntreeTry: عدد الأشجار المراد بناءها.
  • mtryStart: العدد الأولي لمتغيرات التوقع التي يجب مراعاتها في كل قسم.
  • عامل الخطوة: عامل للزيادة حتى يتوقف الخطأ المقدر خارج الحقيبة عن التحسن بمقدار معين.
  • التحسين: المقدار الذي يجب تحسين خطأ خروج الكيس به لمواصلة زيادة عامل الخطوة.
 model_tuned <- tuneRF(
               x=airquality[,-1], #define predictor variables
               y=airquality$Ozone, #define response variable
               ntreeTry= 500 ,
               mtryStart= 4 , 
               stepFactor= 1.5 ,
               improve= 0.01 ,
               trace= FALSE #don't show real-time progress
               )

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

خطأ OOB في نموذج الغابة العشوائي في R

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

يتوافق هذا في الواقع مع الإعداد الافتراضي (إجمالي المتنبئين/3 = 6/3 = 2) الذي تستخدمه الدالة RandomForest() الأولية.

الخطوة 4: استخدم النموذج النهائي لعمل تنبؤات

وأخيرًا، يمكننا استخدام نموذج الغابة العشوائية المعدلة للتنبؤ بالملاحظات الجديدة.

 #define new observation
new <- data.frame(Solar.R=150, Wind=8, Temp=70, Month=5, Day=5)

#use fitted bagged model to predict Ozone value of new observation
predict(model, newdata=new)

27.19442

وبناء على قيم المتغيرات التنبؤية، يتوقع نموذج الغابة العشوائية المجهزة أن قيمة الأوزون ستكون 27.19442 في هذا اليوم بالذات.

يمكن العثور على رمز R الكامل المستخدم في هذا المثال هنا .

Add a Comment

ایمئیل یایینلانمایاجاق ایسته‎نیله‎ن بوشلوقلار خاللانمیشدیر *