چیتشیت
مهندسی ویژگی و پایپلاینها
Feature Engineering and Pipelines
جایگزینی، مقیاسبندی، کدگذاری، انتخاب و انسمبل درون یک پایپلاین بدون نشت داده (leak-free). پایتون از درسها.
فهرست مطالب
یک پایپلاین برای ستونهای ناهمگن
معماریپیادهسازی در 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
گامبهگام- ابتدا تفکیک
X_train, X_test = X[:800], X[800:]قبل از هرگونه برازش. - pipe.fitهر تبدیلکننده
fit_transformرا روی X_train فراخوانی میکند. - pipe.fitآخرین مرحله
fitرا روی X_train تبدیلشده فراخوانی میکند. - pipe.predictهر تبدیلکننده
transformرا فراخوانی میکند، نهfit_transform. - pipe.predictمدل
predictرا روی X_test تبدیلشده فراخوانی میکند. - اعتبارسنجی متقاطعهر فولد، پیشپردازشگر را روی برش آموزشی خودش برازش میکند.
وظایف تبدیل و کدگذاری
کار و کد| وظیفه | کد |
|---|---|
| مقیاسبندی به [0, 1] | min_max_scale(values) |
| میانگین 0، انحراف معیار 1 | standardize(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) |
| رتبهبندی با MI | mutual_information(X, y, n_bins=10) |
| هرس بر اساس وزن | rfe(X, y, n_features_to_select=5) |
| صفر کردن وزنها با L1 | l1_feature_selection(X, y, alpha=0.1) |
| اهمیت بر اساس بهره انشعاب (Split-gain) | tree_importance(X, y, n_trees=50) |
| sklearn RFE | RFE(LogisticRegression(), n_features_to_select=10) |
| sklearn L1 | SelectFromModel(Lasso(alpha=0.01)) |
| درختهای sklearn | rf.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` threshold | 0.9 | ستون دوم یک جفت را حذف میکند |
`AdaBoostScratch` `n_estimators` | 50 | استامپهای تصمیم |
GradientBoostingScratch | 100 | learning_rate=0.1, max_depth=3 |
BaggingClassifier | 20 | n_estimators=20, max_depth=5 |
Learning rate range | 0.01 to 0.3 | مقادیر کوچکتر به درختهای بیشتری نیاز دارند |
Bootstrap unique rows | 63.2% | 36.8٪ خارج از کیسه برای اعتبارسنجی |
Forest split features | sqrt(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 با پارامترهای پیشفرض.