Python Programming

تسلط بر یادگیری ماشین در پایتون: نگاهی عمیق به Scikit-learn

تسلط بر یادگیری ماشین در پایتون: نگاهی عمیق به Scikit-learn

در منظره‌ی در حال تکامل سریع علم داده، پایتون به‌عنوان زبان مشترک این حوزه تثبیت شده است. در قلب این اکوسیستم، کتابخانه‌ی قدرتمند و متن‌باز Scikit-learn (که اغلب به اختصار sklearn نامیده می‌شود) قرار دارد که یادگیری ماشین را دموکراتیک کرده است. برای توسعه‌دهندگان متوسط تا پیشرفته، عبور از آموزش‌های مقدماتی و درک ظرافت‌های معماری Scikit-learn برای ساخت مدل‌های پیش‌بینی‌گر در سطح تولید حیاتی است. این پست به بررسی اجزای کلیدی این کتابخانه، از پردازش دقیق داده‌ها تا روش‌های پیشرفته‌ی انسامبل (Ensemble)، می‌پردازد و نقشه‌ی راهی برای بهره‌برداری کامل از پتانسیل‌های آن ارائه می‌دهد.

فلسفه‌ی ثبات و یکپارچگی

آنچه Scikit-learn را از سایر چارچوب‌های یادگیری ماشین مانند TensorFlow یا PyTorch متمایز می‌کند، تعهد بی‌چون‌وچرای آن به یک رابط کاربری (API) یکپارچه است. چه در حال کاهش ابعاد با PCA باشید، چه در حال آموزش یک ماشین بردار پشتیبان (SVM)، و چه در حال تنظیم فراپارامترها با GridSearchCV، رابط کاربری یکسان باقی می‌ماند. هر تخمین‌زننده‌ای (Estimator) متد fit را برای آموزش و متد predict را برای استنتاج پیاده‌سازی می‌کند و بسیاری از آن‌ها از متدهای score و transform نیز پشتیبانی می‌کنند. این الگوی طراحی به توسعه‌دهندگان اجازه می‌دهد تا الگوریتم‌ها را به‌راحتی درون یک خط لوله (Pipeline) جابجا کنند بدون اینکه منطق پیرامونی را بازنویسی کنند که این امر به‌طور قابل‌توجهی سرعت فرآیند آزمایشی را افزایش می‌دهد.

from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris

# بارگذاری داده‌ها
X, y = load_iris(return_X_y=True)

# راه‌اندازی و آموزش مدل با استفاده از یک رابط کاربری یکپارچه
model = RandomForestClassifier(n_estimators=100)
model.fit(X, y)

# انجام پیش‌بینی‌ها
predictions = model.predict(X)
accuracy = model.score(X, y)

print(f"دقت: {accuracy:.4f}")

پردازش دقیق داده‌ها و خط لوله‌ها

یک اشتباه رایج برای توسعه‌دهندگان تازه‌کار در یادگیری ماشین، نشت داده (Data Leakage) است؛ جایی که اطلاعات از مجموعه‌ی آزمون به‌طور تصادفی بر فرآیند آموزش تأثیر می‌گذارد. Scikit-learn این مسئله را از طریق کلاس Pipeline حل می‌کند که مراحل پردازش اولیه‌ی داده‌ها را به یک تخمین‌زننده‌ی نهایی زنجیره می‌کند. این امر تضمین می‌کند که تبدیل‌هایی مانند مقیاس‌دهی یا نرمال‌سازی، صرفاً بر روی داده‌های آموزش «فیت» (Fit) شده و سپس بر روی داده‌های آزمون اعمال می‌شوند که یکپارچگی ارزیابی شما را حفظ می‌کند.

علاوه بر این، مدیریت مقادیر گمشده و متغیرهای دسته‌ای نیازمند تبدیل‌گرهای (Transformers) خاصی است. SimpleImputer استراتژی‌های مقادیر گمشده را مدیریت می‌کند، در حالی که OneHotEncoder ویژگی‌های دسته‌ای را به فرمتی قابل‌خواندن برای ماشین تبدیل می‌کند. ترکیب این‌ها در یک خط لوله واحد، نه تنها کد شما را تمیزتر می‌کند، بلکه پیچیدگی ذخیره‌سازی (Serialization) مدل خود را با استفاده از joblib ساده‌تر می‌سازد.

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import ColumnTransformer
from sklearn.impute import SimpleImputer
from sklearn.linear_model import LogisticRegression
import pandas as pd

# تعریف پردازش اولیه برای ستون‌های عددی و دسته‌ای
numerical_features = ['age', 'income']
categorical_features = ['city', 'job']

numerical_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='median')),
    ('scaler', StandardScaler())
])

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

preprocessor = ColumnTransformer(
    transformers=[
        ('num', numerical_transformer, numerical_features),
        ('cat', categorical_transformer, categorical_features)
    ])

# ایجاد خط لوله کامل
clf = Pipeline(steps=[
    ('preprocessor', preprocessor),
    ('classifier', LogisticRegression(max_iter=1000))
])

# خط لوله فقط بر روی داده‌های آموزش، فیت کردن ایمپوتر و مقیاس‌دهنده را مدیریت می‌کند
# clf.fit(X_train, y_train)

ارزیابی مدل و تنظیم فراپارامترها

ساختن یک مدل تنها نیمی از راه است؛ ارزیابی دقیق عملکرد آن نیز به همان اندازه اهمیت دارد. Scikit-learn مجموعه‌ای از ابزارها را برای اعتبارسنجی متقاطع (Cross-Validation) ارائه می‌دهد، مانند cross_val_score و cross_validate، که با میانگین‌گیری نتایج در چندین بخش (Fold)، تضمین می‌کنند که مدل شما به‌خوبی بر روی داده‌های دیده‌نشده تعمیم می‌یابد. تکیه بر یک تقسیم‌بندی ساده‌ی آموزش-آزمون می‌تواند منجر به تخمین‌های عملکردی بیش‌ازحد خوش‌بینانه یا بدبینانه شود.

برای تنظیم فراپارامترها، کتابخانه GridSearchCV و RandomizedSearchCV را ارائه می‌دهد. در حالی که جستجوی شبکه‌ای (GridSearch) به‌طور کامل یک شبکه‌ی پارامتری را جستجو می‌کند، جستجوی تصادفی (RandomizedSearch) اغلب برای مدل‌هایی با فراپارامترهای زیاد کارآمدتر است و تعداد ثابتی از تنظیمات را نمونه‌برداری می‌کند. این تخمین‌زننده‌ها نه تنها پارامترهای بهینه را پیدا می‌کنند، بلکه معیارهایی را نیز در مورد بهترین مدل یافت‌شده ارائه می‌دهند و به‌صورت روان با سایر اجزای اکوسیستم Scikit-learn ادغام می‌شوند.

from sklearn.model_selection import GridSearchCV, cross_val_score

param_grid = {
    'classifier__C': [0.1, 1, 10],
    'classifier__solver': ['liblinear', 'lbfgs']
}

grid_search = GridSearchCV(clf, param_grid, cv=5, scoring='accuracy')
grid_search.fit(X_train, y_train)

print(f"بهترین پارامترها: {grid_search.best_params_}")
print(f"بهترین امتیاز اعتبارسنجی متقاطع: {grid_search.best_score_:.4f}")

نتیجه‌گیری

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

Share: