چیت‌شیت

مهندسی ویژگی و پایپ‌لاین‌ها

Feature Engineering and Pipelines

جایگزینی، مقیاس‌بندی، کدگذاری، انتخاب و انسمبل درون یک پایپ‌لاین بدون نشت داده (leak-free). پایتون از درس‌ها.

  • ۱۱ بخش
  • ۴ درس مرتبط
  • کد و دستورها عیناً از دوره‌ی اصلی
فهرست مطالب
  1. یک پایپ‌لاین برای ستون‌های ناهمگن
  2. پیاده‌سازی در sklearn
  3. کارکرد fit و predict
  4. وظایف تبدیل و کدگذاری
  5. وظایف انتخاب ویژگی
  6. انسمبل‌ها: چه زمانی از X استفاده شود
  7. حلقه‌های بوستینگ (Boosting)
  8. پیش‌فرض‌ها و اعداد
  9. شکست‌های پایپ‌لاین
  10. فرمول‌ها
  11. پرسش‌ها

یک پایپ‌لاین برای ستون‌های ناهمگن

معماری
ستون‌های عددیستون‌های دسته‌ایبرازش (fit)داده‌های آموزشفقط X_trainnumeric_pipeجایگزینی با میانه، مقیاس‌بندیcategorical_pipeپرتکرارترین، one-hotColumnTransformerمرحله پیش‌پردازشمدلGradientBoostingClassifierپیش‌بینیتبدیل، سپس پیش‌بینی

پیاده‌سازی در sklearn

کد
python
numeric_pipe = Pipeline([
    ("impute", SimpleImputer(strategy="median")),
    ("scale", StandardScaler()),
])
categorical_pipe = Pipeline([
    ("impute", SimpleImputer(strategy="most_frequent")),
    ("encode", OneHotEncoder(handle_unknown="ignore")),  # شهر جدید خروجی صفر می‌دهد
])
preprocessor = ColumnTransformer([
    ("num", numeric_pipe, ["age", "income", "score"]),
    ("cat", categorical_pipe, ["city", "gender", "plan"]),
])
full_pipeline = Pipeline([("preprocess", preprocessor),
                          ("model", GradientBoostingClassifier())])

کارکرد fit و predict

گام‌به‌گام
  1. ابتدا تفکیکX_train, X_test = X[:800], X[800:] قبل از هرگونه برازش.
  2. pipe.fitهر تبدیل‌کننده fit_transform را روی X_train فراخوانی می‌کند.
  3. pipe.fitآخرین مرحله fit را روی X_train تبدیل‌شده فراخوانی می‌کند.
  4. pipe.predictهر تبدیل‌کننده transform را فراخوانی می‌کند، نه fit_transform.
  5. pipe.predictمدل predict را روی X_test تبدیل‌شده فراخوانی می‌کند.
  6. اعتبارسنجی متقاطعهر فولد، پیش‌پردازشگر را روی برش آموزشی خودش برازش می‌کند.

وظایف تبدیل و کدگذاری

کار و کد
وظیفهکد
مقیاس‌بندی به [0, 1]min_max_scale(values)
میانگین 0، انحراف معیار 1standardize(values)
فشرده‌سازی چولگی به راست`log_transform(values)` uses log(v + 1)
بسته‌های با عرض برابرbin_values(values, n_bins=5)
توان‌های دوم و جفت‌هاpolynomial_features(row, degree=2)
میانگین هموارشده‌ی هدفtarget_encode(feature_values, target_values, smoothing=10)
ابتدا نشانه‌گذاری داده‌های ازدست‌رفتهadd_missing_indicator(values)
وزن‌های متنی`tfidf(documents)` returns vectors, vocab

وظایف انتخاب ویژگی

کار و کد
وظیفهکد
حذف ستون‌های تقریباً ثابتvariance_threshold(X, threshold=0.01)
رتبه‌بندی با MImutual_information(X, y, n_bins=10)
هرس بر اساس وزنrfe(X, y, n_features_to_select=5)
صفر کردن وزن‌ها با L1l1_feature_selection(X, y, alpha=0.1)
اهمیت بر اساس بهره انشعاب (Split-gain)tree_importance(X, y, n_trees=50)
sklearn RFERFE(LogisticRegression(), n_features_to_select=10)
sklearn L1SelectFromModel(Lasso(alpha=0.01))
درخت‌های sklearnrf.feature_importances_

انسمبل‌ها: چه زمانی از X استفاده شود

دستورها
دستورکارکرد
Bagging / Random Forestکاهش واریانس. داده‌های نوفه‌ای، ویژگی‌های زیاد
AdaBoostکاهش بایاس. داده‌های تمیز. آسیب‌پذیر به داده‌های پرت
Gradient Boostingکاهش بایاس. داده‌های جدولی. مستعد بیش‌برازش
XGBoost / LightGBMهر دو. نقطه شروع برای ML جدولی در محیط عملیاتی
Stackingهر دو. 1-2٪ دقت نهایی. استفاده از فراویژگی‌های CV
Soft votingمیانگین‌گیری احتمال‌های مدل‌های متنوع

حلقه‌های بوستینگ (Boosting)

کد
python
weights = np.full(n, 1 / n)            # شروع یکنواخت AdaBoost
err = np.clip(err, 1e-10, 1 - 1e-10)   # خطای وزن‌دار استامپ
alpha = 0.5 * np.log((1 - err) / err)  # خطای کم، رأی بالا
weights *= np.exp(-alpha * y * pred)   # موارد اشتباه وزن می‌گیرند
weights /= weights.sum()
self.initial_pred = np.mean(y)         # شروع گرادیان بوستینگ
residuals = y - current_pred           # گرادیان خطای مربعات
current_pred += self.lr * update       # انقباض (shrinkage) هر درخت

پیش‌فرض‌ها و اعداد

پیش‌فرض‌ها
تنظیمپیش‌فرضنکته
Target encoding `smoothing`10دسته‌های نادر را به سمت میانگین کلی می‌کشد
`remove_correlated` threshold0.9ستون دوم یک جفت را حذف می‌کند
`AdaBoostScratch` `n_estimators`50استامپ‌های تصمیم
GradientBoostingScratch100learning_rate=0.1, max_depth=3
BaggingClassifier20n_estimators=20, max_depth=5
Learning rate range0.01 to 0.3مقادیر کوچک‌تر به درخت‌های بیشتری نیاز دارند
Bootstrap unique rows63.2%36.8٪ خارج از کیسه برای اعتبارسنجی
Forest split featuressqrt(n_features)n_features / 3 برای رگرسیون

شکست‌های پایپ‌لاین

عیب‌یابی
  • امتیاز تست بیش از حد بالا

    علت
    برازش مقیاس‌بند قبل از تفکیک داده
    راه‌حل
    استفاده از Pipeline به همراه cross_val_score
  • تفاوت خروجی‌های آموزش و سرویس‌دهی

    علت
    انجام تبدیلات خارج از پایپ‌لاین
    راه‌حل
    یک شیء Pipeline واحد برای هر دو
  • کرش روی یک شهر جدید

    علت
    کدگذار هرگز مقدار را ندیده است
    راه‌حل
    OneHotEncoder(handle_unknown="ignore")
  • خرابی هنگام تغییر اسکیمای داده

    علت
    نام ستون‌های هاردکدشده
    راه‌حل
    فهرست نام ستون‌ها از تنظیمات (config)
  • رتبه‌ی بالای شناسه تصادفی

    علت
    بایاس کاردینالیتی اهمیت درختی
    راه‌حل
    بررسی با اهمیت جایگشتی
  • بیش‌برازش کدگذاری هدف

    علت
    کدگذاری روی سطرهای تست
    راه‌حل
    برازش فقط روی داده‌های آموزش، هموارسازی
  • نشت داده در استکینگ (Stacking)

    علت
    فراویژگی‌ها از داده‌های برازش‌شده
    راه‌حل
    تولید آن‌ها با اعتبارسنجی متقاطع

فرمول‌ها

مفهوم‌ها
TF-IDF
$\frac{\text{count in doc}}{\text{words in doc}} \cdot \log \frac{\text{docs}}{\text{docs with word}}$
اطلاعات متقابل
$I(X; Y) = \sum_x \sum_y p(x, y) \log \frac{p(x, y)}{p(x) p(y)}$، در صورت استقلال برابر صفر است.
تابع زیان (loss) ال1
خطای پیش‌بینی به اضافه‌ی $\alpha \sum \lvert w_i \rvert$. آلفای بالاتر وزن‌های بیشتری را صفر می‌کند.
اکثریت آرا
21 دسته‌بند با دقت 60٪ حدود 74٪ دقت می‌دهند. 101 دسته‌بند 84٪ می‌دهند.
هزینه RFE
$N - \text{target}$ بار آموزش. 500 ویژگی به 10 ویژگی یعنی 490 بار اجرا.
دسته‌بندی‌های MI
تعداد $\sqrt{n}$ دسته یا قاعده استرجز $1 + \log_2 n$.

پرسش‌ها

پرسش و پاسخ
چرا ویژگی‌ها را مقیاس‌بندی کنیم؟
K-Means، KNN و SVM از فاصله استفاده می‌کنند. مقیاس‌بندی باعث ارزش برابر تمام ویژگی‌ها می‌شود.
چرا نشانگر داده‌های ازدست‌رفته اضافه کنیم؟
خودِ نبودن داده می‌تواند حاوی اطلاعات باشد.
چرا MI و نه همبستگی؟
اطلاعات متقابل (MI) روابط درجه دوم یا دوره‌ای را ثبت می‌کند. همبستگی ممکن است صفر شود.
چرا رأی‌گیری نرم (soft voting)؟
از اطلاعات درجه‌ی اطمینان استفاده می‌کند و معمولاً بهتر از رأی‌گیری سخت است.
چه چیزی یک اجرا را تکرارپذیر می‌کند؟
سیدهای ثابت، وابستگی‌های پین‌شده، داده‌ها و فایل‌های کانفیگ نسخه‌بندی‌شده.
کدام مدل ابتدا روی داده‌های جدولی تست شود؟
LightGBM یا XGBoost با پارامترهای پیش‌فرض.