چیتشیت
ارزیابی مدل، بایاس-واریانس و تنظیم هایپرپارامتر
Model Evaluation, Bias-Variance and Tuning
تفکیک دادهها و اعتبارسنجی متقاطع، فرمولهای متریک، تشخیص بایاس-واریانس، استراتژیهای جستجو و کلاسهای نامتوازن.
فهرست مطالب
تشخیص خطای آموزش و آزمون
عیبیابیخطای آموزش بالا، خطای آزمون بالا
- علت
- بایاس بالا
- راهحل
- ویژگیهای بیشتر، مدل پیچیدهتر، منظمسازی کمتر
خطای آموزش پایین، خطای آزمون بالا
- علت
- واریانس بالا
- راهحل
- دادههای بیشتر، منظمسازی، مدل سادهتر
خطای آموزش کاهش مییابد، خطای آزمون افزایش مییابد
- علت
- بیشبرازش در حال وقوع
- راهحل
- توقف زودهنگام
هر دو منحنی تخت و بالا هستند
- علت
- بایاس؛ دادهی بیشتر کمکی نخواهد کرد
- راهحل
- تغییر مدل
فاصلهی زیاد، خطای اعتبارسنجی همچنان نزولی
- علت
- واریانسی که داده میتواند حل کند
- راهحل
- جمعآوری دادههای بیشتر
دقت کلی 99%، صفر مورد مثبت شناساییشده
- علت
- عدمتوازن کلاسها
- راهحل
- استفاده از F1، AUPRC یا MCC
امتیاز اعتبارسنجی بیشازحد خوشبینانه
- علت
- برازش اسکیلر پیش از تفکیک دادهها
- راهحل
- پیشپردازش داخل یک
Pipeline
بهترین مقدار در مرز دامنهی جستجو
- علت
- محدوده بیشازحد باریک
- راهحل
- گسترش فضای جستجو
تفکیک، تنظیم و گزارش
معماریفرمولهای متریک
مفهومها- Accuracy
- $(TP + TN) / (TP + TN + FP + FN)$. در کلاسهای نامتوازن گمراهکننده است.
- Precision
- $TP / (TP + FP)$. مناسب برای زمانهایی که مثبتهای کاذب پرهزینهاند.
- Recall
- $TP / (TP + FN)$. مناسب برای زمانهایی که منفیهای کاذب پرهزینهاند.
- F1
- $2PR / (P + R)$، میانگین همساز دقت و بازخوانی.
- F-beta
- $(1+\beta^2) P R / (\beta^2 P + R)$. مقدار $\beta > 1$ به بازخوانی وزن بیشتری میدهد. F2 برای تشخیص تقلب رایج است.
- MCC
- $(TP \cdot TN - FP \cdot FN) / \sqrt{\ldots}$. بازهی مقادیر از -1 تا +1 است.
- AUC-ROC
- مقدار 0.5 حدس تصادفی، و 1.0 تفکیک بینقص است.
- AUPRC
- امتیاز یک مدل تصادفی برابر با نسبت کلاس مثبت است.
- RMSE و MAE
- متریک RMSE معادل $\sqrt{\text{MSE}}$ در مقیاس واحد هدف است. MAE نسبت به دادههای پرت مقاوم است.
- تجزیه خطا
- خطای موردانتظار $= \text{Bias}^2 + \text{Variance} + \sigma^2$.
اصلاح مدل گامبهگام
گامبهگام- آموزشخطای آموزش و خطای آزمون را محاسبه کنید.
- هر دو بالامشکل بایاس است. به گام 4 بروید.
- آموزش پایین، آزمون بالامشکل واریانس است. منحنی یادگیری را رسم کنید. اگر داده کمکی نکرد، منظمسازی کنید.
- منحنی اعتبارسنجیپیچیدگی اصلی مدل را پویش کنید. نقطهی بهینه را بیابید.
- منحنی یادگیریآن را در نقطهی بهینه رسم کنید. شکاف بزرگ نیازمند داده یا منظمسازی است.
- پویش آلفامقادیر آلفای Ridge یا Lasso را با
cross_val_scoreبیازمایید. کمترین خطای CV را انتخاب کنید.
اعتبارسنجی متقاطع و تنظیم هایپرپارامتر
کدpython
scores = cross_val_score(model, X, y, cv=StratifiedKFold(5), scoring="f1")
param_dist = {
"learning_rate": loguniform(1e-4, 0.5), # مقیاس لگاریتمی
"max_depth": randint(2, 10),
"n_estimators": randint(50, 500),
}
search = RandomizedSearchCV(GradientBoostingRegressor(), param_dist,
n_iter=100, cv=5, scoring="neg_mean_squared_error", n_jobs=-1)
search.fit(X_train, y_train)
search.best_params_ # بهترین تنظیمات
outer_scores = cross_val_score(inner_cv, X, y, cv=5, scoring="neg_mean_squared_error")
استراتژیهای جستجو
دستورها| دستور | عملکرد |
|---|---|
Grid search | تمام ترکیبها. هزینه به صورت نمایی رشد میکند |
Random search | نمونهگیری از توزیعها. مقادیر یکتای بیشتر به ازای بودجه پردازشی |
Bayesian optimization | مدل جایگزین به همراه تابع دستیابی. 2 تا 5 برابر ارزیابی کمتر |
Hyperband | پیکربندیهای زیاد با بودجهی کوچک. 10 تا 50 برابر سریعتر |
MedianPruner | متوقف کردن آزمایشی که در آن گام از میانهی بقیه بدتر عمل کرده است |
GridSearchCV | جستجوی جامع گرید همراه با اعتبارسنجی متقاطع |
RandomizedSearchCV | جستجوی تصادفی همراه با CV؛ مقدار n_jobs=-1 از تمام هستهها استفاده میکند |
trial.suggest_float | نمونهگیری Optuna؛ برای نرخ یادگیری log=True را اضافه کنید |
انتخاب روش رفع عدمتوازن
پیشفرضها| تنظیم | پیشفرض | نکته |
|---|---|---|
Mild, under 70/30 | class weights | ابتدا اینها را امتحان کنید |
Moderate, 70/30 to 95/5 | SMOTE + class weights | یا SMOTE همراه با تنظیم آستانه |
Severe, over 95/5 | combine multiple strategies | ترکیب SMOTE، وزندهی به کلاسها و تنظیم آستانه |
Under 1000 samples | Oversample or SMOTE, avoid undersampling | دادههای کم |
1000-10000 samples | SMOTE + threshold tuning | دادههای متوسط |
Over 10000 samples | Undersampling OK, or class weights | دادههای زیاد |
اعداد کلیدی که باید بدانید
پیشفرضها| تنظیم | پیشفرض | نکته |
|---|---|---|
K folds | 5 | یا 10 |
Decision threshold | 0.5 | برای کلاس مثبتِ نادر، آن را کاهش دهید |
Random search trials | 60 | احتمال 95% برای قرارگیری در فاصلهی 5% از نقطهی بهینه |
Hyperband start | 81 | پیکربندیها در 1 اپوک؛ نگهداشتن یکسوم برتر |
Nested CV fits | 675 | 5 لایه بیرونی × 5 لایه درونی × 27 نقطهی گرید |
Bootstrap fits | 200 | n_bootstrap=200 در تجزیهی خطا |
SMOTE `k` | 5 | n_synthetic=100 |
Positive class weight | 10.0 | 1000 نمونه، 50 مورد مثبت |
پرسشها
پرسش و پاسخ- چرا فولدهای طبقهبندیشده (Stratified)؟
- هر فولد نسبت کلاسهای کل مجموعهداده را حفظ میکند.
- چرا مجموعه آزمون فقط یکبار استفاده شود؟
- هر بار مشاهده و تنظیم، آن را به یک مجموعهی اعتبارسنجی دوم تبدیل میکند.
- چرا جستجوی تصادفی به جای گرید؟
- معمولاً فقط 1 الی 2 هایپرپارامتر از بین 6 مورد اهمیت دارند.
- بگینگ یا بوستینگ؟
- بگینگ برای واریانس بالا؛ بوستینگ برای بایاس بالا.
- وزندهی به کلاسها یا بیشنمونهبرداری؟
- از نظر مقدار موردانتظار وزنها با بیشنمونهبرداری یکساناند، بدون ایجاد دادهی تکراری.
- بدترین ظرفیت مدل کجاست؟
- در آستانهی درونیابی، جایی که تعداد پارامترها نزدیک به تعداد نمونهها است.
- چگونه امتیاز نهایی را گزارش کنم؟
- از CV تو در تو یا یک مجموعه آزمون که در طول تنظیم هرگز به آن دست نزدهاید استفاده کنید.
نکات
نکتهها- ابتدا تفکیک دادهها را انجام دهید، سپس پیشپردازش.
- نرخ یادگیری را اول تنظیم کنید. آن را در مقیاس لگاریتمی جستجو کنید.
- به جای تنظیم
n_estimators، از توقف زودهنگام استفاده کنید. - 60٪ از بودجهی بهینهسازی را صرف 2 هایپرپارامتر اصلی کنید.
- با پیشفرضهای کتابخانه شروع کنید. جستجوی درشت با 20-50 آزمایش، سپس جستجوی دقیق با 50-100 آزمایش.
- آستانهها را از 0.0 تا 1.0 روی دادههای اعتبارسنجی بررسی کنید؛ بالاترین F1 را نگه دارید.
پیادهسازی توابع از صفر
کار و کد| وظیفه | کد |
|---|---|
| فولدهای طبقهبندیشده (Stratified) | stratified_kfold_split(y, k=5, seed=42) |
| سطح زیر منحنی ROC | auc_roc(y_true, y_scores) |
| سطرهای مصنوعی از کلاس اقلیت | smote(X_minority, k=5, n_synthetic=100) |
| وزندهی متعادل به کلاسها | compute_class_weights(y) |
| بهترین نقطه برش بر اساس F1 | find_optimal_threshold(y_true, y_probs) |