Skip
Cأكاديمية CADD

L17 · 28 دقيقة

بناء نموذج QSAR

scikit-learn مع تحقّق صادق.

البرمجةالتصميم الليبندي

أهداف التعلّم

  • بناء نموذج scikit-learn بتقسيم صادق وخط أساس.
  • عدم لمس مجموعة الاختبار أثناء اختيار الواصفات.
  • تقرير RMSE/R² للاختبار ورفض التنبؤ خارج النطاق.

النموذج شيفرة مسؤولة

scikit-learn واجهة مستقرة: قسّم، درّب، قِس. الخطر ليس في استدعاء RandomForestRegressor بل في تسريب الصفوف المتشابهة. GroupKFold على scaffold أصدق من train_test_split العشوائي لسلسلة كيميائية.

from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import GroupKFold
from sklearn.metrics import r2_score, mean_squared_error
# X, y, groups already built; groups = scaffold labels
gkf = GroupKFold(n_splits=3)
for train_idx, test_idx in gkf.split(X, y, groups):
    model = RandomForestRegressor(n_estimators=200, max_depth=4, random_state=0)
    model.fit(X[train_idx], y[train_idx])
    pred = model.predict(X[test_idx])
    print(r2_score(y[test_idx], pred), mean_squared_error(y[test_idx], pred)**0.5)

الغرض: تحقّق مجموعات على scaffold مع غابة ضحلة.

المُدخل: مصفوفة واصفات X، نشاط y، وتسميات مجموعات.

المُخرج: R² وRMSE لكل طية.

المعنى: max_depth المحدود مقاومة للحفظ على N صغير. random_state لإعادة التشغيل.

أخطاء شائعة: تسرّب إن بُنيت الواصفات أو اختير العمق على كل البيانات قبل التقسيم.

خطوط أساس قبل الفخر

  • تنبؤ بمتوسط التدريب.
  • Nearest neighbour في فضاء البصمة.
  • انحدار خطي منتظم على بضع واصفات فيزيوكيميائية.
لماذا؟ — لماذا max_depth=4 في المثال لا 30؟

لأن جداول SAR صغيرة. شجرة عميقة تحفظ كل مركّب. العمق قرار انتظام يُبرَّر بمنحنى التحقّق لا بالعادة.

ماذا لو؟ — ماذا لو استخدمت train_test_split عشوائياً ونظائرك Tanimoto 0.95 تتوزع على الطرفين؟

R² الاختبار يقيس الاستيفاء بين توأم. غيّر إلى مجموعات scaffold واقبل رقماً أقسى.

تمرين

أضف y-scrambling إلى الحلقة: ماذا يجب أن يحدث لـ R²؟

مواضيع مرتبطة