چیت‌شیت

یادگیری ماشین کلاسیک

Classical Machine Learning

برازش، اعتبارسنجی، تنظیم و رفع اشکال مدل‌های رگرسیون، طبقه‌بندی و خوشه‌بندی با scikit-learn.

  • ۱۲ بخش
  • ۱۵ درس مرتبط
  • کد و دستورها عیناً از دوره‌ی اصلی
فهرست مطالب
  1. برازش یک مدل
  2. معیارهای ارزیابی
  3. فرمول‌های کلیدی
  4. پیش‌پردازش بدون نشت داده
  5. اعتبارسنجی بدون نشت داده
  6. پرسش‌ها
  7. نکات کلیدی
  8. پایپ‌لاین ColumnTransformer
  9. تنظیم هایپرپارامترها
  10. عیب‌یابی
  11. مقادیر اولیه
  12. کوته‌نوشت‌ها

برازش یک مدل

کار و کد
وظیفهکد
رگرسیون با منظم‌سازی L2Ridge(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-MeansKMeans(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-ROC0.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")  # برازش مجدد به ازای هر فولد

اعتبارسنجی بدون نشت داده

گام‌به‌گام
  1. جداسازییک مجموعه‌ی آزمون کنار بگذارید. فقط یک‌بار در پایان به آن دست بزنید.
  2. فولدهاباقی داده را به $K$ فولد تقسیم کنید. نسبت کلاس‌ها را حفظ (Stratify) کنید.
  3. برازشمقیاس‌ساز متد fit_transform را روی $K-1$ فولد آموزشی فراخوانی می‌کند.
  4. آموزشمدل متد fit را روی فولدهای آموزشیِ مقیاس‌شده فراخوانی می‌کند.
  5. امتیازدهیمقیاس‌ساز متد transform را روی فولد اعتبارسنجی فراخوانی کرده و سپس مدل پیش‌بینی می‌کند.
  6. میانگین‌گیریفرایند را برای هر فولد تکرار کنید و میانگین $K$ امتیاز را بگیرید.
  7. گزارش نهاییمدل نهایی را روی مجموعه‌ی آزمون ارزیابی کنید.

پرسش‌ها

پرسش و پاسخ
چرا برای رگرسیون لجستیک از MSE استفاده نمی‌شود؟
با تابع سیگموئید غیرمحدب می‌شود. تابع زیان لگاریتمی محدب است.
چرا قبل از SVM مقیاس‌بندی انجام می‌شود؟
حاشیه به $\lVert w \rVert$ بستگی دارد.
چرا L1 ویژگی‌ها را انتخاب می‌کند؟
برخی وزن‌ها را دقیقاً به صفر push می‌کند.
آیا داده‌ی بیشتر بایاس بالا را رفع می‌کند؟
خیر. مدل را تغییر دهید.
چرا وزن‌دهی به کلاس‌ها بهتر از بیش‌نمونه‌گیری است؟
از نظر امید ریاضی یکسان است، بدون تولید ردیف‌های تکراری.

نکات کلیدی

نکته‌ها
  • ابتدا نرخ یادگیری را بررسی کنید. بقیه را روی مقادیر پیش‌فرض بگذارید.
  • نرخ یادگیری و منظم‌سازی را در مقیاس لگاریتمی جستجو کنید.
  • مقدار n_estimators را بالا بگذارید و اجازه دهید توقف زودهنگام تصمیم بگیرد.
  • برای تخمین نهایی از اعتبارسنجی متقاطع تودرتو استفاده کنید.
  • قبل از انتساب مقادیر (impute)، یک ستون was_this_missing اضافه کنید.
  • آستانه را روی مجموعه‌ی اعتبارسنجی انتخاب کنید، نه مجموعه‌ی آزمون.

پایپ‌لاین ColumnTransformer

معماری
انتخابانتخابDataFrameعددی و دسته‌ایستون‌های عددیسن، درآمد، امتیازستون‌های دسته‌ایشهر، طرحSimpleImputerمیانه، سپس StandardScalerSimpleImputerپرتکرارترین، سپس OneHotEncoderColumnTransformerاتصال خروجی هر دومدلGradientBoostingClassifier، پیش‌بینی

تنظیم هایپرپارامترها

کد
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 threshold0.5برای مثبت‌های کمیاب آن را کاهش دهید
CV folds K510 نیز استاندارد است
Features per split, forestsqrt(n_features)n_features / 3 برای رگرسیون
Trees in a forest100مقدار n_estimators در کد درس
Boosting learning_rate0.1معمولاً 0.01 تا 0.3
Boosting max_depth3کلاس GradientBoosting در درس
Naive Bayes alpha1.0هموارسازی لاپلاس
Out of bag share36.8%مجموعه اعتبارسنجی بدون هزینه اضافی

کوته‌نوشت‌ها

اصطلاح‌ها
AUC-ROC
سطح زیر منحنی مشخصه‌ی عملکرد دریافت‌کننده.
SMOTE
نمونه‌سازی کلاس اقلیت به روش درونیابی k-NN.
GMM
مدل آمیخته‌ی گاوسی. خوشه‌بندی نرم با الگوریتم امید ریاضی-بیشینه‌سازی.
RFE
حذف بازگشتی ویژگی. آموزش، رتبه‌بندی، هرس، تکرار.