FA-TOOLS — Header Component
آموزش scikit learn

آموزش جامع Scikit-Learn: راهنمای عملی یادگیری ماشین در پایتون

کتابخانه Scikit-Learn ابزار اصلی پیاده‌سازی پروژه‌های یادگیری ماشین در پایتون است که ساخت، ارزیابی و استقرار مدل‌های داده‌پمحور را ساده می‌کند. در این راهنمای کاربردی، صفر تا صد جریان کاری یادگیری ماشین را از پیش‌پردازش داده‌ها و ساخت خط‌لوله (Pipeline) تا تنظیم هایپرپارامترها و جلوگیری از نشت داده‌ها به‌صورت پروژه‌محور فرا می‌گیرید.

فهرست مطالب

  • • کتابخانه Scikit-Learn چیست و چه معماری دارد؟
  • • مراحل پیش‌پردازش داده‌ها با StandardScaler و Pipeline
  • • جدول مقایسه الگوریتم‌های مقیاس‌سازی داده‌ها
  • • آموزش ساخت و ارزیابی مدل‌های طبقه‌بندی و رگرسیون
  • • تنظیم هایپرپارامترها با GridSearchCV
  • • ۳ اشتباه مهلک در یادگیری ماشین و روش جلوگیری از آن‌ها
  • • پرسش‌های متداول
  • • عیب‌یابی سریع و رفع خطاهای رایج

خلاصه کلیدی این آموزش

  • طراحی یکپارچه بر پایه سه API اصلی: Estimator، Transformer و Predictor.
  • استفاده از Pipeline برای جلوگیری از نشت داده (Data Leakage) در تمیزکاری داده‌ها.
  • تنظیم خودکار بهترین پارامترهای مدل با استفاده از Validation متقاطع (Cross-Validation).
  • مدیریت داده‌های نامتوازن و ذخیره‌سازی بهینه مدل‌ها برای محیط عملیاتی.

کتابخانه Scikit-Learn چیست و چه معماری دارد؟

کتابخانه Scikit-Learn چیست و چه معماری دارد؟

Scikit-Learn یک کتابخانه متن‌باز پایتون برای یادگیری ماشین است که بر پایه NumPy، SciPy و Matplotlib توسعه یافته و ابزارهای استانداردی برای پیش‌پردازش، طبقه‌بندی، رگرسیون، خوشه‌بندی و کاهش ابعاد ارائه می‌دهد. این کتابخانه به دلیل رابط برمهندسی شده و یکپارچه خود، استاندارد اصلی صنعت داده محسوب می‌شود.

تمام اشیاء در سایکیت‌لرن از یک معماری سه بخشی پیروی می‌کنند که درک آن نوشتن کد را بسیار ساده می‌کند:

  • تخمین‌زننده‌ها (Estimators): هر تصمیمی که بر اساس داده پارامترها را یاد می‌گیرد. متد اصلی آن fit() است.
  • مبدل‌ها (Transformers): اشیائی که داده‌ها را تغییر می‌دهند (مثل نرمال‌سازی). متد اصلی آن transform() یا fit_transform() است.
  • پیش‌بین‌ها (Predictors): مدل‌هایی که پس از آموزش می‌توانند برای داده‌های جدید خروجی تولید کنند. متد اصلی آن predict() است.

برای استفاده از این کتابخانه، ابتدا باید آن را در محیط پایتون خود نصب کنید. اگر با توسعه پروژه‌های کاربردی آشنا هستید، می‌توانید مجموعه قطعه‌کدهای کاربردی پایتون را نیز بررسی کنید تا زیرساخت کدهای خود را بهتر مدیریت نمایید.

pip install scikit-learn numpy pandas matplotlib

مراحل پیش‌پردازش داده‌ها با StandardScaler و Pipeline

مراحل پیش‌پردازش داده‌ها با StandardScaler و Pipeline

پیش‌پردازش داده شامل آماده‌سازی ورودی‌های خام از طریق پر کردن مقادیر مفقود، مقیاس‌سازی ویژگی‌های عددی و کدگذاری ویژگی‌های متنی است تا الگوریتم‌های ریاضی بتوانند الگوی درست را کشف کنند.

بزرگ‌ترین اشتباه تازه‌کاران در این مرحله، اعمال پیش‌پردازش روی کل داده‌ها قبل از جداسازی داده‌های آموزش (Train) و آزمون (Test) است. این کار باعث نشت اطلاعات آزمون به الگوریتم می‌شود. راهکار استاندارد استفاده از Pipeline و ColumnTransformer است.

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

# ایجاد داده‌های نمونه
data = pd.DataFrame({
    'age': [25, 30, None, 45, 35],
    'salary': [50000, 60000, 80000, None, 65000],
    'city': ['Tehran', 'Shiraz', 'Tehran', 'Isfahan', 'Shiraz'],
    'bought': [0, 1, 0, 1, 1]
})

X = data.drop('bought', axis=1)
y = data['bought']

# تفکیک داده‌ها قبل از هرگونه پردازش
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# تعریف خط‌لوله برای ویژگی‌های عددی
num_features = ['age', 'salary']
num_pipeline = Pipeline([
    ('imputer', SimpleImputer(strategy='median')),
    ('scaler', StandardScaler())
])

# تعریف خط‌لوله برای ویژگی‌های متنی (دسته‌ای)
cat_features = ['city']
cat_pipeline = Pipeline([
    ('encoder', OneHotEncoder(handle_unknown='ignore'))
])

# ترکیب پیش‌پردازش‌ها
preprocessor = ColumnTransformer([
    ('num', num_pipeline, num_features),
    ('cat', cat_pipeline, cat_features)
])

# اعمال تغییرات
X_train_prepared = preprocessor.fit_transform(X_train)
X_test_prepared = preprocessor.transform(X_test)

جدول مقایسه روش‌های مقیاس‌سازی (Scaling) داده‌ها

جدول مقایسه روش‌های مقیاس‌سازی (Scaling) داده‌ها

انتخاب ابزار درست برای یکسان‌سازی مقیاس داده‌ها تأثیر مستقیم بر عملکرد مدل دارد. جدول زیر رفتار دو مبدل اصلی Scikit-Learn را مقایسه می‌کند:

ویژگی / ابزار StandardScaler RobustScaler
فرمول ریاضی (x – μ) / σ (میانگین صفر، انحراف معیار یک) (x – Q2) / (Q3 – Q1) (بر پایه میانه و چارک‌ها)
حساسیت به داده‌های پرت (Outliers) بسیار حساس (میانگین تحت تأثیر قرار می‌گیرد) مقاوم (از داده‌های پرت آسیب نمی‌بیند)
بهترین توزیع ورودی توزیع نرمال (گوسی) توزیع غیرنرمال یا دارای مقادیر پرت زیاد

آموزش ساخت و ارزیابی مدل‌های طبقه‌بندی و رگرسیون

آموزش ساخت و ارزیابی مدل‌های طبقه‌بندی و رگرسیون

آموزش مدل در سایکیت‌لرن شامل فراخوانی الگوریتم، دادن داده‌ها به متد fit و سپس ارزیابی دقت با معیارهایی مانند Accuracy، Precision، Recall یا RMSE است.

در مثال زیر، یک مدل Random Forest را مستقیماً درون یک Pipeline متصل به بخش پیش‌پردازش آموزش می‌دهیم و ماتریس درهم‌ریختگی (Confusion Matrix) آن را محاسبه می‌کنیم:

from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report, confusion_matrix

# ساخت خط‌لوله کامل شامل پیش‌پردازش و مدل
full_pipeline = Pipeline([
    ('preprocessor', preprocessor),
    ('classifier', RandomForestClassifier(n_estimators=100, random_state=42))
])

# آموزش کامل مدل
full_pipeline.fit(X_train, y_train)

# پیش‌بینی روی داده‌های آزمون
y_pred = full_pipeline.predict(X_test)

# ارزیابی نتایج
print("Confusion Matrix:n", confusion_matrix(y_test, y_pred))
print("nClassification Report:n", classification_report(y_test, y_pred))

اگر قصد دارید مدل‌های یادگیری ماشین خود را درون یک نرم‌افزار دسکتاپ اجرا کنید، آموزش ساخت رابط کاربری گرافیکی با tkinter به شما کمک می‌کند تا الگوریتم‌های Scikit-Learn را به فرم‌های تعاملی متصل کنید.

تنظیم هایپرپارامترها با GridSearchCV

تنظیم هایپرپارامترها با GridSearchCV

GridSearchCV تمام ترکیبات ممکن از هایپرپارامترهای مشخص شده را تست کرده و با استفاده از Validation متقاطع (Cross-Validation)، بهترین ترکیب را برای بالا بردن دقت مدل انتخاب می‌کند.

کد زیر نحوه جستجوی بهینه را روی یک Pipeline نشان می‌دهد:

from sklearn.model_selection import GridSearchCV

# تعریف فضای جستجوی پارامترها (توجه به نام‌گذاری با __)
param_grid = {
    'classifier__n_estimators': [50, 100, 200],
    'classifier__max_depth': [None, 10, 20],
    'classifier__min_samples_split': [2, 5]
}

# ساخت جستجوگر شبکه‌ای با ۵ فولدهای اعتبارسنجی
grid_search = GridSearchCV(full_pipeline, param_grid, cv=5, scoring='f1', n_jobs=-1)
grid_search.fit(X_train, y_train)

print("بهترین پارامترها:", grid_search.best_params_)
print("بهترین امتیاز:", grid_search.best_score_)

۳ اشتباه مهلک در یادگیری ماشین و روش جلوگیری از آن‌ها

  1. نشت داده‌ها (Data Leakage) هنگام مقیاس‌سازی: هیچ‌گاه متد fit_transform() را روی کل مجموعه داده صدا نزنید. همیشه fit را فقط روی مجموعه Train اجرا کنید و روی Test فقط transform بزنید.
  2. ارزیابی داده‌های نامتوازن فقط با Accuracy: اگر ۹۵٪ داده‌های شما کلاس ۰ باشند، مدلی که همیشه ۰ پیش‌بینی کند ۹۵٪ دقت دارد اما کاملاً بی‌مصرف است! در این شرایط از معیار F1-Score یا ROC-AUC و پارامتر class_weight='balanced' استفاده کنید.
  3. ذخیره‌سازی نادرست مدل با Pickle: به‌جای Pickle استاندارد پایتون، برای مدل‌های حاوی آرایه‌های بزرگ NumPy از joblib استفاده کنید تا حجم فایل کاهش یافته و سرعت بارگذاری افزایش یابد.

پرسش‌های متداول

تفاوت fit و fit_transform در سایکیت‌لرن چیست؟

متد fit پارامترهای آماری داده (مثل میانگین و انحراف معیار) را محاسبه و ذخیره می‌کند. متد fit_transform این پارامترها را محاسبه کرده و بلافاصله داده را تغییر می‌دهد.

آیا Scikit-Learn برای یادگیری عمیق (Deep Learning) مناسب است؟

خیر. سایکیت‌لرن برای الگوریتم‌های یادگیری ماشین کلاسیک طراحی شده است. برای شبکه‌های عصبی عمیق باید از TensorFlow یا PyTorch استفاده کنید.

چگونه مدل آموزش‌دیده را ذخیره کرده و در تولید استفاده کنیم؟

می‌توانید با دستور joblib.dump(pipeline, 'model.pkl') تمام خط‌لوله را ذخیره کنید و با joblib.load() آن را در برنامه اصلی اجرا نمایید.

آیا Scikit-Learn داده‌های متنی را مستقیماً ورودی می‌پذیرد؟

خیر. متن‌ها باید ابتدا با استفاده از کلاس‌هایی مانند CountVectorizer یا TfidfVectorizer به ماتریس‌های عددی تبدیل شوند.

عیب‌یابی سریع و رفع خطاهای رایج

خطای ValueError: Expected 2D array, got 1D array instead

علت: داده ورودی شما فقط یک ویژگی (Single Feature) دارد اما سایکیت‌لرن ماتریس دوبعدی می‌خواهد.
راه‌حل: فرم آرایه را تغییر دهید: X = X.reshape(-1, 1) یا X = df[['feature']].

خطای NotFittedError: This StandardScaler instance is not fitted yet

علت: قبل از صدا زدن متد fit، متد transform یا predict را اجرا کرده‌اید.
راه‌حل: مطمئن شوید ابتدا scaler.fit(X_train) اجرا شده باشد.

خطای ValueError: Input contains NaN, infinity or a value too large

علت: داده‌های شما حاوی خانه خالی یا مقادیر بی‌نهایت است.
راه‌حل: قبل از دادن داده به مدل، از SimpleImputer درون Pipeline استفاده کنید.

سوالات متداول

کتابخانه Scikit-Learn چیست و چه کاربردی دارد؟

سایکیت‌لرن یک کتابخانه متن‌باز پایتون برای یادگیری ماشین است که ابزارهای استانداردی برای پیش‌پردازش، طبقه‌بندی، رگرسیون و خوشه‌بندی ارائه می‌دهد.

چرا باید در پیش‌پردازش داده‌ها از Pipeline استفاده کنیم؟

استفاده از Pipeline باعث یکپارچه‌سازی مراحل تمیزکاری داده و مدل‌سازی شده و از نشت اطلاعات داده‌های آزمون به داده‌های آموزش (Data Leakage) جلوگیری می‌کند.

تفاوت StandardScaler و RobustScaler چیست؟

ابزار StandardScaler بر پایه میانگین و انحراف معیار عمل می‌کند و به داده‌های پرت حساس است، در حالی که RobustScaler بر پایه میانه و چارک‌ها بوده و در برابر داده‌های پرت مقاوم است.

چگونه هایپرپارامترهای مدل را در سایکیت‌لرن تنظیم کنیم؟

با استفاده از ابزار GridSearchCV می‌توانید ترکیب‌های مختلف پارامترها را به همراه اعتبارسنجی متقاطع (Cross-Validation) بررسی کرده و بهترین ترکیب را انتخاب نمایید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *