چیتشیت
یادگیری ماشین کلاسیک
Classical Machine Learning
برازش، اعتبارسنجی، تنظیم و رفع اشکال مدلهای رگرسیون، طبقهبندی و خوشهبندی با scikit-learn.
فهرست مطالب
برازش یک مدل
کار و کد| وظیفه | کد |
|---|---|
| رگرسیون با منظمسازی L2 | Ridge(alpha=1.0) |
| طبقهبند برای دادههای مثبت کمیاب | LogisticRegression(class_weight="balanced") |
| جنگل تصادفی | RandomForestClassifier(n_estimators=100, random_state=42) |
| SVM کرنلی | SVC(kernel="rbf", C=1.0, gamma="scale") |
| SVM خطی برای دادههای حجیم | LinearSVC(C=1.0, max_iter=10000) |
| k نزدیکترین همسایه | KNeighborsClassifier(n_neighbors=5, metric="euclidean") |
| خوشهبندی K-Means | KMeans(n_clusters=3, random_state=42).fit(data) |
| خوشهبندی بر مبنای چگالی و نویز | DBSCAN(eps=1.5, min_samples=5).fit(data) |
معیارهای ارزیابی
دستورها| Metric | فرمول و کاربرد |
|---|---|
Accuracy | $(TP + TN) / (TP + TN + FP + FN)$. گمراهکننده در عدمتوازن کلاسها |
Precision | $TP / (TP + FP)$. مناسب زمانی که مثبتهای کاذب هزینهزا هستند |
Recall | $TP / (TP + FN)$. مناسب زمانی که منفیهای کاذب هزینهزا هستند |
F1 | $2 \cdot P \cdot R / (P + R)$. میانگین همساز هر دو |
AUC-ROC | 0.5 تصادفی است، 1.0 بینقص. ناوابسته به آستانه |
R-squared | $1 - SS_{\text{res}} / SS_{\text{tot}}$. مقدار کمتر از 0 بدتر از میانگین است |
فرمولهای کلیدی
مفهومها- MSE
- $\text{MSE} = \frac{1}{n} \sum (y_{\text{predicted}} - y_{\text{actual}})^2$
- معادلهی نرمال
- $w = (X^T X)^{-1} X^T y$. هزینه برحسب ویژگیها $O(n^3)$ است.
- Ridge
- $\text{Cost} = \text{MSE} + \lambda \sum w_i^2$
- تابع زیان لگاریتمی (Log loss)
- $-\frac{1}{n} \sum \left( y \log(p) + (1-y) \log(1-p) \right)$، $p = \sigma(wx + b)$
- جینی (Gini)
- $\text{Gini}(S) = 1 - \sum_k p_k^2$. مقدار 0 گره خالص است.
- SVM با حاشیهی نرم
- $\min \frac{1}{2} \lVert w \rVert^2 + C \sum_i \max(0, 1 - y_i (w^T x_i + b))$
- کرنل RBF
- $K(x, z) = \exp(-\gamma \lVert x - z \rVert^2)$
- تفکیک خطا
- $\text{Bias}^2 + \text{Variance} + \text{Irreducible Noise}$
پیشپردازش بدون نشت داده
کدpython
# دارای نشت: مقیاسساز ردیفهای آزمون را میبیند
X_scaled = scaler.fit_transform(X)
# صحیح: برازش روی آموزش، استفادهی مجدد روی آزمون
X_train_scaled = scaler.fit_transform(X_train) # یادگیری میانگین و انحراف معیار
X_test_scaled = scaler.transform(X_test) # فقط آمارههای آموزش
# بهترین: یک آبجکت پایپلاین یکتا برای آموزش و سرو
pipe = Pipeline([
("scaler", StandardScaler()),
("model", LogisticRegression()),
])
pipe.fit(X_train, y_train) # ابتدا fit_transform، سپس fit
predictions = pipe.predict(X_test) # ابتدا transform، سپس predict
scores = cross_val_score(full_pipe, df, y, cv=5, scoring="accuracy") # برازش مجدد به ازای هر فولد
اعتبارسنجی بدون نشت داده
گامبهگام- جداسازییک مجموعهی آزمون کنار بگذارید. فقط یکبار در پایان به آن دست بزنید.
- فولدهاباقی داده را به $K$ فولد تقسیم کنید. نسبت کلاسها را حفظ (Stratify) کنید.
- برازشمقیاسساز متد
fit_transformرا روی $K-1$ فولد آموزشی فراخوانی میکند. - آموزشمدل متد
fitرا روی فولدهای آموزشیِ مقیاسشده فراخوانی میکند. - امتیازدهیمقیاسساز متد
transformرا روی فولد اعتبارسنجی فراخوانی کرده و سپس مدل پیشبینی میکند. - میانگینگیریفرایند را برای هر فولد تکرار کنید و میانگین $K$ امتیاز را بگیرید.
- گزارش نهاییمدل نهایی را روی مجموعهی آزمون ارزیابی کنید.
پرسشها
پرسش و پاسخ- چرا برای رگرسیون لجستیک از MSE استفاده نمیشود؟
- با تابع سیگموئید غیرمحدب میشود. تابع زیان لگاریتمی محدب است.
- چرا قبل از SVM مقیاسبندی انجام میشود؟
- حاشیه به $\lVert w \rVert$ بستگی دارد.
- چرا L1 ویژگیها را انتخاب میکند؟
- برخی وزنها را دقیقاً به صفر push میکند.
- آیا دادهی بیشتر بایاس بالا را رفع میکند؟
- خیر. مدل را تغییر دهید.
- چرا وزندهی به کلاسها بهتر از بیشنمونهگیری است؟
- از نظر امید ریاضی یکسان است، بدون تولید ردیفهای تکراری.
نکات کلیدی
نکتهها- ابتدا نرخ یادگیری را بررسی کنید. بقیه را روی مقادیر پیشفرض بگذارید.
- نرخ یادگیری و منظمسازی را در مقیاس لگاریتمی جستجو کنید.
- مقدار n_estimators را بالا بگذارید و اجازه دهید توقف زودهنگام تصمیم بگیرد.
- برای تخمین نهایی از اعتبارسنجی متقاطع تودرتو استفاده کنید.
- قبل از انتساب مقادیر (impute)، یک ستون was_this_missing اضافه کنید.
- آستانه را روی مجموعهی اعتبارسنجی انتخاب کنید، نه مجموعهی آزمون.
پایپلاین ColumnTransformer
معماریتنظیم هایپرپارامترها
کدpython
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, # 100 نمونه، هر کدام 5 فولد
scoring="neg_mean_squared_error", # منفیشده، مقدار بالاتر بهتر است
random_state=42, n_jobs=-1, # تمام هستههای CPU
)
search.fit(X_train, y_train)
print(search.best_params_, -search.best_score_) # منفیسازی معکوس به MSE
عیبیابی
عیبیابیخطای بالای آموزش و آزمون
- علت
- بایاس بالا
- راهحل
- ویژگیهای بیشتر، مدل پیچیدهتر، منظمسازی کمتر
خطای کمِ آموزش، خطای بالای آزمون
- علت
- واریانس بالا
- راهحل
- دادهی بیشتر، منظمسازی، مدل سادهتر
خطای آزمون بالا میرود، خطای آموزش کم میشود
- علت
- بیشبرازش در حال وقوع است
- راهحل
- توقف زودهنگام
امتیاز CV بالاتر از محیط عملیاتی
- علت
- برازش مقیاسساز روی کل داده
- راهحل
- استفاده از Pipeline به همراه cross_val_score
خطا روی دستهی جدید
- علت
- انکودر این مقدار را ندیده است
- راهحل
OneHotEncoder(handle_unknown="ignore")
دقت 99%، هیچ مثبت خالصی پیدا نشد
- علت
- عدمتوازن کلاسها
- راهحل
- وزندهی به کلاسها، تنظیم آستانه
امتیاز پایین SVM یا KNN
- علت
- ویژگیهای مقیاسبندینشده
- راهحل
- ابتدا
StandardScaler()
بهترین مقدار در لبهی بازهی جستجو است
- علت
- بازه بیش از حد محدود است
- راهحل
- فضای جستجو را گسترش دهید
مقادیر اولیه
پیشفرضها| تنظیم | پیشفرض | نکته |
|---|---|---|
Decision threshold | 0.5 | برای مثبتهای کمیاب آن را کاهش دهید |
CV folds K | 5 | 10 نیز استاندارد است |
Features per split, forest | sqrt(n_features) | n_features / 3 برای رگرسیون |
Trees in a forest | 100 | مقدار n_estimators در کد درس |
Boosting learning_rate | 0.1 | معمولاً 0.01 تا 0.3 |
Boosting max_depth | 3 | کلاس GradientBoosting در درس |
Naive Bayes alpha | 1.0 | هموارسازی لاپلاس |
Out of bag share | 36.8% | مجموعه اعتبارسنجی بدون هزینه اضافی |
کوتهنوشتها
اصطلاحها- AUC-ROC
- سطح زیر منحنی مشخصهی عملکرد دریافتکننده.
- SMOTE
- نمونهسازی کلاس اقلیت به روش درونیابی k-NN.
- GMM
- مدل آمیختهی گاوسی. خوشهبندی نرم با الگوریتم امید ریاضی-بیشینهسازی.
- RFE
- حذف بازگشتی ویژگی. آموزش، رتبهبندی، هرس، تکرار.