چیت‌شیت

مقایسه‌ی مدل‌های کلاسیک

Classical Models Compared

رگرسیون خطی و لجستیک، درخت‌ها و جنگل‌ها، SVM، KNN و بیز ساده در کنار هم، همراه با زمان استفاده از هرکدام.

  • ۱۱ بخش
  • ۶ درس مرتبط
  • کد و دستورها عیناً از دوره‌ی اصلی
فهرست مطالب
  1. مقایسه‌ی مدل‌ها کنار هم
  2. مقیاس‌بندی و داده‌ی بهینه
  3. چه زمانی از هر مدل استفاده کنیم؟
  4. توابع زیان و فرمول‌ها
  5. ابتدا مقیاس‌بندی، سپس برازش
  6. ساخت جنگل تصادفی
  7. اهرم‌های تعادل بین بایاس و واریانس
  8. مقادیر پیش‌فرض در کد درس
  9. مشکلات و راه‌حل‌ها
  10. پرسش‌ها
  11. کلاس‌های پیاده‌سازی از صفر

مقایسه‌ی مدل‌ها کنار هم

مقایسه
مدلآموزش بامرز، هزینه‌ی پیش‌بینی و حافظه
Linear regressionگرادیان کاهشییک ابرصفحه. معادله‌ی نرمال از مرتبه‌ی $O(n^3)$ بر حسب ویژگی‌هاست
Logistic regressionآنتروپی متقاطع دودوییهمیشه خطی. مرز تصمیم در p = 0.5
Decision treeناخالصی جینینواحی مستطیلی حاصل از برش‌های حریصانه. واریانس بالا
Random forestبگینگ (Bagging)رأی اکثریت یا میانگین چندین درخت
SVMزیان لولابیشینه‌ی حاشیه. ذخیره‌ی تنها بردارهای پشتیبان
KNNتنبَل (Lazy)بدون آموزش. $O(n \cdot d)$ به ازای هر پرس‌وجو، ذخیره‌ی تمام داده‌ها
Naive Bayesشمارش فراوانی‌هاخطی. پیش‌بینی تنها یک ضرب ماتریسی است

مقیاس‌بندی و داده‌ی بهینه

مقایسه
مدلمقیاس‌بندی ویژگی‌هابهترین عملکرد در
Linear regressionبلهخط مبنا برای هر وظیفه‌ی رگرسیون
درخت‌ها و جنگل‌هاخیرداده‌های جدولی، انواع داده‌ی ترکیبی، زیر 10 هزار سطر
SVMبلهداده‌های کوچک یا تنکِ با ابعاد بالا
KNNبلهداده‌های کوچک، حداکثر تا حدود 20-50 ویژگی
Multinomial NBخیرمتن با نمونه‌های آموزشی اندک
Gaussian NBخیرویژگی‌های پیوسته نزدیک به منحنی زنگوله‌ای

چه زمانی از هر مدل استفاده کنیم؟

نکته‌ها
  • از رگرسیون خطی به عنوان خط مبنا برای هر وظیفه‌ی رگرسیون استفاده کنید.
  • از رگرسیون لجستیک برای پاسخ‌های بله/خیر همراه با احتمالات و مرز خطی استفاده کنید.
  • از جنگل تصادفی برای داده‌های جدولی استفاده کنید. تقریباً نیازی به تنظیم ابرپارامترها ندارد.
  • از SVM برای داده‌های کم یا متن‌های تنک با ویژگی‌های TF-IDF استفاده کنید.
  • وقتی داده‌ها مرتباً تغییر می‌کنند و زمان آموزش صفر می‌خواهید، از KNN استفاده کنید.
  • برای متن‌هایی با کمتر از 10,000 نمونه‌ی آموزشی، از TF-IDF با MultinomialNB استفاده کنید.
  • برای متن‌های کوتاه از BernoulliNB استفاده کنید. پارامتر binary=True را در CountVectorizer قرار دهید.

توابع زیان و فرمول‌ها

مفهوم‌ها
MSE
$\frac{1}{n} \sum (\hat{y} - y)^2$. گرادیان برحسب w برابر است با $\frac{2}{n} \sum (\hat{y} - y) x$.
R squared
$1 - SS_{\text{res}} / SS_{\text{tot}}$. مقدار 1.0 عالی است. 0.0 معادل میانگین است.
Sigmoid
$\sigma(z) = 1 / (1 + e^{-z})$. در $z = 0$ خروجی 0.5 می‌دهد.
آنتروپی متقاطع دودویی
$-\frac{1}{n} \sum (y \log p + (1-y) \log(1-p))$. گرادیان $\frac{1}{n} \sum (p - y) x$.
جینی
$1 - \sum_k p_k^2$. مقدار آن برای 6 گربه و 4 سگ برابر 0.48 است.
لولا
$\max(0, 1 - y f(x))$. فراتر از حاشیه برابر صفر است.
کرنل RBF
$\exp(-\gamma \lVert x - z \rVert^2)$. برای نقاط نزدیک، نزدیک به 1 است.
Multinomial NB
$(\text{count} + \alpha) / (\text{total} + \alpha \cdot V)$، جمع‌شده در فضای لگاریتمی.

ابتدا مقیاس‌بندی، سپس برازش

کد
python
clf = Pipeline([
    ("scaler", StandardScaler()),                      # SVM و KNN به آن نیاز دارند
    ("svm", SVC(kernel="rbf", C=1.0, gamma="scale")),  # فرم دوگان، کرنل‌ها
])
clf.fit(X_train, y_train)
clf.score(X_test, y_test)                              # دقت
clf['svm'].n_support_                                  # بردارهای پشتیبان
("svm", LinearSVC(C=1.0, max_iter=10000))              # داده‌های بزرگ، فرم اولیه
("knn", KNeighborsClassifier(n_neighbors=5, metric="euclidean"))
mnb = MultinomialNB(alpha=1.0)                         # شمارش‌ها، بدون مقیاس‌بندی
mnb.fit(X_train_counts, y_train)

ساخت جنگل تصادفی

گام‌به‌گام
  1. بوت‌استرپنمونه‌گیری سطرها با جایگذاری. حدود 63٪ از سطرها انتخاب می‌شوند.
  2. خارج از کیسهباقی سطرها می‌توانند درخت را ارزیابی کنند.
  3. زیرمجموعه‌ی ویژگی‌هاهر برش در دسته‌بندی $\sqrt{n_{\text{features}}}$ ویژگی را می‌بیند.
  4. برش حریصانهانتخاب ویژگی و آستانه با بیشترین بهره‌ی اطلاعات.
  5. توقفیک گره خالص یا حد پیش‌هرس، شاخه (branch) را پایان می‌دهد.
  6. تکرارساخت n_trees درخت. مقدار پیش‌فرض 100 است.
  7. تجمیعرأی اکثریت برای دسته‌ها، میانگین‌گیری برای رگرسیون.

اهرم‌های تعادل بین بایاس و واریانس

دستورها
دستورکارکرد
Large `C`حاشیه‌ی باریک‌تر، خطای دسته‌بندی کمتر. بیش‌برازش (Overfit)
Small `C`حاشیه‌ی عریض‌تر، نقض قانون بیشتر. کم‌برازش (Underfit)
K = 1خطای آموزش صفر. واریانس بالا
K = Nپیش‌بینی دسته‌ی اکثریت. بیشینه‌ی بایاس
Max depthتوقف زودهنگام درخت. پیش‌هرس
NB `alpha`آلفای بزرگ‌تر هموارسازی قوی‌تری می‌دهد
Ridge $\lambda$مقدار بزرگ‌تر وزن‌های کوچک‌تری تولید می‌کند
SVR $\epsilon$تیوب عریض‌تر، بردارهای پشتیبان کمتر

مقادیر پیش‌فرض در کد درس

پیش‌فرض‌ها
تنظیمپیش‌فرضنکته
Tree `max_depth`Noneرشد می‌کند تا تمام برگ‌ها خالص شوند
Tree `min_samples_split`2یک کنترل پیش‌هرس
Tree `criterion`"gini"جینی و آنتروپی تقریباً برش‌های یکسانی می‌دهند
Forest `n_trees`100کتابخانه‌ی scikit-learn از n_estimators=100 استفاده می‌کند
Forest `max_features`"sqrt"رگرسیون از n_features/3 استفاده می‌کند
KNN `k`5شروع از حوالی sqrt(N). عدد فرد برای K در حالت دودویی
SVM `rbf_kernel` gamma0.5درجه‌ی 3 برای polynomial_kernel
GaussianNB `var_smoothing`1e-9جلوگیری از تقسیم بر واریانسِ صفر

مشکلات و راه‌حل‌ها

عیب‌یابی
  • شکست لجستیک روی مرزهای دایره‌ای

    علت
    مرز تصمیم همیشه خطی است
    راه‌حل
    افزودن ویژگی‌های چندجمله‌ای
  • دقت پایین SVM

    علت
    ویژگی‌های مقیاس‌بندی‌نشده حاشیه را به هم می‌ریزند
    راه‌حل
    استفاده از StandardScaler درون یک Pipeline
  • SVC بیش از حد کند است

    علت
    فرم دوگان از مرتبه‌ی $O(n^2)$ تا $O(n^3)$ است
    راه‌حل
    فرم اولیه‌ی LinearSVC
  • افت عملکرد KNN با افزایش تعداد ویژگی‌ها

    علت
    نفرین ابعاد
    راه‌حل
    ابتدا اجرای PCA یا UMAP
  • تغییر شدید تک‌درخت با تغییر داده‌ها

    علت
    یک تک‌درخت دارای واریانس بالایی است
    راه‌حل
    استفاده از جنگل تصادفی
  • رتبه‌ی بالای MDI برای یک ویژگی نوفه (نویز)

    علت
    بایاس به سمت کاردینالیتی بالا
    راه‌حل
    اهمیت جایگشتی
  • تولید احتمال 0 توسط NB

    علت
    کلمه‌ی دیده‌نشده در یک دسته
    راه‌حل
    هموارسازی لاپلاس، آلفا برابر 1
  • خطای MultinomialNB روی ویژگی‌ها

    علت
    مقادیر منفی ویژگی‌ها
    راه‌حل
    GaussianNB یا شیفت دادن مقادیر

پرسش‌ها

پرسش و پاسخ
چرا MSE برای رگرسیون لجستیک مناسب نیست؟
همراه با سیگموئید، تابع زیان MSE غیرمحدب می‌شود. آنتروپی متقاطع دودویی محدب است.
چرا بیز ساده با وجود فرض غلط کار می‌کند؟
دسته‌بندی به رتبه‌بندی صحیح نیاز دارد، نه احتمالات دقیق.
چرا جنگل بهتر از یک درخت عمل می‌کند؟
میانگین‌گیری از درخت‌های ناهمبسته، واریانس را بدون افزایش بایاس کاهش می‌دهد.
چرا فقط بردارهای پشتیبان اهمیت دارند؟
نقاط فراتر از حاشیه، زیان لولای صفر دارند.
بیز ساده یا رگرسیون لجستیک؟
با NB شروع کنید؛ با بزرگ شدن داده و رسیدن NB به حالت یکنواخت (Plateau)، سوییچ کنید.
معادله‌ی نرمال یا گرادیان کاهشی؟
معادله‌ی نرمال برای داده‌های کوچک، گرادیان کاهشی برای داده‌های بزرگ.
آیا به احتمالات بیز ساده اعتماد کنیم؟
خیر؛ از CalibratedClassifierCV با cv=5 استفاده کنید.

کلاس‌های پیاده‌سازی از صفر

کار و کد
وظیفهکد
خط برازش فرم بستهLinearRegressionNormal()
ناخالصی گرهgini_impurity(labels)
مقدار کرنلrbf_kernel(x, z, gamma=0.5)
زیان لولای دسته‌ایhinge_loss(X, y, w, b)
دسته‌بند متنMultinomialNB(alpha=1.0)