آیا این اشتباهات مدل سازی طبقه بندی را مرتکب می شوید؟


مقدمه

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

مدل سازی طبقه بندی

بررسی کنید

  • یک مدل طبقه بندی بسازید: یک مدل طبقه بندی جامد با راهنمایی گام به گام بسازید.
  • اشتباهات رایج را شناسایی کنید: مشکلات رایج در مدل سازی طبقه بندی را بیابید و از آن اجتناب کنید.
  • تنظیم مجدد را درک کنید: بیش از حد مناسب را درک کنید و یاد بگیرید که چگونه از آن در مدل های خود جلوگیری کنید.
  • مهارت های ساخت مدل را بهبود بخشید: مهارت های ساخت مدل خود را با بهترین شیوه ها و تکنیک های پیشرفته بهبود بخشید.

مدل سازی طبقه بندی: یک مرور کلی

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

ساخت یک مدل طبقه بندی اولیه

ما ساخت یک مدل طبقه بندی پایه را با استفاده از مجموعه داده Date-Fruit از Kaggle نشان خواهیم داد. درباره مجموعه داده: متغیر هدف شامل هفت نوع میوه خرما است: Barhee، Deglet Nour، Sukkary، Rotab Mozafati، Ruthana، Safawi و Sagai. مجموعه داده شامل 898 تصویر از هفت رقم مختلف میوه خرما است و 34 ویژگی با استفاده از تکنیک های پردازش تصویر استخراج شده است. هدف این است که این میوه ها را بر اساس ویژگی های آنها طبقه بندی کنیم.

1. آماده سازی داده ها

import pandas as pd

   from sklearn.model_selection import train_test_split

   from sklearn.preprocessing import StandardScaler

   # Load the dataset

   data = pd.read_excel('/content/Date_Fruit_Datasets.xlsx')

   # Splitting the data into features and target

   X = data.drop('Class', axis=1)

   y = data['Class']

   # Splitting the dataset into training and testing sets

   X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

   # Feature scaling

   scaler = StandardScaler()

   X_train = scaler.fit_transform(X_train)

   X_test = scaler.transform(X_test)
1. آماده سازی داده ها
1. آماده سازی داده ها

2. رگرسیون لجستیک

from sklearn.linear_model import LogisticRegression

   from sklearn.metrics import accuracy_score

   # Logistic Regression Model

   log_reg = LogisticRegression()

   log_reg.fit(X_train, y_train)

   # Predictions and Evaluation

   y_train_pred = log_reg.predict(X_train)

   y_test_pred = log_reg.predict(X_test)

   # Accuracy

   train_acc = accuracy_score(y_train, y_train_pred)

   test_acc = accuracy_score(y_test, y_test_pred)

   print(f'Logistic Regression - Train Accuracy: {train_acc}, Test Accuracy: {test_acc}')

نتایج:

- Logistic Regression - Train Accuracy: 0.9538

- Test Accuracy: 0.9222

همچنین بخوانید: مقدمه ای بر رگرسیون لجستیک

3. ماشین بردار پشتیبانی (SVM)

from sklearn.svm import SVC

   from sklearn.metrics import accuracy_score

   # SVM

   svm = SVC(kernel="linear", probability=True)

   svm.fit(X_train, y_train)

   # Predictions and Evaluation

   y_train_pred = svm.predict(X_train)

   y_test_pred = svm.predict(X_test)

   train_accuracy = accuracy_score(y_train, y_train_pred)

   test_accuracy = accuracy_score(y_test, y_test_pred)

   print(f"SVM - Train Accuracy: {train_accuracy}, Test Accuracy: {test_accuracy}")

نتایج:

- SVM - Train Accuracy: 0.9602

- Test Accuracy: 0.9074

همچنین بخوانید: راهنمای پشتیبانی از الگوریتم ماشین برداری (SVM).

4. درخت تصمیم

from sklearn.tree import DecisionTreeClassifier

   from sklearn.metrics import accuracy_score

   # Decision Tree

   tree = DecisionTreeClassifier(random_state=42)

   tree.fit(X_train, y_train)

   # Predictions and Evaluation

   y_train_pred = tree.predict(X_train)

   y_test_pred = tree.predict(X_test)

   train_accuracy = accuracy_score(y_train, y_train_pred)

   test_accuracy = accuracy_score(y_test, y_test_pred)

   print(f"Decision Tree - Train Accuracy: {train_accuracy}, Test Accuracy: {test_accuracy}")

نتایج:

- Decision Tree - Train Accuracy: 1.0000

- Test Accuracy: 0.8222

5. شبکه های عصبی با TensorFlow

import numpy as np

   from sklearn.preprocessing import LabelEncoder, StandardScaler

   from sklearn.model_selection import train_test_split

   from tensorflow.keras import models, layers

   from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint

   # Label encode the target classes

   label_encoder = LabelEncoder()

   y_encoded = label_encoder.fit_transform(y)

   # Train-test split

   X_train, X_test, y_train, y_test = train_test_split(X, y_encoded, test_size=0.2, random_state=42)

   # Feature scaling

   scaler = StandardScaler()

   X_train = scaler.fit_transform(X_train)

   X_test = scaler.transform(X_test)

   # Neural Network

   model = models.Sequential([

     layers.Dense(64, activation='relu', input_shape=(X_train.shape[1],)),

     layers.Dense(32, activation='relu'),

     layers.Dense(len(np.unique(y_encoded)), activation='softmax')  # Ensure output layer size matches number of classes

   ])

   model.compile(optimizer="adam", loss="sparse_categorical_crossentropy", metrics=['accuracy'])

   # Callbacks

   early_stopping = EarlyStopping(monitor="val_loss", patience=10, restore_best_weights=True)

   model_checkpoint = ModelCheckpoint('best_model.keras', monitor="val_loss", save_best_only=True)

   # Train the model

   history = model.fit(X_train, y_train, epochs=100, batch_size=32, validation_data=(X_test, y_test),

                      callbacks=[early_stopping, model_checkpoint], verbose=1)

   # Evaluate the model

   train_loss, train_accuracy = model.evaluate(X_train, y_train, verbose=0)

   test_loss, test_accuracy = model.evaluate(X_test, y_test, verbose=0)

   print(f"Neural Network - Train Accuracy: {train_accuracy}, Test Accuracy: {test_accuracy}")

نتایج:

- Neural Network - Train Accuracy: 0.9234

- Test Accuracy: 0.9278

همچنین بخوانید: شبکه عصبی خود را با استفاده از تنسورفلو بسازید

شناسایی خطاها

مدل‌های طبقه‌بندی می‌توانند با چالش‌های متعددی روبرو شوند که می‌تواند اثربخشی آنها را به خطر بیندازد. شناسایی و رسیدگی به این مسائل به منظور ساخت مدل های قابل اعتماد ضروری است. در زیر برخی از جنبه های حیاتی وجود دارد که باید در نظر داشت:

  1. بیش از حد و کم تجهیزات:
    • اعتبار سنجی متقابل: از وابستگی صرفاً به یک تقسیم آزمایشی-قطار اجتناب کنید. از اعتبارسنجی متقاطع k-fold برای ارزیابی بهتر عملکرد مدل خود با آزمایش آن بر روی بخش های مختلف داده استفاده کنید.
    • منظم‌سازی: مدل‌های بسیار پیچیده می‌توانند با گرفتن نویز در داده‌ها بیش از حد مجاز شوند. روش های منظم سازی مانند هرس یا منظم سازی باید برای جریمه کردن پیچیدگی استفاده شود.
    • بهینه سازی هایپرپارامتر: فراپارامترها را عمیقا مطالعه و تنظیم کنید (مثلاً از طریق شبکه یا جستجوی تصادفی) تا تعصب و واریانس را متعادل کنید.
  2. بسته فنی:
    • تجمیع مدل: روش‌های مجموعه‌ای مانند جنگل‌های تصادفی یا تقویت گرادیان، پیش‌بینی‌های چند مدل را ترکیب می‌کنند، که اغلب منجر به تعمیم بهتر می‌شود. این تکنیک‌ها می‌توانند الگوهای پیچیده در داده‌ها را ثبت کنند و در عین حال خطر بیش از حد برازش را با میانگین‌گیری خطاهای مدل فردی کاهش دهند.
  3. عدم تعادل طبقاتی:
    • کلاس های نامتعادل: در بسیاری از موارد، ممکن است یک کلاس کمتر از سایرین باشد که منجر به پیش بینی های مغرضانه می شود. روش هایی مانند Oversampling، Undersampling یا SMOTE باید با توجه به مشکل استفاده شود.
  4. نشت داده ها:
    • نشت ناخواسته: نشت داده زمانی رخ می دهد که اطلاعات خارج از مجموعه آموزشی بر مدل تأثیر بگذارد و باعث افزایش معیارهای عملکرد شود. بسیار مهم است که اطمینان حاصل شود که داده های آزمون در طول آموزش کاملاً نامرئی می مانند و توابع حاصل از متغیر هدف به دقت دستکاری می شوند.
from sklearn.model_selection import GridSearchCV

   # Implementing Grid Search for Logistic Regression

   param_grid = {'C': [0.1, 1, 10, 100], 'solver': ['lbfgs']}

   grid_search = GridSearchCV(LogisticRegression(multi_class="multinomial", max_iter=1000), param_grid, cv=5)

   grid_search.fit(X_train, y_train)

   # Best model

   best_model = grid_search.best_estimator_

   # Evaluate on test set

   test_accuracy = best_model.score(X_test, y_test)

   print(f"Best Logistic Regression - Test Accuracy: {test_accuracy}")

نتایج:

- Best Logistic Regression - Test Accuracy: 0.9611

شبکه های عصبی با TensorFlow

بیایید با تمرکز بر تکنیک هایی برای به حداقل رساندن تنظیم مجدد و بهبود تعمیم، بر بهبود مدل شبکه عصبی قبلی خود تمرکز کنیم.

توقف زودهنگام و بررسی مدل

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

مدل Checkpointing مدلی را حفظ می‌کند که در مجموعه اعتبارسنجی در طول آموزش بهترین عملکرد را دارد، و تضمین می‌کند که نسخه بهینه مدل حفظ می‌شود حتی اگر آموزش بعدی منجر به تنظیم مجدد شود.

import numpy as np

from sklearn.preprocessing import LabelEncoder, StandardScaler

from sklearn.model_selection import train_test_split

from tensorflow.keras import models, layers

from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint

# Label encode the target classes

label_encoder = LabelEncoder()

y_encoded = label_encoder.fit_transform(y)

# Train-test split

X_train, X_test, y_train, y_test = train_test_split(X, y_encoded, test_size=0.2, random_state=42)

# Feature scaling

scaler = StandardScaler()

X_train = scaler.fit_transform(X_train)

X_test = scaler.transform(X_test)

# Neural Network

model = models.Sequential([

  layers.Dense(64, activation='relu', input_shape=(X_train.shape[1],)),

  layers.Dense(32, activation='relu'),

  layers.Dense(len(np.unique(y_encoded)), activation='softmax')  # Ensure output layer size matches number of classes

])

model.compile(optimizer="adam", loss="sparse_categorical_crossentropy", metrics=['accuracy'])

# Callbacks

early_stopping = EarlyStopping(monitor="val_loss", patience=10, restore_best_weights=True)

model_checkpoint = ModelCheckpoint('best_model.keras', monitor="val_loss", save_best_only=True)

# Train the model

history = model.fit(X_train, y_train, epochs=100, batch_size=32, validation_data=(X_test, y_test),

                   callbacks=[early_stopping, model_checkpoint], verbose=1)

# Evaluate the model

train_loss, train_accuracy = model.evaluate(X_train, y_train, verbose=0)

test_loss, test_accuracy = model.evaluate(X_test, y_test, verbose=0)

print(f"Neural Network - Train Accuracy: {train_accuracy}, Test Accuracy: {test_accuracy}")
شبکه های عصبی با TensorFlow

درک معنای معیارهای مختلف

  1. دقت: اگرچه مهم است، اما ممکن است دقت عملکرد مدل را به طور کامل نشان ندهد، به ویژه هنگامی که با توزیع های کلاس نامتعادل سروکار داریم.
  2. یک ضرر: تابع ضرر ارزیابی می کند که مقادیر پیش بینی شده چقدر با برچسب های واقعی مطابقت دارند. مقادیر تلفات کوچکتر نشان دهنده دقت بالاتر است.
  3. دقت، فراخوان و امتیاز F1: دقت صحت پیش‌بینی‌های مثبت را ارزیابی می‌کند، یادآوری موفقیت مدل را در شناسایی همه موارد مثبت اندازه‌گیری می‌کند، و امتیاز F1 دقت و یادآوری را متعادل می‌کند.
  4. ROC-AUC: متریک ROC-AUC ظرفیت مدل را برای تمایز بین کلاس ها، بدون توجه به تنظیم آستانه، کمیت می کند.
from sklearn.metrics import classification_report, roc_auc_score

# Predictions

y_test_pred_proba = model.predict(X_test)

y_test_pred = np.argmax(y_test_pred_proba, axis=1)

# Classification report

print(classification_report(y_test, y_test_pred))

# ROC-AUC

roc_auc = roc_auc_score(y_test, y_test_pred_proba, multi_class="ovr")

print(f'ROC-AUC Score: {roc_auc}')
خارج شوید

تجسم عملکرد مدل

عملکرد مدل در طول آموزش را می‌توان با ترسیم منحنی‌های یادگیری از دست دادن و دقت نشان داد که نشان می‌دهد مدل بیش از حد برازش است یا کمتر. ما از توقف اولیه برای جلوگیری از تنظیم مجدد استفاده کردیم و این به تعمیم داده‌های جدید کمک می‌کند.

import matplotlib.pyplot as plt

# Plot training & validation accuracy values

plt.figure(figsize=(14, 5))

plt.subplot(1, 2, 1)

plt.plot(history.history['accuracy'])

plt.plot(history.history['val_accuracy'])

plt.title('Model Accuracy')

plt.xlabel('Epoch')

plt.ylabel('Accuracy')

plt.legend(['Train', 'Validation'], loc="upper left")

# Plot training & validation loss values

plt.subplot(1, 2, 2)

plt.plot(history.history['loss'])

plt.plot(history.history['val_loss'])

plt.title('Model Loss')

plt.xlabel('Epoch')

plt.ylabel('Loss')

plt.legend(['Train', 'Validation'], loc="upper left")

plt.show()
تجسم عملکرد مدل

نتیجه گیری

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

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

Q1. چرا ارزیابی مدل یادگیری ماشینی فراتر از دقت مهم است؟

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

Q2. هنگام ساخت مدل های طبقه بندی چه اشتباهاتی رایج است که باید از آنها اجتناب کرد؟

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

Q3. چگونه می توانم از تنظیم مجدد مدل طبقه بندی خود جلوگیری کنم؟

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

Q4. برای ارزیابی عملکرد مدل طبقه بندی خود باید از چه معیارهایی استفاده کنم؟

پاسخ دهید علاوه بر دقت، معیارهایی مانند دقت، یادآوری، امتیاز F1، ROC-AUC و ضرر را در نظر بگیرید. این معیارها درک دقیق تری از عملکرد مدل به خصوص در مدیریت داده های نامتعادل و پیش بینی های دقیق ارائه می دهند.

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