آمار , داده کاوی 1079 بازدید

امروزه به منظور انتخاب مدل با کمترین متغیرها و جلوگیری از بیش‌برازش یا کم‌برازش از ابزاری به نام «اعتبار سنجی متقابل» (Cross Validation) استفاده می‌شود. به این ترتیب مدلی مناسب است که توسط اعتبار سنجی متقابل، خطا یا واریانس آن برآورد شده باشد و دارای کمترین خطا نسبت به دیگر مدل‌های مشابه باشد. در این نوشتار با استفاده از کتابخانه‌های موجود در پایتون به بررسی و پیاده‌سازی اعتبار سنجی متقابل خواهیم پرداخت. در این بین از کتابخانه‌های pandas ،sklearn ،matplotlib استفاده خواهیم کرد و در پی محاسبه خطای مدل با پایتون خواهیم بود.

برای آشنایی بیشتر با نحوه عملکرد اعتبار سنجی متقابل، مطلب اعتبار سنجی متقابل (Cross Validation) — به زبان ساده را مطالعه کنید. همچنین خواندن نوشتار بیش برازش (Overfitting)، کم برازش (Underfitting) و برازش مناسب — مفهوم و شناسایی نیز خالی از لطف نیست.

محاسبه خطای مدل در پایتون

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

دو مفهوم و ابزار مهم در «علم داده» (Data Science) به منظور جلوگیری یا کاهش اثرات بیش‌برازش وجود دارد. اولین ابزار براساس تفکیک داده‌ها به دو بخش آموزشی و آزمایشی (Train/Test Split) عمل می‌کند و دومین روش نیز «اعتبار سنجی متقابل» (Cross Validation) نامیده می‌شود.

محاسبه خطای مدل به روش تفکیک آموزشی/آزمایشی داده‌ها

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

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

محاسبه خطای مدل با پایتون

در این قسمت با استفاده پایتون و کتابخانه Scikit-Learn و روش train_test_split این روش را به کار می‌بریم. ابتدا کتابخانه‌ها را نصب و راه‌اندازی می‌کنیم و سپس به معرفی این کتابخانه‌ها می‌پردازیم.

کتابخانه Pandas: از این کتابخانه به منظور فراخوانی فایل‌های داده و تحلیل آن‌ها استفاده خواهیم کرد.

کتابخانه Sklearn: در این متن، برای ایجاد رگرسیون و مدل خطی از کتابخانه Sklearn و زیر کتابخانه model_selection استفاده شده است. همچنین با استفاده از datasets به مجموعه‌ای از داده‌های موجود در این کتابخانه دسترسی خواهیم داشت. با انتخاب train_test_split نیز به امکان تفکیک داده‌ها به دو بخش آموزشی و آزمایشی بوجود می‌آید.

کتابخانه Matplotlib: از کتابخانه Matplotlib دستور $$pyplot$$ را به منظور ترسیم نمودارهای مربوط به داده‌ها به کار گرفته‌ایم.

حال براساس «مجموعه داده‌ دیابت» (diabetes dataset) دست به ایجاد مدل می‌زنیم. ولی باید ابتدا داده‌ها را در یک چارچوب داده، قرار داده و متغیرها را نام‌گذاری کنیم. این کار در کد زیر صورت گرفته است.

به این ترتیب مجموعه داده به نام df ساخته شده و متغیر y نیز به عنوان متغیر پاسخ یا وابسته (Dependent Variable) از ستون target داده‌های diabetes معرفی شده است.

حال با استفاده از تابع train_test_split عمل تفکیک داده‌ها را انجام می‌دهیم. در اینجا ۲۰٪ داده‌ها را برای بخش آزمایش در نظر گرفته‌ایم. معمولا نسبت داده‌های آموزشی به آزمایشی به صورت ۸۰ به ۲۰ یا ۳۰ به ۷۰ در نظر گرفته می‌شود. یعنی برای مثال ۸۰ درصد داده‌ها برای مدل‌سازی و ۲۰ درصد باقی‌مانده برای برآورد خطای مدل به کار می‌رود.

خروجی اجرای این دستورات در دو سطر آخر دیده می‌شود. بنابراین 353 مشاهده ( با ۱۰ متغیر مستقل) به عنوان متغیر X_train و به همین تعداد نیز به عنوان متغیر وابسته در Y_train ثبت می‌شود. همچنین ۸۹ مشاهده نیز برای بخش آزمایش در نظر گرفته شده است.

به کمک دستورات زیر مدل مناسب برای داده‌های آموزشی را تشکیل می‌دهیم. همانطور که مشخص است متغیر X_train به عنوان متغیر مستقل و متغیر y_train به عنوان متغیر وابسته در مدل نقش دارند. نتیجه برآورد مدل در متغیر model و مقدارهای پیش‌بینی شده برای مشاهدات توسط مدل نیز در متغیر predictions ثبت شده‌اند.

در ادامه مقدارهای پیش بینی شده برای پنچ مشاهده اول را می‌بینید.

نکته: اندیس‌ها در پایتون از صفر شروع می‌شود. همچنین اندیس دوم یعنی 5 نیز در دستور $$predictions[0:5]$$ به این معنی است که مشاهدات باید تا اندیس قبل از ۵ نمایش داده شوند.

حال به بررسی مدل بوسیله رسم و مقایسه مقدارهای واقعی (True values) و پیش‌بینی شده (Predictions) می‌پردازیم. کد زیر به این منظور تهیه شده است.

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

scatter plot for true and predicted values

برای اندازه‌گیری دقت مدل نیز از تابع model.score استفاده خواهیم کرد. به این ترتیب مشخص است که دقت این مدل حدود ۵۰٪ است.

مقدار Score نشان می‌دهد که استفاده از ده متغیر (age, sex, bmi, map, tc, ldl, hdl, tch, ltg, glu) دارای خطای تقریبا برابر با ۵۰٪ است.

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

محاسبه خطای مدل با استفاده از روش اعتبار سنجی متقابل

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

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

هر چند شیوه‌های مختلفی در اجرای اعتبار سنجی متقابل وجود دارد ولی در اینجا به دو شیوه «k-Fold» و «Leave-One-Out» یا «LOOCV» می‌پردازیم.

اعتبار سنجی متقابل K-Folds

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

همانطور که دیده می‌شود، تصویر زیر عملکرد این روش را به روشنی مشخص می‌کند.

cross validation process

حال در اینجا به یک مثال در این زمینه می‌پردازیم. کد زیر یک بردار ایجاد کرده و عمل تقسیم‌بندی و ایجاد foldها را انجام می‌دهد. تابع اصلی در این کد KFold است.

در این مثال داده‌های آموزشی به دو بخش یا fold تفکیک شده‌اند. در نتیجه تعداد تکرارها نیز برابر با ۲ است. با اجرای دستورات زیر بخش‌های آموزشی و اعتبارسنجی در هر سطر دیده می‌شوند.

اعتبار سنجی متقابل Leave-One-Out

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

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

اگر داده‌های موجود در بخش آموزش زیاد باشند، زمان و هزینه محاسباتی این روش زیاد است. بنابراین در چنین مواقعی از روش K-Fold استفاده می‌شود.

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

همانطور که به یاد دارید داده‌ها مربوط به بیماران دیابتی بود. در اینجا اعتبار سنجی متقابل را با تعداد بخش‌ها Fold=6 انجام می‌دهیم.

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

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

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

cross validation scatter plot

حال برای نشان دادن میزان دقت از معیار $$R^2$$ کمک می‌گیریم. کد زیر به منظور محاسبه این ضریب به نوشته شده است.

اگر مطلب بالا برای شما مفید بوده است و علاقه‌مند به یادگیری بیشتر در این زمینه هستید، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

^^

آرمان ری بد (+)

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

بر اساس رای 2 نفر

آیا این مطلب برای شما مفید بود؟

نظر شما چیست؟

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