ویژگی تصویر

کتابخانه CatBoost در پایتون — معرفی، کاربردها و بهترین شیوه‌ها

  /  پایتون   /  کتابخانه catboost در پایتون
بنر تبلیغاتی الف

CatBoost یکی از کتابخانه‌های قدرتمند یادگیری ماشینی برای داده‌های جدولی است که توسط Yandex توسعه یافته است. این کتابخانه به‌خصوص برای کار با ویژگی‌های دسته‌ای (categorical) بهینه شده و الگوریتم‌های گرادیان بوستینگ را با روش‌هایی مثل ordered boosting و target statistics ترکیب می‌کند تا عملکرد بهتر و کاهش اورفیتینگ را فراهم آورد.

ویژگی‌های کلیدی CatBoost

  • پشتیبانی داخلی از ویژگی‌های دسته‌ای بدون نیاز به one-hot یا target encoding دستی.
  • الگوریتم Ordered Boosting که برای مجموعه‌های کوچک یا با نشانه‌گذاری ترتیب متغیر، اورفیتینگ را کاهش می‌دهد.
  • پشتیبانی از CPU و GPU و بهینه‌سازی‌های سرعتی برای آموزش سریع روی داده‌های بزرگ.
  • API سازگار با scikit-learn، قابلیت گرفتن مقادیر اهمیت ویژگی‌ها و پشتیبانی از چندکلاسه، رگرسیون و رتبه‌بندی.
  • ابزارهای تفسیرپذیری مثل SHAP داخلی و get_feature_importance.

نصب و مثال ساده

pip install catboost

در مثال زیر از pandas و sklearn برای تقسیم داده استفاده می‌کنیم و یک مدل طبقه‌بندی ساده آموزش می‌دهیم:

from catboost import CatBoostClassifier, Pool
import pandas as pd
from sklearn.model_selection import train_test_split

df = pd.read_csv('data.csv')  # فرض: شامل ستون 'target' و چند ویژگی
X = df.drop('target', axis=1)
y = df['target']

cat_features = ['gender', 'city']  # فهرست ستون‌های دسته‌ای

X_train, X_valid, y_train, y_valid = train_test_split(X, y, test_size=0.2, random_state=42)

train_pool = Pool(X_train, y_train, cat_features=cat_features)
valid_pool = Pool(X_valid, y_valid, cat_features=cat_features)

model = CatBoostClassifier(
    iterations=1000,
    learning_rate=0.05,
    depth=6,
    eval_metric='AUC',
    early_stopping_rounds=50,
    verbose=100
)

model.fit(train_pool, eval_set=valid_pool)

model.save_model('catboost_model.cbm')

توضیح: کد بالا داده‌ها را بارگذاری، تقسیم و به کمک شیء Pool که فهرست ویژگی‌های دسته‌ای را می‌پذیرد، برای مدل فراهم می‌کند. پارامترهای مهم مانند iterations، learning_rate و depth تنظیم شده‌اند و با early_stopping_rounds از آموزش بیش از حد جلوگیری می‌شود. در نهایت مدل ذخیره می‌شود.

استفاده از Pool و مدیریت ویژگی‌های دسته‌ای

بهترین روش برای دادن ویژگی‌های دسته‌ای به CatBoost، استفاده از کلاس Pool است که اطلاعات نوع ستون‌ها و نمونه‌های اعتبارسنجی را نگهداری می‌کند.

from catboost import Pool

pool = Pool(data=X, label=y, cat_features=['city', 'device_type'])

توضیح: Pool ساختار داده‌ای بهینه‌شده برای CatBoost است که هنگام فراخوانی fit کمک می‌کند تا کتابخانه بداند کدام ستون‌ها باید به‌عنوان متغیر دسته‌ای پردازش شوند.

اجرای آموزش روی GPU

model = CatBoostClassifier(
    iterations=2000,
    learning_rate=0.03,
    depth=8,
    task_type='GPU',
    devices='0'
)

model.fit(train_pool, eval_set=valid_pool)

توضیح: با قرار دادن task_type='GPU' مدل از کارت گرافیک استفاده می‌کند که برای داده‌های بزرگ و تعداد تکرار بالا بسیار سودمند است. پارامتر devices شماره دستگاه GPU را مشخص می‌کند.

تنظیمات ابرپارامتر و جستجوی شبکه‌ای

پارامترهای کلیدی که معمولاً تنظیم می‌شوند عبارتند از: iterations, learning_rate, depth, l2_leaf_reg, border_count و bagging_temperature. نمونه‌ای از جستجوی شبکه‌ای ساده:

from sklearn.model_selection import GridSearchCV
from catboost import CatBoostClassifier

cbc = CatBoostClassifier(verbose=0)

params = {
    'depth': [4, 6, 8],
    'learning_rate': [0.01, 0.05],
    'iterations': [500, 1000]
}

grid = GridSearchCV(cbc, params, cv=3, scoring='roc_auc')
grid.fit(X, y)
print(grid.best_params_, grid.best_score_)

توضیح: در این مثال از wrapper اسکیکیت‌لرن برای استفاده از GridSearchCV بهره می‌بریم. توجه کنید که برای داده‌های بزرگ یا پارامترهای زیاد بهتر است از روش‌های کارآمدتر مثل RandomizedSearchCV یا Optuna استفاده شود تا هزینه محاسباتی کاهش یابد.

تفسیرپذیری و SHAP

CatBoost امکان استخراج اهمیت ویژگی و نیز مقادیر SHAP را فراهم می‌کند که برای توضیح تصمیمات مدل مفید است.

# گرفتن اهمیت ویژگی
import numpy as np
feature_importances = model.get_feature_importance(train_pool)
features = X.columns
for f, imp in sorted(zip(features, feature_importances), key=lambda x: x[1], reverse=True)[:10]:
    print(f, imp)

# گرفتن SHAP values
shap_values = model.get_feature_importance(type='ShapValues', data=valid_pool)

توضیح: get_feature_importance انواع مختلفی دارد؛ type='ShapValues' مقادیر SHAP را برمی‌گرداند که می‌توان برای تفسیر محلی و کلی استفاده کرد. توجه کنید که خروجی SHAP ممکن است شامل یک ستون اضافی برای مقدار پایه (base value) باشد.

موارد کاربرد و بهترین شیوه‌ها

  • CatBoost برای مسائل طبقه‌بندی، رگرسیون و رتبه‌بندی روی داده‌های جدولی بسیار مناسب است.
  • اگر تعداد ویژگی‌های دسته‌ای زیاد و کاردینالیتی بالا است، CatBoost معمولاً بهتر از one-hot عمل می‌کند.
  • برای مجموعه‌های کوچک یا داده‌های دارای ترتیب زمانی، از ordered boosting و cross-validation مناسب استفاده کنید.
  • همیشه از early_stopping_rounds و eval_set برای جلوگیری از overfitting بهره ببرید.
  • برای بهینه‌سازی زمان آموزش، از GPU و کاهش دقت پارامترها مانند iterations و depth استفاده کنید.

مقایسه سریع با XGBoost و LightGBM

ویژگیCatBoostLightGBMXGBoost
پشتیبانی از categoricalبومی، قویمحدود (نیاز به تبدیل)نیاز به تبدیل
سرعت آموزشخوب (GPU)بسیار سریعخوب
مقابله با overfittingordered boostingregularization های معمولیregularization های معمولی

نتیجه‌گیری

CatBoost انتخابی هوشمند برای مشکلات جدولی است، به‌ویژه زمانی که با ویژگی‌های دسته‌ای سروکار دارید یا مجموعه داده‌های نسبتاً کوچک تا متوسط دارید. با رعایت نکات تنظیم پارامتر و استفاده از امکاناتی مانند Pool، GPU، و ابزارهای تفسیرپذیری می‌توانید مدل‌هایی دقیق و قابل‌اعتماد بسازید.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: