Random Forest — تعلم الآلة
الغابات العشوائية (Random Forest)
شجرة واحدة متقلبة وتميل للحفظ. لكن مئات الأشجار المختلفة تصوّت معاً تعطي قراراً أكثر ثباتاً ودقة — مثل سؤال 100 شخص بدل شخص واحد.
مصدرا العشوائية
1. Bagging (Bootstrap Aggregating): كل شجرة تتدرب على عينة عشوائية مع الإرجاع من بيانات التدريب (بعض العينات تتكرر وبعضها يُستبعد).
2. ميزات عشوائية: عند كل تقسيم، تختار الشجرة من مجموعة جزئية عشوائية من الميزات فقط (max_features).
النتيجة: أشجار مختلفة عن بعضها. أخطاؤها لا تتكرر بنفس الشكل، فتلغي بعضها عند التصويت (للتصنيف) أو المتوسط (للانحدار). العشوائية الثانية مهمة: بدونها ستختار كل الأشجار نفس الميزة القوية أولاً وتصبح متشابهة.
المعاملات المهمة
| المعامل | المعنى | ملاحظة |
|---|---|---|
| n_estimators | عدد الأشجار | أكثر = أثبت (مع تناقص الفائدة)، ولا يسبب Overfitting، لكنه أبطأ |
| max_depth | عمق كل شجرة | |
| max_features | عدد الميزات المرشحة لكل تقسيم | "sqrt" افتراضي للتصنيف |
| n_jobs=-1 | استخدام كل أنوية المعالج | الأشجار تتدرب بالتوازي |
| oob_score=True | تقييم مجاني على العينات المستبعدة من كل شجرة | تقدير قريب من Cross-Validation |
from sklearn.datasets import load_breast_cancer
from sklearn.ensemble import RandomForestClassifier
X, y = load_breast_cancer(return_X_y=True)
forest = RandomForestClassifier(n_estimators=200, oob_score=True, random_state=0, n_jobs=-1)
forest.fit(X, y)
print(f"دقة Out-of-Bag: {forest.oob_score_:.3f}")أهمية الميزات: بحذر
feature_importances_ مفيدة للفهم، لكنها منحازة للميزات الرقمية ذات القيم الكثيرة، وتتوزع بين الميزات المترابطة. للتفسير الأدق استخدم permutation_importance على بيانات الاختبار.
Gradient Boosting: الفكرة المعاكسة
بدل أشجار مستقلة بالتوازي، يبني أشجاراً صغيرة متتالية: كل شجرة تحاول تصحيح أخطاء ما قبلها. غالباً أدق من الغابة على البيانات الجدولية، لكنه يحتاج ضبطاً أدق (learning_rate، عدد الأشجار) وقد يحفظ. في scikit-learn: HistGradientBoostingClassifier (سريع)، وخارجها مكتبات XGBoost و LightGBM المشهورة في المسابقات.
متى تختار الغابة العشوائية؟
- بيانات جدولية (صفوف وأعمدة) بأي حجم متوسط.
- تريد نتيجة قوية دون ضبط كثير — الإعدادات الافتراضية جيدة جداً.
- لا تحتاج تقييساً ولا تتأثر كثيراً بالقيم الشاذة.
تمرين
في المثال الكامل قارن شجرة واحدة، وغابة بـ 10 أشجار، وغابة بـ 300 شجرة باستخدام cross_val_score (المتوسط والانحراف المعياري). أيها أكثر ثباتاً؟
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# تحميل البيانات
iris = load_iris()
X, y = iris.data, iris.target
# تقسيم
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)
# التدريب
model = RandomForestClassifier(
n_estimators=100, # 100 شجرة
max_depth=5,
random_state=42
)
model.fit(X_train, y_train)
# التقييم
y_pred = model.predict(X_test)
print(f"الدقة: {accuracy_score(y_test, y_pred):.2%}")
# أهمية الميزات
print("\nأهمية الميزات:")
for name, importance in zip(iris.feature_names, model.feature_importances_):
print(f" {name}: {importance:.2%}")
# مقارنة مع شجرة واحدة
from sklearn.tree import DecisionTreeClassifier
single_tree = DecisionTreeClassifier(max_depth=5)
single_tree.fit(X_train, y_train)
print(f"\nشجرة واحدة: {single_tree.score(X_test, y_test):.2%}")
print(f"Random Forest: {model.score(X_test, y_test):.2%}")اختبر فهمك