Python Programming

تسلط بر جریان‌های کاری یادگیری ماشین با Scikit-learn: از آماده‌سازی داده تا تولید

در اکوسیستم گسترده علم داده پایتون، Scikit-learn همچنان قهرمان بی‌رقیب یادگیری ماشین کلاسیک است. در حالی که چارچوب‌های یادگیری عمیق مانند PyTorch و TensorFlow در صدر اخبار شبکه‌های عصبی قرار دارند، Scikit-learn ابزارهای ضروری برای رگرسیون، طبقه‌بندی، خوشه‌بندی و کاهش ابعاد را فراهم می‌کند. برای توسعه‌دهندگان متوسط تا پیشرفته، عبور از آموزش‌های مقدماتی به سمت ساخت پایپ‌لاین‌های یادگیری ماشین (ML) قوی و قابل نگهداری، نیازمند درک عمیقی از معماری این کتابخانه است. این پست به بررسی نحوه بهره‌گیری از API استاندارد Scikit-learn برای ساخت سیستم‌های یادگیری ماشین تکرارپذیر و مقیاس‌پذیر می‌پردازد.

فلسفه API یکپارچه

قدرت اصلی Scikit-learn در طراحی API یکپارچه آن نهفته است. صرف‌نظر از الگوریتم، چه ماشین بردار پشتیبان (SVM)، جنگل تصادفی یا خوشه‌بندی K-Means باشد، رابط کاربری یکسان باقی می‌ماند. این ثبات به توسعه‌دهندگان امکان می‌دهد تا الگوریتم‌ها را با حداقل تغییرات کد جابجا کنند که منجر به نمونه‌سازی سریع و آزمایش‌های بیشتر می‌شود. ساختار اصلی حول سه روش کلیدی می‌چرخد: 1. fit(X, y): مدل را روی داده‌ها آموزش می‌دهد. 2. predict(X): پیش‌بینی‌هایی برای داده‌های جدید تولید می‌کند. 3. transform(X): یک تبدیل را روی داده‌ها اعمال می‌کند (که در پیش‌پردازش رایج است). با پایبندی به این الگو، اطمینان حاصل می‌کنید که کد شما خوانا و به راحتی در سیستم‌های بزرگ‌تر قابل ادغام است.

پیش‌پردازش داده‌های قوی با Transform‌ها

داده‌های دنیای واقعی به ندرت تمیز هستند. قبل از وارد کردن داده‌ها به هر تخمین‌زننده‌ای (estimator)، پیش‌پردازش حیاتی است. Scikit-learn مجموعه‌ای از Transform‌ها را ارائه می‌دهد که مقیاس‌دهی، کدگذاری و تکمیل مقادیر گمشده را مدیریت می‌کنند. یک اشتباه رایج برای مبتدیان، اعمال مقیاس‌دهی قبل از تقسیم داده‌هاست که منجر به نشت داده (data leakage) می‌شود. برای جلوگیری از این موضوع، باید مراحل پیش‌پردازش خود را در یک ساختار بسته قرار دهیم. در زیر نمونه‌ای با استفاده از ColumnTransformer برای مدیریت همزمان ویژگی‌های عددی و دسته‌ای آورده شده است. این رویکرد اطمینان حاصل می‌کند که تبدیل‌ها به طور یکسان روی هر دو مجموعه آموزشی و آزمایشی اعمال می‌شوند.
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer

# تعریف ستون‌ها
numeric_features = ['age', 'income']
categorical_features = ['gender', 'city']

# تعریف Transform‌ها
numeric_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='median')),
    ('scaler', StandardScaler())
])

categorical_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='most_frequent')),
    ('onehot', OneHotEncoder(handle_unknown='ignore'))
])

# ترکیب Transform‌ها
preprocessor = ColumnTransformer(
    transformers=[
        ('num', numeric_transformer, numeric_features),
        ('cat', categorical_transformer, categorical_features)
    ])

بهینه‌سازی جریان‌های کاری با Pipeline

پس از تعریف پیش‌پردازش، مرحله بعدی ادغام آن با مدل است. شیء Pipeline در Scikit-learn برای این منظور ضروری است. این شیء مراحل پیش‌پردازش و تخمین‌زننده نهایی را در یک شیء واحد به هم زنجیر می‌کند. Pipeline‌ها سه مزیت اصلی ارائه می‌دهند: 1. **اختصار کد**: نیاز به متغیرهای میانی را کاهش می‌دهد. 2. **ایمنی**: با اطمینان از اینکه Transform‌ها فقط در طول اعتبارسنجی متقابل (cross-validation) روی داده‌های آموزشی فیت می‌شوند، از نشت داده جلوگیری می‌کند. 3. **استقرار (Deployment)**: ذخیره و بارگذاری مدل‌ها را ساده می‌کند، زیرا کل جریان کاری در یک شیء بسته‌بندی شده است.
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# فرض بر این است که X و y تعریف شده‌اند
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# ایجاد Pipeline کامل
model_pipeline = Pipeline(steps=[
    ('preprocessor', preprocessor),
    ('classifier', RandomForestClassifier(n_estimators=100, random_state=42))
])

# فیت کردن و پیش‌بینی
model_pipeline.fit(X_train, y_train)
predictions = model_pipeline.predict(X_test)

print(f"Accuracy: {accuracy_score(y_test, predictions):.2f}")

تنظیم فراپارامترها و اعتبارسنجی

برای حداکثر کردن عملکرد، تنظیم فراپارامترها ضروری است. Scikit-learn ابزارهای GridSearchCV و RandomizedSearchCV را برای خودکارسازی این فرآیند ارائه می‌دهد. هنگام کار با Pipeline‌ها، می‌توانید پارامترها را در هر دو مرحله پیش‌پردازش و خود مدل با استفاده از دو خط زیرین __ برای پیمایش ساختار Pipeline تنظیم کنید.
from sklearn.model_selection import GridSearchCV

param_grid = [
    {
        'classifier__n_estimators': [50, 100],
        'classifier__max_depth': [None, 10]
    }
]

grid_search = GridSearchCV(model_pipeline, param_grid, cv=5, scoring='accuracy', n_jobs=-1)
grid_search.fit(X_train, y_train)

print(f"Best Parameters: {grid_search.best_params_}")

نتیجه‌گیری

Scikit-learn فراتر از یک مجموعه الگوریتم است؛ بلکه چارچوبی برای ساخت جریان‌های کاری یادگیری ماشین قابل اعتماد است. با بهره‌گیری از Pipeline، ColumnTransformer و استراتژی‌های صحیح اعتبارسنجی متقابل، توسعه‌دهندگان می‌توانند مدل‌هایی بسازند که نه تنها دقیق، بلکه تکرارپذیر و آماده برای محیط تولید هستند. برای کسانی که به دنبال تثبیت مهارهای مهندسی یادگیری ماشین خود هستند، تسلط بر این ابزارها گامی حیاتی در سفر از اکتشاف داده تا استقرار است.
Share: