AI

بهینه‌سازی هایپرپارامترهای سری‌های زمانی با Optuna در MLOps

پیش‌بینی سری‌های زمانی ستون فقرات علم داده مدرن است و از بهینه‌سازی زنجیره تأمین تا مدل‌سازی مالی همه چیز را ممکن می‌سازد. با این حال، عملکرد این مدل‌ها به شدت به هایپرپارامترهای آن‌ها وابسته است. روش‌های سنتی جستجوی شبکه‌ای از نظر محاسباتی پرهزینه هستند و اغلب در کاوش مؤثر فضای جستجوی بعد بالا شکست می‌خورند. اینجاست که Optuna، یک چارچوب پیشرو برای بهینه‌سازی هایپرپارامتر، می‌درخشد. در این پست، بررسی می‌کنیم که چگونه می‌توان Optuna را در یک پایپ‌لاین MLOps آماده برای تولید و پیش‌بینی سری‌های زمانی ادغام کرد.

چرا Optuna به جای جستجوی شبکه‌ای؟

جستجوی شبکه‌ای (Grid Search) هر ترکیب ممکن از هایپرپارامترها را ارزیابی می‌کند که با افزایش تعداد پارامترها غیرقابل مدیریت می‌شود. جستجوی تصادفی (Random Search) کارایی را بهبود می‌بخشد اما همچنان منابع را در مناطق نامطمئن فضای جستجو هدر می‌دهد. Optuna از رویکرد بهینه‌سازی بیزی، به طور خاص برآوردگر پاروزن ساختار درختی (TPE)، برای نمونه‌برداری هوشمندانه از هایپرپارامترها استفاده می‌کند. این ابزار از آزمون‌های قبلی یاد می‌گیرد تا مجموعه بعدی پارامترها را پیشنهاد دهد و زمان مورد نیاز برای یافتن پیکربندی‌های بهینه را به طور قابل توجهی کاهش می‌دهد.

برای داده‌های سری زمانی، که وابستگی‌های زمانی در آن‌ها حیاتی است، یافتن اندازه پنجره مناسب، ویژگی‌های تأخیری و پارامترهای خاص مدل می‌تواند تفاوت بین یک پیش‌بینی قوی و یک پیش‌بینی پر نویز باشد. توانایی Optuna در مدیریت استراتژی‌های پیچیده هرس (Pruning) به ما اجازه می‌دهد آزمون‌های با عملکرد ضعیف را زودتر حذف کنیم و منابع محاسباتی ارزشمند را صرفه‌جویی کنیم.

راه‌اندازی محیط

قبل از ورود به کد، اطمینان حاصل کنید که کتابخانه‌های ضروری نصب شده‌اند. ما از pandas برای دستکاری داده‌ها، lightgbm برای مدل پیش‌بینی و optuna برای بهینه‌سازی استفاده خواهیم کرد. برای یک محیط تولید، در نظر بگیرید که از mlflow برای ردیابی آزمایش‌ها در کنار Optuna استفاده کنید.

!pip install optuna lightgbm pandas scikit-learn

پیاده‌سازی تابع هدف

هسته اصلی ادغام Optuna، تابع هدف است. این تابع تعریف می‌کند که ما چه چیزی را می‌خواهیم بهینه کنیم. برای پیش‌بینی سری‌های زمانی، معمولاً خطای مربعی متوسط ریشه (RMSE) را در یک مجموعه اعتبارسنجی حداقل می‌کنیم. مدیریت دقیق تقسیم‌بندی سری‌های زمانی برای جلوگیری از نشت داده حیاتی است. ما از یک رویکرد اعتبارسنجی ساده حرکت رو به جلو (Walk-forward validation) در داخل تابع هدف استفاده خواهیم کرد.

import optuna
import lightgbm as lgb
import numpy as np
from sklearn.metrics import mean_squared_error

def objective(trial):
    # تعریف فضای جستجو
    params = {
        'objective': 'regression',
        'metric': 'rmse',
        'verbosity': -1,
        'boosting_type': 'gbdt',
        'num_leaves': trial.suggest_int('num_leaves', 2, 256),
        'learning_rate': trial.suggest_float('learning_rate', 0.01, 0.1, log=True),
        'feature_fraction': trial.suggest_float('feature_fraction', 0.4, 1.0),
        'bagging_fraction': trial.suggest_float('bagging_fraction', 0.4, 1.0),
        'bagging_freq': trial.suggest_int('bagging_freq', 1, 7)
    }
    
    # فرض کنید X_train, y_train, X_val, y_val از قبل بارگذاری شده‌اند
    # در محیط تولید، این‌ها باید از طریق یک پایپ‌لاین داده مقاوم مدیریت شوند
    
    train_data = lgb.Dataset(X_train, label=y_train)
    val_data = lgb.Dataset(X_val, label=y_val, reference=train_data)
    
    # آموزش مدل با توقف زودهنگام
    model = lgb.train(
        params,
        train_data,
        num_boost_round=1000,
        valid_sets=[val_data],
        callbacks=[lgb.early_stopping(50)]
    )
    
    # پیش‌بینی و محاسبه RMSE
    predictions = model.predict(X_val)
    rmse = np.sqrt(mean_squared_error(y_val, predictions))
    
    return rmse

اجرای بهینه‌سازی با ادغام MLOps

برای آماده‌سازی این فرآیند برای محیط تولید، باید ردیابی آزمایش‌ها را ادغام کنیم. Optuna از پشتیبانی داخلی برای MLflow برخوردار است که به ما امکان می‌دهد پارامترها، متریک‌ها و حتی آرتیفکت‌های مدل آموزش‌دیده را ثبت کنیم. این امر تکرارپذیری را تضمین کرده و استقرار مدل را تسهیل می‌کند.

import mlflow

# راه‌اندازی ردیابی MLflow
mlflow.set_tracking_uri("http://localhost:5000")
mlflow.set_experiment("TimeSeries_Optuna_Tuning")

# ایجاد مطالعه با هرس برای حذف آزمون‌های ضعیف
study = optuna.create_study(
    direction="minimize",
    sampler=optuna.samplers.TPESampler(seed=42),
    pruner=optuna.pruners.MedianPruner(n_startup_trials=5)
)

# بهینه‌سازی
study.optimize(objective, n_trials=50)

# دریافت بهترین هایپرپارامترها
best_params = study.best_params
print(f"Best parameters: {best_params}")
print(f"Best RMSE: {study.best_value}")

نتیجه‌گیری

اتوماتیک کردن تنظیم هایپرپارامتر با Optuna، پیش‌بینی سری‌های زمانی را از یک فرآیند دستی و آزمون و خطا به یک جریان کاری سیستماتیک و کارآمد تبدیل می‌کند. با ترکیب الگوریتم‌های جستجوی هوشمند Optuna با اصول MLOps مانند ادغام MLflow، توسعه‌دهندگان می‌توانند اطمینان حاصل کنند که مدل‌های پیش‌بینی آن‌ها نه تنها دقیق، بلکه تکرارپذیر و مقیاس‌پذیر هستند. با افزایش حجم داده‌ها، این پایپ‌لاین‌های خودکار برای حفظ مزیت رقابتی در صنایع مبتنی بر داده ضروری می‌شوند.

Share: