جنگلهای تصادفی (Random Forest) یکی از قدرتمندترین الگوریتمهای یادگیری جمعی در یادگیری ماشین است که با ترکیب چندین درخت تصمیم، مدلی دقیقتر و پایدارتر ایجاد میکند. این الگوریتم نسخهای پیشرفته از بگینگ محسوب میشود که علاوه بر نمونهبرداری بوتاسترپ از دادهها، در هر گره نیز زیرمجموعهای تصادفی از ویژگیها را انتخاب میکند.
همین تصادفیسازی دوگانه باعث کاهش همبستگی بین درختها، کاهش واریانس و بهبود عملکرد مدل در مسائل دستهبندی و رگرسیون میشود. در این قسمت از دوره یادگیری ماشین مبتنی بر درخت، با مفاهیم اصلی و پیادهسازی عملی این الگوریتم آشنا میشوید.
جنگلهای تصادفی (Random Forest)
در آخرین بخش از این فصل، با یک روش یادگیری جمعی دیگر به نام جنگلهای تصادفی آشنا میشوید. اگر به خاطر داشته باشید، در روش بگینگ یک برآوردگر پایه وجود داشت. این برآوردگر میتواند هر مدل یادگیری مانند درخت تصمیم، رگرسیون لجستیک یا حتی شبکه عصبی باشد. در این روش، هر برآوردگر روی یک نمونه بوتاسترپ جداگانه که از مجموعه داده آموزش استخراج شده است و با استفاده از تمام ویژگیها، آموزش میبیند.
جنگل تصادفی یک روش یادگیری جمعی است که از درخت تصمیم به عنوان برآوردگر پایه استفاده میکند. در این روش، هر تخمینگر روی یک نمونه بوتاسترپ متفاوت اما با اندازه یکسان نسبت به مجموعه داده آموزشی، آموزش داده میشود. تفاوت اصلی جنگلهای تصادفی با بگینگ در این است که در زمان آموزش، میزان تصادفیسازی بیشتری به مدل اعمال میشود.
به بیان دقیقتر، هنگام آموزش هر درخت، تنها d ویژگی از میان کل ویژگیهای موجود در هر گره، بدون جایگزینی نمونهبرداری میشود. مقدار d کوچکتر از تعداد کل ویژگیها در نظر گرفته میشود. این کار باعث افزایش تنوع درختهای موجود در مجموعه مدل میشود.
نمودار مربوط به روش آموزش جنگلهای تصادفی نشان میدهد که درختهای تشکیلدهنده مدل چگونه روی نمونههای بوتاسترپ مختلف از دادههای آموزشی آموزش میبینند. همچنین مشاهده میشود که در هر گره، تنها d ویژگی از میان تمامی ویژگیها به صورت تصادفی انتخاب شده و سپس تقسیم گرهها با استفاده از این ویژگیهای نمونهبرداریشده انجام میشود؛ بهگونهای که بهره اطلاعاتی (Information Gain) بیشینه شود.
در بسیاری از پیادهسازیها، مقدار d به صورت پیشفرض برابر با جذر تعداد کل ویژگیها در نظر گرفته میشود.
پیشبینی با جنگلهای تصادفی
به عنوان مثال، اگر تعداد کل ویژگیها برابر با ۱۰۰ باشد، در هر گره تنها از حدود ۱۰ ویژگی به صورت تصادفی نمونهبرداری میشود. پس از پایان مرحله آموزش، مدل آماده انجام پیشبینی خواهد بود. در مرحله پیشبینی، یک نمونه جدید به تخمین گرهای پایه داده میشود و هر یک از آنها یک خروجی پیشبینی ارائه میکنند. در ادامه، این پیشبینیها توسط مدل جنگل تصادفی تجمیع میشوند و پیشبینی نهایی بر اساس ماهیت مسئله تعیین میشود.
اگر مسئله از نوع دستهبندی باشد، پیشبینی نهایی با استفاده از رأی اکثریت میان برآوردگرهای پایه انجام میشود. در مسائل رگرسیون، خروجی نهایی به صورت میانگین مقادیر پیشبینیشده توسط تمام برآوردگرهای پایه محاسبه میگردد. برای مسائل دستهبندی، از الگوریتم scikit-learn Random Forest Classifier و برای مسائل رگرسیون از Random Forest Regressor استفاده میشود.
مزیت اصلی جنگلهای تصادفی این است که معمولاً میتوانند واریانس مدل را نسبت به یک درخت تصمیم منفرد یا ترکیبی از مدلها کاهش دهند و در نتیجه پایداری و دقت پیشبینی را بهبود بخشند. در ادامه، به سراغ پیادهسازی عملی این مفهوم خواهیم رفت. در این بخش، جنگل تصادفی را روی مجموعه دادهای مانند auto csv دادههای مورد استفاده در بخشهای قبل اعمال میکنیم که از پیش برای شما بارگذاری شده است. ابتدا وارد مراحل آمادهسازی و اجرای کد خواهیم شد.
پیادهسازی جنگل تصادفی
در ابتدا، لازم است کتابخانههای مورد نیاز را وارد کنیم. برای این منظور، الگوریتم جنگل تصادفی و همچنین ابزارهای لازم برای تقسیم داده و ارزیابی مدل استفاده میشوند.
برای پیادهسازی الگوریتم جنگل تصادفی از ماژول ensemble در کتابخانه scikit-learn استفاده میکنیم و مدل Random Forest را ایمپورت میکنیم. همچنین برای تقسیم مجموعه داده به بخشهای آموزش و آزمون، از تابع train_test_split در ماژول model_selection بهره میبریم. برای ارزیابی عملکرد مدل نیز از ماژول metrics معیار Mean Squared Error (MSE) را وارد کرده و آن را با نام اختصاری mse استفاده میکنیم.
پس از انجام ایمپورتها، مجموعه داده را با استفاده از train_test_split به دو بخش آموزش و آزمون تقسیم میکنیم تا بتوانیم مدل را آموزش داده و سپس عملکرد آن را روی دادههای دیدهنشده ارزیابی کنیم.
برای آموزش و ارزیابی مدل، دادهها را به دو بخش آموزش و آزمون تقسیم میکنیم. در این مرحله از تابع train_test_split استفاده میشود. دادههای ویژگی (X) و برچسب (Y) به این تابع ارسال شده و مقدار test_size = 0.3 تنظیم میگردد؛ به این معنا که ۷۰ درصد دادهها برای آموزش و ۳۰ درصد برای آزمون در نظر گرفته میشود. همچنین برای تضمین بازتولیدپذیری نتایج، مقدار random_state به یک عدد ثابت اختصاص داده میشود. خروجی دادههای آزمون در متغیر X_test ذخیره خواهد شد.
در ادامه، مدل جنگل تصادفی ساخته میشود. در این مرحله، پارامترهای مدل تنظیم میشوند:
- تعداد تخمینگرها (n_estimators) روی مقدار ۴۰۰ قرار داده میشود تا مجموعهای نسبتاً بزرگ از درختهای تصمیم تشکیل شود.
- پارامتر
min_samples_leafبرابر با ۰.۱۲ تنظیم میشود تا هر برگ حداقل ۱۲ درصد از دادههای آموزشی را در بر داشته باشد. - مقدار
random_stateمجدداً به یک مقدار ثابت تنظیم میشود.
خروجی مدل در متغیر rf ذخیره میشود و در نهایت، مدل روی دادههای آموزشی برازش داده میشود. نمونه شبهکد پیادهسازی به صورت زیر است
ارزیابی مدل و تحلیل اهمیت ویژگیها
در ادامه، متد fit فراخوانی شده و دادههای آموزشی شامل X_train و y_train به مدل ارسال میشود. پس از آموزش مدل، مرحله پیشبینی بر روی داده آزمون انجام میگیرد. برای این منظور از متد predict استفاده شده و برچسبهای پیشبینیشده برای مجموعه داده آزمون محاسبه میشود. در مرحله ارزیابی مدل، معیار MSE (Mean Squared Error) محاسبه میشود. بدین منظور، دادههای واقعی آزمون و پیشبینیهای مدل به ترتیب به عنوان ورودی ارسال میشوند. برای محاسبه RMSE (Root Mean Squared Error)، مقدار MSE به توان یکدوم میرسد و نتیجه در متغیر rmse_test ذخیره میشود. معمولاً مشاهده میشود که خطای این مدل کمتر از خطای مدل مبتنی بر یک درخت تصمیم منفرد است.
mpg = pd.read_csv('../datasets/auto.csv')
mpg.head()
mpg = pd.get_dummies(mpg)
X = mpg.drop('mpg', axis='columns')
y = mpg['mpg']from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error as MSEX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1)rf = RandomForestRegressor(n_estimators=400, min_samples_leaf=0.12, random_state=1)یکی از مزیتهای مدلهای مبتنی بر درخت این است که امکان ارزیابی میزان اهمیت هر ویژگی در فرآیند پیشبینی فراهم میشود. در الگوریتمهای درختی، اهمیت ویژگیها بر اساس میزان توانایی آن ویژگی در کاهش ناخالصی (Impurity) سنجیده میشود. مقدار اهمیت ویژگیها به صورت درصدی نمایش داده میشود و نشاندهنده وزن نسبی هر ویژگی در آموزش مدل است.
پس از آموزش مدل در محیط یادگیری ماشین، میتوان به ویژگیها و میزان اهمیت آنها از طریق خاصیت feature_importances_ دسترسی داشت. برای تحلیل و نمایش بهتر این مقادیر، یک ساختار سری در قالب Pandas ایجاد میکنیم.
نمونه پیادهسازی به صورت زیر است:
rf.fit(X_train, y_train)RandomForestRegressor
RandomForestRegressor(min_samples_leaf=0.12, n_estimators=400, random_state=1)y_pred = rf.predict(X_test)rmse_test = (MSE(y_test, y_pred)) ** (1/2)rmse_test
# خروجی: 3.978206634728511 در این مرحله، مدل آموزشدیده جنگل تصادفی در نظر گرفته میشود و اهمیت ویژگیها از طریق خاصیت feature_importances_ استخراج میگردد. سپس نام ویژگیها به عنوان شاخص بر روی ستونهای داده ویژگی (X.columns) قرار داده میشود تا ارتباط بین مقادیر اهمیت و ویژگیها حفظ شود.
برای داشتن نمودار واضحتر، مقادیر اهمیت ویژگیها مرتب میشوند. جهت مرتبسازی، از متد sort_values استفاده میشود و خروجی در متغیر sorted_importance_rf ذخیره خواهد شد.
در ادامه، این متغیر برای تصویرسازی استفاده شده و متد plot فراخوانی میگردد. با تنظیم پارامتر kind = barh، نمودار میلهای افقی ترسیم میشود که نمایش بهتری از اهمیت نسبی ویژگیها ارائه میدهد.
بر اساس نمودار حاصل، مشاهده میشود که ویژگیهایی مانند displacement، size rate و hp از پیشبینترین ویژگیها در مدل محسوب میشوند و بیشترین سهم را در فرآیند پیشبینی دارند.
در پایان این بخش، زمان تمرین فرا رسیده است. لطفاً وارد بخش تمرین شوید و روی این موضوع بیشتر کار کنید. در بخش بعدی شما را خواهیم دید.
جمعبندی
در این فصل مشاهده کردیم که الگوریتم جنگلهای تصادفی با ترکیب چندین درخت تصمیم و استفاده از رأیگیری اکثریت در دستهبندی یا میانگینگیری در رگرسیون، عملکردی دقیقتر از یک درخت منفرد ارائه میدهد. کاهش واریانس، مقاومت در برابر بیشبرازش و امکان استخراج اهمیت ویژگیها از مهمترین مزایای این الگوریتم هستند. به همین دلیل، Random Forest یکی از محبوبترین مدلها در پروژههای واقعی یادگیری ماشین محسوب میشود.اکنون میتوانید با تنظیم پارامترها و انجام تمرینهای بیشتر، درک عمیقتری از رفتار این مدل به دست آورید.
