Kodax

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%}")
اختبر فهمك