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

این راهنما سه سؤال را دنبال می‌کند: داده چگونه جدا شود، کدام معیار با هزینهٔ خطا سازگار است و چه چیزهایی نتیجه را خوش‌بینانه می‌کنند؟ مثال اصلی، تشخیص درخواست‌های نیازمند بررسی فوری است. تعداد این درخواست‌ها کم است و از دست‌دادن آن‌ها با هشدار اشتباه هزینهٔ یکسان ندارد. همین تفاوت نشان می‌دهد چرا یک معیار عمومی نمی‌تواند برای همهٔ پروژه‌ها پاسخ کافی باشد.

اول تعریف کنید چه چیزی باید تعمیم پیدا کند

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

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

آموزش، اعتبارسنجی و آزمون سه نقش دارند

آموزش برای برازش پارامترهاست. اعتبارسنجی به انتخاب الگوریتم، تنظیمات و آستانه کمک می‌کند. آزمون نهایی برای برآورد مستقل عملکرد پس از تثبیت تصمیم‌ها نگه داشته می‌شود. اگر هر بار نتیجهٔ آزمون را ببینید و گزینه‌ای را تغییر دهید، عملاً از آن برای توسعه استفاده کرده‌اید. نام فایل test این وابستگی را از بین نمی‌برد و استقلال را تضمین نمی‌کند.

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

نشت داده در پیش‌پردازش چگونه رخ می‌دهد؟

اگر میانگین، انحراف معیار، جایگزین مقدار خالی یا واژگان متن را روی کل داده محاسبه کنید، آزمون بر تبدیل آموزش اثر گذاشته است. انتخاب ویژگی با نگاه به برچسب کل داده نیز نمونهٔ دیگری است. این اثر ممکن است ظریف باشد و در همهٔ مسئله‌ها جهش بزرگی نسازد، اما روش ارزیابی را مخدوش می‌کند. کوچک‌بودن اثر احتمالی، دلیل حذف مرز آموزش نیست.

Pipeline کمک می‌کند تبدیل و مدل در یک فرایند قرار گیرند. در اعتبارسنجی متقاطع، کل Pipeline باید داخل هر تکرار برازش شود. اگر ابتدا داده را استاندارد و بعد cross-validation اجرا کنید، بخشی از مرز را پیشاپیش شکسته‌اید. البته Pipeline جلوی ویژگی افشاگر، نمونهٔ تکراری یا تقسیم زمانی غلط را نمی‌گیرد. ابزار مفید است، اما جای شناخت داده و طراحی آزمایش را پر نمی‌کند.

نمونهٔ تکراری و گروه‌های وابسته

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

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

Accuracy چه زمانی گمراه‌کننده است؟

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

ماتریس درهم‌ریختگی تعداد مثبت درست، منفی درست، مثبت کاذب و منفی کاذب را نشان می‌دهد. این چهار مقدار امکان وصل‌کردن خطا به هزینه را فراهم می‌کنند. برای مخاطب عملیاتی، توضیح «چند درخواست فوری از دست رفت» اغلب از یک درصد کلی مفیدتر است. جهت مثبت را صریح تعریف کنید؛ تغییر کلاس مثبت می‌تواند معنای Precision و Recall را عوض کند.

Precision، Recall و F1 را با هزینه بخوانید

Precision می‌گوید از مواردی که مثبت اعلام شدند، چه سهمی واقعاً مثبت بودند. Recall می‌گوید از مثبت‌های واقعی، چه سهمی پیدا شدند. اگر هشدار اشتباه هزینهٔ بررسی زیادی دارد، Precision اهمیت پیدا می‌کند. اگر ازدست‌دادن مورد حساس خطرناک است، Recall مهم‌تر می‌شود. هیچ‌کدام به‌تنهایی نمایندهٔ همهٔ نیازها نیست و انتخاب باید با ظرفیت و مسئولیت استفاده‌کننده هماهنگ باشد.

F1 میانگین هارمونیک Precision و Recall است و وقتی هر دو مهم‌اند خلاصه‌ای مفید می‌سازد. اما هزینه‌های واقعی را مستقیم مدل نمی‌کند و منفی‌های درست را نیز در فرمول خود ندارد. در چندکلاسه، macro و weighted و micro رفتار متفاوت دارند. macro به هر کلاس وزن برابر می‌دهد، در حالی که weighted از تعداد نمونه اثر می‌گیرد. نوع میانگین را همیشه کنار عدد اعلام کنید.

آستانهٔ تصمیم را روی آزمون تنظیم نکنید

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

امتیاز بالا لزوماً احتمال کالیبره‌شده نیست. اگر خروجی ۰٫۸ را احتمال تفسیر می‌کنید، باید سازگاری آن با فراوانی واقعی را بررسی کنید. تغییر توزیع و نرخ پایه نیز تفسیر را عوض می‌کند. نمودارهای ROC و Precision-Recall ابزارهای مکمل‌اند؛ در دادهٔ نامتوازن، بررسی منحنی Precision-Recall اغلب مفید است، اما باز هم باید تعدادها و هدف تصمیم را بدانید.

اعتبارسنجی متقاطع با Pipeline

در K-fold، آموزش به چند بخش تقسیم و هر بار یک بخش برای سنجش کنار گذاشته می‌شود. این کار می‌تواند نوسان ناشی از یک تقسیم را بهتر نشان دهد، ولی نتیجهٔ بخش‌ها مستقل کامل نیست. برای دادهٔ دسته‌ای با استقلال نمونه‌ها، StratifiedKFold نسبت کلاس‌ها را تقریبی حفظ می‌کند. برای زمان و گروه باید splitter متناسب انتخاب شود؛ عوض‌کردن اسم تابع به‌تنهایی کافی نیست.

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import StratifiedKFold, cross_validate
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression

X, y = load_breast_cancer(return_X_y=True)
pipeline = make_pipeline(StandardScaler(), LogisticRegression(max_iter=2000))
folds = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
scores = cross_validate(pipeline, X, y, cv=folds, scoring=["accuracy", "f1_macro"])
print(scores["test_f1_macro"].mean())
print(scores["test_f1_macro"].std())

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

معیارهای رگرسیون را با واحد هدف توضیح دهید

MAE میانگین قدرمطلق خطاست و در واحد هدف بیان می‌شود. RMSE به خطاهای بزرگ حساس‌تر است. R² میزان بهبود نسبت به مبنای مشخصی را خلاصه می‌کند و حتی می‌تواند منفی شود. هیچ‌کدام به‌تنهایی کافی نیستند. خطای صد واحد برای پیش‌بینی مصرف روزانه شاید قابل‌قبول باشد و برای کاربرد دیگری نه؛ معیار باید با مقیاس و هزینه تفسیر شود.

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

گزارش قابل‌اعتماد چه بخش‌هایی دارد؟

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

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

چک‌لیست کشف نتیجهٔ غیرعادی خوب

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

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

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

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

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

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

آیا cross-validation نشت داده را خودکار حذف می‌کند؟

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

آیا بهترین مدل همان بالاترین F1 است؟

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

منابع و مطالعهٔ بیشتر

برای بررسی جزئیات و ادامهٔ مطالعه؛ متن این راهنما مستقلاً برای نوونتیکس نوشته شده است.