مقدمه
ارزیابی یک مدل یادگیری ماشینی تنها آخرین مرحله نیست، بلکه سنگ اصلی موفقیت است. تصور کنید که یک مدل پیشرفته بسازید که با دقت بالایی خیره شود و متوجه شوید که تحت فشار دنیای واقعی از هم می پاشد. ارزیابی فراتر از علامت زدن شاخص هاست. این اطمینان حاصل می شود که مدل شما به طور مداوم در طبیعت کار می کند. در این مقاله، ما به دامهای رایجی میپردازیم که میتوانند حتی امیدوارکنندهترین مدلهای طبقهبندی را از مسیر خارج کنند و بهترین روشهایی را که میتوانند مدل شما را از خوب به عالی برسانند، آشکار میکنیم. اجازه دهید وظایف مدلسازی طبقهبندی شما را به راهحلهای قابل اعتماد و کارآمد تبدیل کنیم.
بررسی کنید
- یک مدل طبقه بندی بسازید: یک مدل طبقه بندی جامد با راهنمایی گام به گام بسازید.
- اشتباهات رایج را شناسایی کنید: مشکلات رایج در مدل سازی طبقه بندی را بیابید و از آن اجتناب کنید.
- تنظیم مجدد را درک کنید: بیش از حد مناسب را درک کنید و یاد بگیرید که چگونه از آن در مدل های خود جلوگیری کنید.
- مهارت های ساخت مدل را بهبود بخشید: مهارت های ساخت مدل خود را با بهترین شیوه ها و تکنیک های پیشرفته بهبود بخشید.
مدل سازی طبقه بندی: یک مرور کلی
در مسئله طبقه بندی، سعی می کنیم مدلی بسازیم که برچسب های متغیر هدف را با استفاده از متغیرهای مستقل پیش بینی کند. از آنجایی که ما با داده های هدف برچسب دار سروکار داریم، به الگوریتم های یادگیری ماشینی نظارت شده مانند رگرسیون لجستیک، 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)
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
همچنین بخوانید: شبکه عصبی خود را با استفاده از تنسورفلو بسازید
شناسایی خطاها
مدلهای طبقهبندی میتوانند با چالشهای متعددی روبرو شوند که میتواند اثربخشی آنها را به خطر بیندازد. شناسایی و رسیدگی به این مسائل به منظور ساخت مدل های قابل اعتماد ضروری است. در زیر برخی از جنبه های حیاتی وجود دارد که باید در نظر داشت:
- بیش از حد و کم تجهیزات:
- اعتبار سنجی متقابل: از وابستگی صرفاً به یک تقسیم آزمایشی-قطار اجتناب کنید. از اعتبارسنجی متقاطع k-fold برای ارزیابی بهتر عملکرد مدل خود با آزمایش آن بر روی بخش های مختلف داده استفاده کنید.
- منظمسازی: مدلهای بسیار پیچیده میتوانند با گرفتن نویز در دادهها بیش از حد مجاز شوند. روش های منظم سازی مانند هرس یا منظم سازی باید برای جریمه کردن پیچیدگی استفاده شود.
- بهینه سازی هایپرپارامتر: فراپارامترها را عمیقا مطالعه و تنظیم کنید (مثلاً از طریق شبکه یا جستجوی تصادفی) تا تعصب و واریانس را متعادل کنید.
- بسته فنی:
- تجمیع مدل: روشهای مجموعهای مانند جنگلهای تصادفی یا تقویت گرادیان، پیشبینیهای چند مدل را ترکیب میکنند، که اغلب منجر به تعمیم بهتر میشود. این تکنیکها میتوانند الگوهای پیچیده در دادهها را ثبت کنند و در عین حال خطر بیش از حد برازش را با میانگینگیری خطاهای مدل فردی کاهش دهند.
- عدم تعادل طبقاتی:
- کلاس های نامتعادل: در بسیاری از موارد، ممکن است یک کلاس کمتر از سایرین باشد که منجر به پیش بینی های مغرضانه می شود. روش هایی مانند Oversampling، Undersampling یا SMOTE باید با توجه به مشکل استفاده شود.
- نشت داده ها:
- نشت ناخواسته: نشت داده زمانی رخ می دهد که اطلاعات خارج از مجموعه آموزشی بر مدل تأثیر بگذارد و باعث افزایش معیارهای عملکرد شود. بسیار مهم است که اطمینان حاصل شود که داده های آزمون در طول آموزش کاملاً نامرئی می مانند و توابع حاصل از متغیر هدف به دقت دستکاری می شوند.
نمونه ای از رگرسیون لجستیک پیشرفته با استفاده از جستجوی شبکه
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}")
درک معنای معیارهای مختلف
- دقت: اگرچه مهم است، اما ممکن است دقت عملکرد مدل را به طور کامل نشان ندهد، به ویژه هنگامی که با توزیع های کلاس نامتعادل سروکار داریم.
- یک ضرر: تابع ضرر ارزیابی می کند که مقادیر پیش بینی شده چقدر با برچسب های واقعی مطابقت دارند. مقادیر تلفات کوچکتر نشان دهنده دقت بالاتر است.
- دقت، فراخوان و امتیاز F1: دقت صحت پیشبینیهای مثبت را ارزیابی میکند، یادآوری موفقیت مدل را در شناسایی همه موارد مثبت اندازهگیری میکند، و امتیاز F1 دقت و یادآوری را متعادل میکند.
- 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()
نتیجه گیری
ارزیابی دقیق برای جلوگیری از مشکلاتی مانند بیش از حد و عدم تناسب بسیار مهم است. ساخت مدلهای طبقهبندی مؤثر بیش از انتخاب و آموزش الگوریتم مناسب را شامل میشود. سازگاری و قابلیت اطمینان مدل را می توان با استفاده از روش های مجموعه، منظم سازی، تنظیم هایپرپارامتر و روش های اعتبار سنجی متقابل بهبود بخشید. اگرچه مجموعه دادههای کوچک ما ممکن است دچار تراز مجدد قابل توجهی نشده باشد، استفاده از این روشها تضمین میکند که مدلها قوی و دقیق هستند و منجر به تصمیمگیری بهتر در کاربردهای عملی میشود.
سوالات متداول
پاسخ دهید اگرچه دقت یک معیار کلیدی است، اما همیشه تصویر کاملی را ارائه نمی دهد، به خصوص با مجموعه داده های نامتعادل. ارزیابی سایر جنبهها مانند سازگاری، استحکام و تعمیمپذیری، تضمین میکند که مدل در انواع سناریوها، نه فقط در شرایط آزمایش کنترلشده، به خوبی عمل میکند.
پاسخ دهید خطاهای رایج عبارتند از برازش بیش از حد، عدم تناسب، نشت داده، نادیده گرفتن عدم تعادل کلاس، و عدم اعتبارسنجی صحیح مدل. این مسائل می تواند منجر به مدل هایی شود که در تست عملکرد خوبی دارند اما در برنامه های کاربردی دنیای واقعی شکست می خورند.
پاسخ دهید برازش بیش از حد را می توان با روش های اعتبار سنجی متقاطع، منظم، توقف زودهنگام و روش های گروهی کاهش داد. این رویکردها به تعادل پیچیدگی مدل کمک می کند و اطمینان حاصل می کند که به خوبی به داده های جدید تعمیم می یابد.
پاسخ دهید علاوه بر دقت، معیارهایی مانند دقت، یادآوری، امتیاز F1، ROC-AUC و ضرر را در نظر بگیرید. این معیارها درک دقیق تری از عملکرد مدل به خصوص در مدیریت داده های نامتعادل و پیش بینی های دقیق ارائه می دهند.