« انتخاب مدل، تنظیم هایپرپارامتر ها و ارزیابی »
جمع آوری تمام قطعات مورد نیاز پازل یادگیری ماشین برای حل یک مسئله می تواند یک کار دلهره آور باشد. در این سری از مقالات ، ما در حال پیاده سازی گردش کار یادگیری ماشین با استفاده از مجموعه داده های دنیای واقعی هستیم تا ببینیم چگونه تکنیک های فردی با هم جمع می شوند و ما را در انجام پروژه کمک می کنند.
در اولین پست ، ما داده ها را تمیز و دارای ساختار کردیم ، تجزیه و تحلیل داده های اکتشافی را انجام دادیم ، مجموعه ای از ویژگی ها را برای استفاده در مدل خود ایجاد کردیم و یک مبنا و پایه را ایجاد کردیم تا بتوانیم میزان عملکرد خودمان را اندازه گیری کنیم. حالا در این مقاله ، ما به چگونگی پیاده سازی و مقایسه چندین مدل یادگیری ماشین در زبان برنامه نویسی پایتون ، انجام تنظیم هایپرپارامتر ها برای بهینه سازی و رسیدن به بهترین مدل ، و ارزیابی مدل نهایی به دست آمده در « مجموعه ی آزمون » می پردازیم.
لازم به ذکر است که کد کامل این پروژه در GitHub قرار دارد و نوت بوک دوم مربوط به این مقاله هم موجود است. در استفاده ، اشتراک گذاری و اصلاح کد به هر روشی که دوست دارید آزاد هستید!
ارزیابی مدل و انتخاب مدل
به عنوان یک یادآوری ، ما در حال کار بر روی یک پروژه ی مبتنی بر رگرسیون نظارت شده هستیم :
با استفاده از داده های مربوط به انرژی در ساختمان های شهر نیویورک ، می خواهیم مدلی را تهیه کنیم که بتواند امتیاز انرژی ستاره Energy Star یک ساختمان را پیش بینی کند. تمرکز ما بر روی دقت پیش بینی ها و تفسیر مدل در کنار یکدیگر است.
مدل های یادگیری ماشین بسیاری وجود دارند که شما باید بین آن ها انتخاب کنید و به همین دلیل تصمیم گیری برای این که از کجا شروع به کار کنید می تواند ترسناک و نگران کننده باشد. در حالی که نمودارها و چارت هایی وجود دارند که سعی می کنند به شما کمک کنند که متوجه شوید از کدام الگوریتم استفاده کنید ، من شخصاً ترجیح می دهم چند مورد را امتحان کنم و ببینم کدام یک بهتر عمل می کند! توجه داشته باشید که یادگیری ماشین هنوز زمینه ای است که بیشتر برگرفته از نتایج ناشی از تجربه است و تقریباً غیرممکن است که از قبل بدانید که کدام مدل بهترین عملکرد را در دنیای واقعی خواهد داشت.
به طور کلی ، این ایده ی خوبی است که با استفاده از مدل های ساده و قابل تفسیر مانند رگرسیون خطی شروع کنید ، و اگر عملکرد این مدل ها و بازدهی کافی نبود ، به سمت استفاده از روش های پیچیده تر اما دقیق تر حرکت کنید. نمودار زیر یک نسخه (بسیار غیرعلمی) از« صحت و درستی » در برابر « قابلیت تفسیر » را نشان می دهد :
ما پنج مدل مختلف را ارزیابی می کنیم که طیف گسترده ای را پوشش می دهند :
- رگرسیون خطی
- رگرسیون-K نزدیکترین همسایگان
- رگرسیون جنگلی تصادفی
- رگرسیون تقویت شده گرادیان
- رگرسیون ماشین بردار پشتیبان
در این پست ما بیشتر روی پیاده سازی این روش ها تمرکز خواهیم کرد و کار چندانی با نظریه های پشت آن ها نخواهیم داشت. برای هر کسی که علاقه مند باشد تا در یادگیری پیش زمینه و نظریات اطلاعات خوبی به دست بیاورد، مطالعه ی مقاله های « An Introduction to Statistical Learning » (به صورت از طریق اینترنت در دسترس است) و « یادگیری ماشین Hands-On Machine Learning with Scikit-Learn and TensorFlow » را پیشنهاد می کنیم. هر دوی این مقاله های منابع بسیار خوبی برای توضیح تئوری و نشان دادن چگونگی استفاده موثر از روش ها در R و پایتون هستند.
افزودن مقادیر گم شده
اگر به خاطر داشته باشید در قسمت قبلی ستون هایی را با بیش از ۵۰٪ داده ی گم شده Missing Values ) ) پاکسازی می کردیم ، اما که هنوز هم تعداد کمی از مشاهدات گم شده وجود دارند. توجه داشته باشید که مدل های یادگیری ماشینی نمی توانند با مقادیر غایب مقابله کنند ، بنابراین ما باید جای خالی آن ها را طی فرآیندی پر کنیم ، فرایندی که به عنوان انتساب یا Imputation شناخته می شود.
ابتدا همه داده ها را می خوانیم و به خود یادآوری می کنیم که داده ها به چه فرمی بودند:
import pandas as pd import numpy as np # Read in data into dataframes train_features = pd.read_csv('data/training_features.csv') test_features = pd.read_csv('data/testing_features.csv') train_labels = pd.read_csv('data/training_labels.csv') test_labels = pd.read_csv('data/testing_labels.csv') Training Feature Size: (6622, 64) Testing Feature Size: (2839, 64) Training Labels Size: (6622, 1) Testing Labels Size: (2839, 1)
هر مقداری که در جدول معادل NaN است ، نشان دهنده ی یک مشاهده ی گم شده است. در حالی که چندین روش برای پر کردن داده های از دست رفته وجود دارد ، ما از یک روش نسبتاً ساده برای Imputation استفاده می کنیم. این روش تمام مقادیر گم شده در یک ستون را با مقدار متوسط – یا میانگین – ستون جایگزین می کند.
در کدی که در این قسمت برای شما آوردیم ، یک Imputer در کتابخانه Scikit-Learn را با استراتژی تنظیم شده برای یافتن میانگین ایجاد می کنیم. سپس این object را روی مجموعه داده های آموزش ( با استفاده از imputer.fit ) پیاده سازی میکنیم و آموزش می دهیم و در ادامه از آن برای پر کردن مقادیر گم شده در داده های آموزش و آزمایش training and testing data ( با استفاده از imputer.transform ) استفاده می کنیم. این بدان معناست که مقادیر گم شده در« داده های آزمون » با میانگین میانگین مربوط به « داده های آموزش » پر شده است.
(ما باید برای جلوگیری از مشکل نشت داده های آزمایشی ، لازم است تا جایی که اطلاعات حاصل از مجموعه داده های آزمایش در داده های آموزش پخش می شود را به روشی که به آن اشاره داشتیم پر کنیم و روی آموزش بر روی تمام داده ها تمرکز نداشته باشیم.)
# Create an imputer object with a median filling strategy imputer = Imputer(strategy='median') # Train on the training features imputer.fit(train_features) # Transform both training data and testing data X = imputer.transform(train_features) X_test = imputer.transform(test_features) Missing values in training features: 0 Missing values in testing features: 0
همان طور که می بینید همه ی ویژگی ها اکنون دارای مقادیر واقعی و محدود هستند و نمونه های گم شده ای وجود ندارد.
مقیاس گذاری ویژگی ها
مقیاس گذاری به روند کلی تغییر دامنه ی مربوط به یک ویژگی اشاره دارد. پیاده سازی این امر ضروری است زیرا ویژگی ها به واسطه ی آن در واحدهای مختلف اندازه گیری می شوند و در نتیجه محدوده های مختلفی را پوشش می دهند. روش هایی مانند ماشین بردار پشتیبان ( SVM ) و k-نزدیک ترین همسایگان ( KNN ) که فاصله ی بین مشاهدات را در نظر می گیرند ، به طرز چشمگیری تحت تاثیر طیف وسیعی از ویژگی ها قرار می گیرند و مقیاس گذاری به آن ها امکان یادگیری را می دهد. در حالی که روش هایی مانند رگرسیون خطی و جنگل تصمیم تصادفی نیازی به مقیاس بندی ویژگی ها ندارند، هنوز بهترین کار این است که با مقایسه چندین الگوریتم ، این مرحله را انجام دهیم.
ما با قرار دادن هر یک از ویژگی ها بین ۰ و ۱ ، مقادیر را مقیاس بندی می کنیم. این کار با در نظر گرفتن هر مقدار از یک ویژگی ، کم کردن پایین ترین مقدار ویژگی و تقسیم آن با حداکثر مقدار بر حداقل (دامنه) انجام می شود. این نسخه ی خاص مقیاس گذاری نرمال سازی ( Normalization ) نامیده می شود و نسخه اصلی دیگر به عنوان استاندارد سازی Standardization ) ) شناخته می شود.
در حالی که اجرای این فرآیند به صورت دستی آسان خواهد بود ، می توانیم آن را با استفاده از MinMaxScaler در Scikit-Learn انجام دهیم. کد این روش با کدگذاری برای جایگذاری یکسان است ، باز هم در این مرحله باید اطمینان حاصل کنیم که فقط با استفاده از « داده های مجموعه ی آموزش » آموزش و یادگیری را انجام می دهیم و سپس داده ها را تغییر می دهیم.
# Create the scaler object with a range of 0-1 scaler = MinMaxScaler(feature_range=(0, 1)) # Fit on the training data scaler.fit(X) # Transform both the training and testing data X = scaler.transform(X) X_test = scaler.transform(X_test)
در حال حاضر هر ویژگی دارای حداقل مقدار ۰ و حداکثر مقدار ۱ است. تقسیم ارزش گم شده و مقیاس بندی ویژگی ها دو مرحله هستند که تقریباً در هر قسمت و مرحله ی یادگیری ماشین مورد نیاز هستند ، بنابراین درک این که چگونه کار می کنند یک کار بسیار خوب و مفید است!
اجرای مدل های یادگیری ماشین در کتابخانه Scikit-Learn
پس از تمام کارهایی که برای تمیز کردن ( Cleaning ) و قالب بندی Formatting ) ) داده ها انجام دادیم باید بدانید که ، ساختن ، آموزش و پیش بینی با مدل ها نسبتاً ساده تر است. ما از کتابخانه Scikit-Learn در پایتون استفاده خواهیم کرد که دارای اسناد عالی و ساختاری استثنایی و دستوری برای ساخت مدل ها می باشد. هنگامی که می دانید چگونه یک مدل را در Scikit-Learn بسازید ، می توانید به سرعت طیف متنوعی از الگوریتم ها را پیاده سازی کنید.
ما می توانیم یک نمونه از ایجاد مدل ، آموزش ( استفاده از .fit ) و تست ( با استفاده از .predict ) را با رگرسور Regressor تقویت کننده گرادیان نشان دهیم:
Gradient Boosted Performance on the test set: MAE = 10.0132
ایجاد مدل ، آموزش و آزمایش همه یک خط هستند! برای ساخت مدل های دیگر ، از همان دستور یا Syntax استفاده می کنیم ، فقط لازم است تا نام الگوریتم را تغییر دهیم. نتایج کار ما در نمودار زیر ارائه شده است:
برای چشم انداز این ارقام ، مبنای ساده و محاسبه شده با استفاده از مقدار متوسط هدف ۵/۲۴ بود. واضح است که یادگیری ماشین – به دلیل پیشرفت چشمگیر نتایج نسبت به حالت پایه – برای حل کردن مسئله ی ما کاربرد دارد!
همان طور که قابل مشاهده است نتایج رگرسیون تقویت شده به وسیله ی گرادیان (MAE = 10.013) اندکی از نتایج جنگل تصادفی (MAE 10.014) پیشی گرفته اند. این نتایج کاملاً منصفانه نیستند زیرا ما بیشتر از مقادیر پیش فرض برای هایپرپارامتر ها استفاده می کنیم. به خصوص در مدل هایی مانند دستگاه بردار پشتیبانی support vector machine ، عملکرد بسیار وابسته به این تنظیمات است. با این حال و با توجه به وجود این نتایج ، ما از رگرسیون تقویت کننده شیب برای بهینه سازی مدل خودمان استفاده خواهیم کرد.
تنظیمات هایپرپارامتر برای بهینه سازی مدل
در یادگیری ماشین ، بعد از انتخاب یک مدل ، می توانیم با تنظیم هایپرپارامتر های مدل ، آن را برای حل مساله ی خودمان بهینه کنیم.
اول از همه لازم است بدانیم هایپرپارامتر ها چه چیزهایی هستند و تفاوت آن ها با پارامتر ها در چیست؟
- هایپرپارامتر های مدل به عنوان بهترین تنظیمات برای یک الگوریتم یادگیری ماشین به حساب می آیند که قبل از شروع فرآیند آموزش توسط دانشمند یا محقق داده تنظیم می شود. تعداد درختان یک جنگل تصادفی و تعداد همسایگان مورد استفاده در الگوریتم K-نزدیکترین همسایگان k می توانند دو مثال خوب برای این سیستم باشند.
- پارامتر های مدل همان چیزهایی هستند که مدل در حین آموزش می آموزد ، مانند وزن در یک رگرسیون خطی .
کنترل هایپرپارامتر ها به دلیل تغییر تعادل بیش از حد بین Underfitting و Overfitting در یک مدل ، بر روی عملکرد مدل تأثیر می گذارد. کم برازش یا Underfitting برای مواقعی است که مدل ما برای یادگیری نگاشت ویژگی ها برای رسیدن به هدف به اندازه کافی کامل و پیچیده نباشد ( یا به عبارتی دارای درجه آزادی کافی نداشته باشد). یک مدل underfit بایاس ( Bias ) بالایی دارد که می توانیم این نقص را با کامل تر کردن مدل اصلاح کنیم.
بیش برازش یا Overfitting مربوط به زمانی است که مدل ما اساساً داده های آموزش را به خاطر می آورد. یک مدل Overfit دارای واریانس بالایی است که می توانیم این نقص را با محدود کردن پیچیدگی مدل از طریق تنظیم یا Regularization اصلاح کنیم. لازم به ذکر است هر دو مدل Underfit و Overfit قادر به تعمیم داده های تست نیستند.
مشکلی که در انتخاب هایپرپارامتر های مناسب وجود دارد این است که مجموعه ی بهینه برای هر مشکل یادگیری ماشین متفاوت خواهد بود! بنابراین ، تنها راه برای یافتن بهترین تنظیمات ، امتحان کردن تعدادی از آن ها در هر مجموعه از داده های جدید است. خوشبختانه ، Scikit-Learn دارای چندین روش است که به ما امکان می دهد پارامتر های فوق مؤثر روی این جریان را ارزیابی کنیم. علاوه بر این ، پروژه هایی مانند TPOT که توسط Epistasis Lab ارائه شده سعی در بهینه سازی جستجوی هایپرپارامتر ها با استفاده از روش هایی مانند برنامه نویسی ژنتیکی ( Genetic Programming ) دارند.
جستجوی تصادفی با اعتبار سنجی متقابل
روش تنظیم هایپرپارامتر خاصی که ما پیاده خواهیم کرد، جستجوی تصادفی با اعتبار سنجی متقابل نامیده می شود :
- جستجوی تصادفی (Random Search ) به تکنیکی است که ما از آن برای انتخاب هایپرپارامتر ها استفاده خواهیم کرد. ما یک شبکه را تعریف می کنیم و به جای جستجوی کل شبکه که در آنجا همه ترکیبات بطور کامل حضور دارند، بطور تصادفی از ترکیب های مختلف نمونه هایی را بر می داریم و آزمایش می کنیم. ( با کمال تعجب ، جستجوی تصادفی با این که از نظر کیفی مشابه به جستجوی شبکه است، برنامه را با کاهش دادن بسیار بالای زمان اجرا می کند )
- اعتبار سنجی متقابل ( Cross Validation ) روشی است که ما از آن برای ارزیابی ترکیبی از هایپر پارامتر های انتخابی استفاده می کنیم. با این روش ما به جای تقسیم کردن مجموعه داده های آموزش به تنظیم مجموعه های « آموزش جداگانه » و « اعتبار سنجی » که باعث کاهش میزان داده های آموزشی می گردد « داده هایی که می توانیم از آن ها استفاده کنیم » ، از اعتبار سنجی متقابل K-Fold استفاده می کنیم. این فرآیند شامل تقسیم داده های آموزش به تعداد K برابر، و پیاده سازی یک روند تکراری است که در آن ما ابتدا K-1 برابر ها را آموزش می دهیم و سپس عملکرد را در برابر Kمین fold ارزیابی می کنیم. ما این روند K را بار ها تکرار می کنیم و در پایان اعتبارسنجی K-fold ، میانگین خطای مربوط به هر یک از تکرارهای K را به عنوان معیار عملکرد نهایی در نظر می گیریم.
ایده اعتبارسنجی K-Fold با K = 5 در زیر نشان داده شده است:
کل فرآیند انجام جستجوی تصادفی با اعتبار متقابل عبارت است از :
- تنظیم و پیاده سازی یک شبکه از هایپرپارامتر ها برای ارزیابی نمودن آن ها .
- در ادامه باید به طور تصادفی یک ترکیب از هایپرپارامتر ها را نمونه برداری کنید .
- با ترکیب انتخاب شده به طور تصادفی ، یک مدل ایجاد کنید .
- ارزیابی مدل با استفاده از اعتبارسنجی به وسیله ی K-fold
- تصمیم بگیرید که کدام پارامتر ها بهترین کار را کرده اند
البته ، ما واقعاً این کار را به صورت دستی انجام نمی دهیم ، بلکه اجازه می دهیم که RandomizedSearchCV از کتابخانه Scikit-Learn همه ی این کارها را انجام دهد!
نکته انحرافی کوچک : روش های تقویت کننده گرادیان
از آنجایی که ما از مدل رگرسیون تقویت شده گرادیان استفاده خواهیم کرد ، باید حداقل پیش زمینه ای را از آن برایتان ارائه دهم! رگرسیون تقویت شده گرادیان یک روش خاص با تاثیر کلی و گروهی است، به این معنی که از حاصل تجربیات ماشین های یادگیری ضعیف تر ساخته شده است، به خصوص از درخت تصمیم گیری های آن ها
در حالی که یک الگوریتم بگینگ ( Bagging ) مانند جنگل تصادفی ، ماشین های یادگیرنده ی ضعیف را به طور موازی آموزش می دهد و به آن ها حق تصمیم گیری می دهد تا فرآیند را پیش بینی کنند ، روشی تقویت شده ( Boosted ) مانند رگرسیون تقویت شیب یادگیرندگان را به صورت متوالی آموزش می دهد ، و هر یادگیرنده بر ” خطا های ” یادگیرنده قبلی خود تمرکز می کند تا از تکرار آن ها اجتناب کند.
روش های تقویتی در سال های اخیر رواج یافته اند و اغلب نیز در مسابقات یادگیری ماشین پیروز می شوند. روش تقویت گرادیان یک متد خاص و ویژه است که از گرادیان نزولی برای به حداقل رساندن عملکرد بها ( Cost ) به وسیله ی آموزش متوالی فراگیران در موارد قبلی استفاده می کند ( با استفاده از تجربیات مدل های قبلی و مدل های ضعیف تر خودش را قوی تر می کند ) اجرای کتابخانه ی
Scikit-Learn و به کار گرفتن تقویت گرادیان عموماً نسبت به سایر کتابخانه ها مانند XGBoost کم کارآمدتر است ، اما از طرفی هم Scikit-Learn به اندازه ی کافی برای مجموعه داده های کوچک ما کارآمد، مفید و کاملاً دقیق است.
بازگشت به تنظیم هایپر پارامتر
پارامتر های زیادی برای تنظیم در یک رگرسیون تقویت گرادیان وجود دارد و می توانید برای دریافت جزئیات بیشتر از آن به اسناد Scikit-Learn مراجعه کنید. ما پارامتر های زیر را بهینه خواهیم کرد:
loss : عملکردی برای به حداقل رساندن ضرر
n_estimators : تعداد فراگیران ضعیف برای استفاده ( فراگیران موجود در درخت تصمیم گیری )
max_depth : حداکثر عمق نفوذ برای هر درخت تصمیم گیری
min_samples_leaf : حداقل نمونه های مورد نیاز در یک گره ی برگ ( leaf node ) درخت تصمیم
min_samples_split : حداقل نمونه های مورد نیاز برای گشودن یک گره ی درخت تصمیم
max_features : حداکثر تعداد ویژگی هایی که باید برای فرآیند گشودن گره ها استفاده شود
من مطمئن نیستم که کسی واقعاً درک کند که چگونه این هایپرپارامتر ها در کنار هم تعامل دارند ، و به همین دلیل از نظر من تنها راه برای یافتن بهترین ترکیب ، امتحان کردن آن است!
در کد زیر ، ما یک شبکه ی هایپر پارامتر را ایجاد می کنیم ، یک RandomizedSearchCV را ایجاد می کنیم و با استفاده از اعتبارسنجی – fold 4 روی بیش از ۲۵ ترکیب متفاوت از هایپرپارامتر ها ، جستجوی هایپرپارامتر مورد نظرمان را انجام می دهیم:
پس از انجام جستجو، می توانیم از RandomizedSearchCV استفاده کنیم تا بهترین مدل را پیدا کنیم:
# Find the best combination of settings random_cv.best_estimator_ GradientBoostingRegressor(loss='lad', max_depth=5, max_features=None, min_samples_leaf=6, min_samples_split=6, n_estimators=500)
ما می توانیم از این نتایج به وسیله ی انتخاب پارامتر هایی برای شبکه ی خودمان که به این مقادیر بهینه نزدیک هستند ، برای انجام جستجوی شبکه ( Grid Search ( استفاده کنیم. با این حال ، باید آگاه باشید که تنظیم بیشتر بعید است که مدل ما را بهبود بخشد. به عنوان یک قاعده ی کلی ، « مهندسی ویژگی » مناسب تأثیر بسیار بیشتری در عملکرد مدل دارد، حتی در مقایسه با گسترده ترین تنظیم های هایپرپارامتر ! توجه داشته باشید که این قانون کاهش بازده ها است که برای یادگیری ماشین اعمال می شود : مهندسی ویژگی ( Feature Engineering ) بیشتر شما را به مقصود و هدفتان نزدیک می کند و تنظیم هایپر پارامتر ها فقط یک مزیت ناچیز را برای شما به ارمغان می آورد.
یک آزمایش که می توانیم امتحان کنیم ، تغییر تعداد تخمین گر یا Estimators در درخت تصمیم گیری است، البته شرط انجام این کار ثابت نگه داشتن بقیه هایپرپارامتر ها است. این کار به طور مستقیم به ما امکان می دهد تا تأثیر این تنظیم خاص را مشاهده کنیم. البته شما می توانید برای اجرای صحیح آن به نوتبوک پیاده سازی مراجعه کنید، اما جدا از آن ما نتایج را در اینجا برای شما آورده ایم:
با افزایش تعداد درختان مورد استفاده در این مدل ، خطای آموزش و خطای آزمایش نیز کاهش می یابد. با این حال ، خطای آموزش بسیار سریعتر از خطای آزمایش کاهش می یابد و می بینیم که مدل ما یک مدل Overfitting و یا به عبارتی بیش از حد بهینه شده است : این مساله بدین معنی است که روی داده های آموزش بسیار خوب عمل می کند ، اما قادر به دستیابی به همان عملکرد در مجموعه داده های آزمایش نیست.
ما همیشه انتظار داریم که در عملکرد آزمون حداقل کاهش عملکرد کوچکی وجود داشته باشد (از این گذشته ، مدل می تواند پاسخ های واقعی را که برای مجموعه ی آموزش است را ببیند) ، اما یک شکاف قابل توجه نشانگر وجود بهینه سازی بیش از حد یا overfitting است. ما می توانیم با به دست آوردن داده های آموزشی بیشتر ، و یا کاهش دادن پیچیدگی های مدل خودمان از طریق هایپرپارامتر ها ، بهینه سازی بیش از حد یا همان Overfitting را تشخیص دهیم. در مورد این پروژه ، ما هایپر پارامتر ها را در آنجا قرار می دهیم ، اما من به شخصه هرکسی را تشویق می کنم که سعی کند از روش های مختلف برای حل مساله ی Overfitting استفاده کند.
ما برای مدل نهایی ، از ۸۰۰ تخمین گر استفاده خواهیم کرد زیرا این امر منجر به کمترین خطا در اعتبارسنجی متقابل گردید. حالا وقت آن است که این مدل را امتحان کنید!
ارزیابی در مجموعه ی تست
به عنوان مهندسین مسئولیت پذیر یادگیری ماشین ، ما اطمینان حاصل کردیم که اجازه ندهیم مدلمان ازمجموعه ی آزمون در هر قسمت از آموزش آموزش دیدن کند. بنابراین ، ما می توانیم از عملکرد مجموعه آزمون به عنوان نشانه ای از عملکرد مدل خود هنگام استقرار و پیاده سازی در دنیای واقعی استفاده کنیم.
پیش بینی در مورد مجموعه آزمون و محاسبه عملکرد آن نسبتاً ساده است. در اینجا ، ما عملکرد پیش فرض رگرسیون تقویت کننده گرادیان را با مدل تنظیم شده مقایسه می کنیم:
# Make predictions on the test set using default and final model default_pred = default_model.predict(X_test) final_pred = final_model.predict(X_test) Default model performance on the test set: MAE = 10.0118. Final model performance on the test set: MAE = 9.0446.
از نتایج پیداست که تنظیم هایپرپارامتر دقت مدل را در حدود ۱۰٪ بهبود بخشیده است. بسته به نوع مورد استفاده از مدل ، ۱۰٪ می تواند یک پیشرفت عظیم باشد ، اما مساله ی مهم این است که به واسطه ی این پیشرفت در بخش زمان به صورت قابل توجهی سرمایه گذاری شد!
همچنین می توانیم با استفاده از دستور %timeit در نوت بوک های Jupyter ، زمان آموزش به دو مدل را بسنجیم. اولین مدل به صورت پیش فرض است:
%%timeit -n 1 -r 5 default_model.fit(X, y) ۱٫۰۹ s ± ۱۵۳ ms per loop (mean ± std. dev. of 5 runs, 1 loop each)
۱ ثانیه برای آموزش زمانی بسیار منطقی و خوب به نظر می رسد. اما مدل تنظیم شده ی نهایی خیلی سریع نیست:
%%timeit -n 1 -r 5 final_model.fit(X, y) ۱۲٫۱ s ± ۱٫۳۳ s per loop (mean ± std. dev. of 5 runs, 1 loop each)
این مورد یک جنبه ی اساسی در یادگیری ماشین را به ما نشان می دهد: یادگیری ماشین همیشه مانند یک بازی معاملاتی است. ما دائماً باید دقت در برابر تفسیر ، تاثیر روی نتایج در مقابل واریانس ، دقت در مقابل زمان اجرا و غیره را متعادل کنیم. به دست آوردن فرمول مناسب نهایی به مشکل و مساله ی ما بستگی دارد. در مورد این مساله ، افزایش ۱۲ برابری در زمان اجرا از نظر نسبی زیاد است ، اما به طور مطلق چندان قابل توجه نیست.
هنگامی که پیش بینی های نهایی را انجام دادیم ، می توانیم درباره آنها تحقیق کنیم تا ببینیم که آیا آنها انحراف قابل توجهی دارند؟ در نمودار بالا نقشه ی چگالی مقادیر پیش بینی شده و واقعی قرار دارد و در پایین هم یک هیستوگرام از باقیمانده ها وجود دارد:
پیش بینی مدل به نظر می رسد که سیر پیش بینی های مدل شبیه به مقادیر واقعی است، حتی با وجود اینکه اوج تراکم در مجموعه ی آموزش نزدیک به میانگین (۶۶) است ، د حالی که اوج واقعی چگالی نزدیک به ۱۰۰ است. باقیمانده ی موارد تقریباً به طورعادی توزیع شده اند، اگرچه ما مقادیر منفی زیادی را مشاهده می کنیم که در مورد آن ها پیش بینی های مدل بسیار پایین تر از مقادیر واقعی بوده اند . ما در پست بعدی نگاهی عمیق تر به تفسیر نتایج مدل خواهیم انداخت.
نتیجه گیری
در این مقاله ما چندین مرحله در گردش کار یادگیری ماشین را تحت پوشش قرار داده ایم:
- وارد کردن مقادیر از دست رفته و مقیاس بندی ویژگی ها
- ارزیابی و مقایسه چندین مدل یادگیری ماشین
- تنظیم هایپرپارامتر ها با استفاده از شبکه ی جستجوی تصادفی و اعتبار سنجی متقابل
- ارزیابی بهترین مدل در مجموعه آزمون
نتایج این کار به ما نشان داد که یادگیری ماشین برای کار پیش بینی امتیاز Energy Star ساختمان با استفاده از داده های موجود قابل اجرا است. با استفاده از یک رگرسیونر تقویت کننده ی گرادیان ما توانستیم نمرات آزمون را در حدود ۹٫۱ امتیاز از مقدار واقعی پیش بینی کنیم. علاوه بر این ، ما دیدیم که تنظیم هایپرپارامتر می تواند عملکرد یک مدل را بهبود ببخشد و هزینه قابل توجهی از نظر زمان سرمایه گذاری شده برای پروژه را کاهش دهد. این تنها یکی از معادلات بسیاری است که هنگام تهیه یک راه حل یادگیری ماشین باید در نظر بگیریم.
در پست سوم ( که به زودی منتشر خواهد شد ) ، ما به یک مدل جعبه ی سیاه ( Blackbox ) ساخته شده توسط خودمان نگاه دقیقی خواهیم کرد و سعی خواهیم کرد که بفهمیم مدل ما به چه شکلی پیش بینی ها را انجام می دهد. ما همچنین بزرگترین فاکتورهای تأثیرگذار بر امتیاز Energy Star را تعیین خواهیم کرد. توجه داشته باشید در حالی که ما می دانیم مدل ما دقیق است ، می خواهیم بدانیم که چرا پیش بینی های انجام شده را به دقت انجام می دهد و روی این کار خواهیم کرد که آگاهی از این مسئله راجع به مشکلمان به ما چه چیزهایی را یاد می دهد!
مثل همیشه ، ما از بازخوردها و انتقادات سازنده ی شما استقبال می کنیم و برای شما بهترین آرزوها را داریم.
2 نظر
دنبال کنید : آموزش شبکه های عصبی عمیق با داده های اندک - مجله شهاب
دنبال کنید : پردازش تصویر با MATLAB – قسمت اول : دستور های اولیه - مجله شهاب