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²؟
مواضيع مرتبطة