آموزش

دسته‌بندی با الگوریتم جنگل تصادفی

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

تاریخ انتشار:
16 آبان 1405
پایتون
14 دقیقه
تحلیل داده
یادگیری ماشین
کاربرهای فینکا در چه شرکت‌هایی مشغول به کار هستند؟

این آموزش توضیح می‌ده که چطوری از الگوریتم جنگل تصادفی برای دسته‌بندی در پایتون استفاده کنی. اینجا یاد می‌گیری:

  • چطوری جنگل‌های تصادفی به عنوان یه متد یادگیری گروهی (ensemble) کار می‌کنن
  • چطوری با استفاده از scikit-learn یه مدل دسته‌بندی بسازی و آموزشش بدی
  • چطوری عملکرد مدل رو با معیارهای رایج ارزیابی کنی

برای اینکه بهترین استفاده رو از این مقاله ببری، باید آشنایی اولیه‌ای با پایتون، pandas و scikit-learn داشته باشی. اینکه بدونی درخت‌های تصمیم چطوری برای دسته‌بندی استفاده می‌شن هم خیلی کمک می‌کنه. اگه تازه داری با scikit-learn کار می‌کنی، یه سر به آموزش اولین مدل یادگیری ماشین با Kaggle بزن.

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

می‌کنبم تو دوره اعتبارسنجی مدل در پایتون فینکا هم شرکت کنی تا دسته‌بندی جنگل تصادفی رو روی دیتاست tic_tac_toe تمرین کنی.

جنگل‌های تصادفی چی هستن؟

جنگل‌های تصادفی یه الگوریتم معروف تو یادگیری ماشین نظارت‌شده (supervised) هستن که می‌تونن کارهای رگرسیون و دسته‌بندی رو انجام بدن. در ادامه چند تا از ویژگی‌های اصلیشون رو می‌بینی:

  • از جنگل‌های تصادفی برای یادگیری ماشین نظارت‌شده استفاده می‌شه؛ یعنی جایی که یه متغیر هدف برچسب‌دار داریم.
  • این الگوریتم می‌تونه برای حل مسائل رگرسیون (وقتی متغیر هدف عددیه) و دسته‌بندی (وقتی متغیر هدف دسته‌ایه) استفاده بشه.
  • جنگل‌های تصادفی یه متد گروهی هستن، به این معنی که پیش‌بینی‌های مدل‌های دیگه رو با هم ترکیب می‌کنن.
  • هر کدوم از مدل‌های کوچیکتر تو این گروه جنگل تصادفی، در واقع یه درخت تصمیمه.

الگوریتم دسته‌بندی جنگل تصادفی چطوری کار می‌کنه؟

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

تو مدل دسته‌بندی جنگل تصادفی هم چند تا درخت تصمیم با استفاده از زیرمجموعه‌های تصادفی مختلفی از داده‌ها و ویژگی‌ها ساخته می‌شه. هر درخت تصمیم مثل همون متخصصه عمل می‌کنه و نظر خودش رو درباره نحوه دسته‌بندی داده‌ها می‌ده. بعدش پیش‌بینی هر درخت مشخص می‌شه و نتیجه‌ای که بیشترین رأی رو آورده، به عنوان پیش‌بینی نهایی انتخاب می‌شه. (برای رگرسیون، از تکنیک میانگین‌گیری استفاده می‌شه.)

تو نمودار زیر، یه جنگل تصادفی با n تا درخت تصمیم داریم که ۵ تای اول رو با پیش‌بینی‌هاشون (سگ یا گربه) نشون دادیم. هر درخت با تعداد ویژگی‌ها و نمونه‌های متفاوتی از دیتاست اصلی روبرو می‌شه، برای همین می‌تونه با بقیه فرق داشته باشه. هر درخت هم پیش‌بینی خودش رو انجام می‌ده.

اگه به ۵ تا درخت اول نگاه کنیم، می‌بینیم که ۴ تاشون پیش‌بینی کردن نمونه یه گربه‌ست. دایره‌های سبز مسیر فرضی‌ای رو نشون می‌دن که درخت برای رسیدن به این تصمیم طی کرده. جنگل تصادفی تعداد پیش‌بینی‌های Cat و Dog رو می‌شماره و اونی که بیشترین تکرار رو داشته انتخاب می‌کنه.

بارگذاری دیتاست

این دیتاست مربوط به کمپین‌های بازاریابی مستقیم یه بانک پرتغالیه که از طریق تماس تلفنی انجام شده. هدف این کمپین‌ها فروش اشتراک سپرده مدت‌دار بوده. ما می‌خوایم این دیتاست رو تو متغیری به اسم bank_data ذخیره کنیم. ستون‌هایی که باهاشون کار داریم اینا هستن:

  • age: سن کسی که باهاش تماس گرفته شده
  • default: اینکه طرف اعتبار پیش‌فرض داره یا نه
  • cons.price.idx: امتیاز شاخص قیمت مصرف‌کننده موقع تماس
  • cons.conf.idx: امتیاز شاخص اعتماد مصرف‌کننده موقع تماس
  • y: اینکه طرف اشتراک رو خریده یا نه (این همون چیزیه که می‌خوایم پیش‌بینی کنیم)

وارد کردن پکیج‌ها

تو این آموزش از پکیج‌ها و توابع زیر استفاده کردیم:

جریان کار جنگل تصادفی

برای برازش (fit) و آموزش این مدل، ما طبق اینفوگرافیک جریان کار یادگیری ماشین پیش می‌ریم؛ ولی چون داده‌هامون تقریباً تمیزن، نیازی نیست همه مراحل رو انجام بدیم. کارایی که می‌کنیم ایناست:

  • مهندسی ویژگی (Feature engineering)
  • تقسیم داده‌ها
  • آموزش مدل
  • تنظیم هایپرپارامترها
  • ارزیابی عملکرد مدل

پیش‌پردازش داده‌ها برای مدل دسته‌بندی جنگل تصادفی

مدل‌های مبتنی بر درخت در برابر داده‌های پرت (outliers) خیلی مقاوم‌تر از مدل‌های خطی هستن و برای اینکه درست کار کنن، نیازی به نرمال‌سازی متغیرها ندارن. به همین خاطر ما روی داده‌هامون پیش‌پردازش خیلی کمی انجام می‌دیم.

  • مقادیر "no" و "yes" تو ستون default رو به ترتیب با 0 و 1 جایگزین می‌کنیم. تو این مثال، مقادیر "unknown" رو هم همون "no" در نظر می‌گیریم.
  • مقادیر متغیر هدفمون یعنی y رو هم به 1 و 0 تغییر می‌دیم.

تقسیم داده‌ها

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

کد زیر ویژگی‌ها و متغیر هدف رو از هم جدا می‌کنه و بعد اون‌ها رو به داده‌های آموزشی و تست تقسیم می‌کنه.

برازش و ارزیابی مدل جنگل تصادفی

اول از همه یه نمونه از مدل جنگل تصادفی با پارامترهای پیش‌فرض می‌سازیم. بعدش اون رو با داده‌های آموزشیمون برازش (fit) می‌کنیم. ویژگی‌ها و متغیر هدف رو بهش می‌دیم تا مدل بتونه یاد بگیره.

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

ساده‌ترین راه برای ارزیابی این مدل، بررسی میزان دقتشه (accuracy)؛ پیش‌بینی‌ها رو با مقادیر واقعی مجموعه تست مقایسه می‌کنیم و می‌شماریم که مدل چند بار درست پیش‌بینی کرده.

خروجی
Accuracy: 0.888

این امتیاز واقعاً عالیه! با این حال، شاید با بهینه‌سازی هایپرپارامترها بتونیم نتیجه بهتری هم بگیریم. 

توجه: بررسی دقت به‌تنهایی می‌تونه تو داده‌های نامتوازن گول‌زننده باشه. همیشه معیارهای precision و recall رو هم چک کن تا درک بهتری از موازنه بین مثبت کاذب و منفی کاذب داشته باشی.

مصورسازی نتایج

با استفاده از کد زیر می‌تونیم ۳ تا درخت اولمون رو مصورسازی کنیم.

درخت اول
درخت دوم
درخت سوم

تصویر هر درخت فقط چند تا گره اول رو نشون می‌ده. این درخت‌ها می‌تونن خیلی بزرگ بشن و تصویرسازیشون سخت بشه. رنگ‌ها نشون‌دهنده کلاس اکثریت تو هر گره هستن (باکس قرمز یعنی اکثریت 0 هستن (عدم خرید اشتراک) و آبی یعنی اکثریت 1 هستن (خرید اشتراک)). هرچی گره بیشتر به سمت تماماً 0 یا 1 بودن بره، رنگش تیره‌تر می‌شه. هر گره شامل این اطلاعاته:

  1. اسم متغیر و مقداری که برای تقسیم استفاده شده
  2. درصد کل نمونه‌ها تو هر تقسیم
  3. درصد تقسیم بین کلاس‌ها

تنظیم هایپرپارامترها

کد زیر از تابع RandomizedSearchCV تو کتابخونه Scikit-Learn استفاده می‌کنه تا پارامترها رو به‌صورت تصادفی تو یه محدوده مشخص بگرده. ما هایپرپارامترهای مدنظرمون و محدوده‌هاشون رو تو دیکشنری param_dist تعریف می‌کنیم. اینجا از موارد زیر استفاده کردیم:

  • n_estimators: تعداد درخت‌های تصمیم تو جنگل. معمولاً بالا بردن این عدد عملکرد مدل رو بهتر می‌کنه، ولی خب هزینه پردازشی آموزش و پیش‌بینی رو هم می‌بره بالا.
  • max_depth: حداکثر عمق هر درخت تصمیم. اگه max_depth رو خیلی زیاد بذاریم ممکنه مدل دچار بیش‌برازش بشه، از اون طرف مقدار خیلی کم هم می‌تونه باعث کم‌برازش (underfitting) بشه.

تابع RandomizedSearchCV مدل‌های زیادی رو آموزش می‌ده (تعدادش رو با n_iter_ مشخص می‌کنیم) و هر کدوم رو تو یه متغیر ذخیره می‌کنه. کد زیر بهترین مدل رو می‌ریزه تو یه متغیر و هایپرپارامترهاش رو چاپ می‌کنه.

اینجا چون هیچ سیستم امتیازدهی خاصی به تابع ندادیم، به‌طور پیش‌فرض از accuracy استفاده می‌کنه. این تابع از اعتبارسنجی متقاطع (cross-validation) هم استفاده می‌کنه؛ یعنی داده‌ها رو به ۵ گروه مساوی تقسیم می‌کنه، با ۴ گروه آموزش می‌ده و با ۱ گروه تست می‌کنه. این کار برای هر گروه تکرار می‌شه و امتیازهای دقت به دست میان که ازشون میانگین گرفته می‌شه تا بهترین مدل پیدا بشه.

خروجی
Best hyperparameters: {'max_depth': 5, 'n_estimators': 260}

معیارهای ارزیابی بیشتر برای جنگل تصادفی

بیا یه نگاهی به ماتریس درهم‌ریختگی (confusion matrix) بندازیم. این نمودار پیش‌بینی‌های مدل رو با مقادیر واقعی مقایسه می‌کنه. با این ماتریس می‌تونیم موازنه بین مثبت‌های کاذب (بالا سمت راست) و منفی‌های کاذب (پایین سمت چپ) رو بهتر درک کنیم. با کد زیر می‌تونیم این ماتریس رو رسم کنیم:

خروجی:

باید بهترین مدلمون رو با مقادیر accuracy، precision و recall هم ارزیابی کنیم (یادت باشه چون ماهیت کار تصادفیه، ممکنه نتایجت کمی متفاوت باشن)

خروجی
Accuracy: 0.885
Precision: 0.578
Recall: 0.0873

کد زیر اهمیت هر ویژگی رو با استفاده از امتیاز داخلی مدل رسم می‌کنه تا مشخص بشه بهترین راه برای تقسیم داده‌ها تو هر درخت تصمیم چیه.

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

چه زمانی از جنگل‌های تصادفی استفاده کنیم؟

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

از جنگل‌های تصادفی وقتی استفاده کن که:

  • داده‌های جدولی (tabular) با انواع ویژگی‌های ترکیبی داری
  • یه مدل مقاوم می‌خوای که نیازی به مقیاس‌بندی سنگین ویژگی‌ها یا پیش‌پردازش نداشته باشه
  • قابلیت تفسیر (از طریق اهمیت ویژگی‌ها) برات مهمه

البته جنگل‌های تصادفی تو این شرایط ممکنه خیلی ایده‌آل نباشن:

  • وقتی به پیش‌بینی‌های آنی (real-time) نیاز داری؛ چون این مدل‌ها ممکنه از مدل‌های تکی کندتر باشن
  • وقتی با داده‌های با ابعاد خیلی بالا (مثل متن یا عکس) سروکار داری
  • وقتی به دقت خیلی بالا و حرفه‌ای روی داده‌های ساختاریافته نیاز داری؛ جاهایی که روش‌های تقویت گرادیان (gradient boosting) مثل XGBoost یا LightGBM معمولاً بهتر عمل می‌کنن

قدم بعدی رو بردار

برای شروع کار با یادگیری ماشین نظارت‌شده تو پایتون، پیشنهاد می‌کنیم تو دوره یادگیری نظارت‌شده با scikit-learn فینکا شرکت کنی. اگه می‌خوای بیشتر درباره جنگل‌های تصادفی و بقیه مدل‌های یادگیری ماشین مبتنی بر درخت یاد بگیری، دوره‌های یادگیری ماشین با مدل‌های مبتنی بر درخت در پایتون و روش‌های گروهی در پایتون رو هم از دست نده.

اشتراک‌گذاری
فهرست مطالب
  • جنگل‌های تصادفی چی هستن؟
  • الگوریتم دسته‌بندی جنگل تصادفی چطوری کار می‌کنه؟
  • بارگذاری دیتاست
  • وارد کردن پکیج‌ها
  • جریان کار جنگل تصادفی
  • پیش‌پردازش داده‌ها برای مدل دسته‌بندی جنگل تصادفی
  • تقسیم داده‌ها
  • برازش و ارزیابی مدل جنگل تصادفی
  • مصورسازی نتایج
  • تنظیم هایپرپارامترها
  • معیارهای ارزیابی بیشتر برای جنگل تصادفی
  • چه زمانی از جنگل‌های تصادفی استفاده کنیم؟
  • قدم بعدی رو بردار

سوالات متداول در مورد جنگل تصادفی

الگوریتم دسته‌بندی جنگل تصادفی یه الگوریتم یادگیری ماشین گروهی (ensemble) هست که برای دسته‌بندی داده‌ها از چند تا درخت تصمیم (decision tree) استفاده می‌کنه. این الگوریتم با جمع‌آوری پیش‌بینی‌ها از درخت‌های تصمیم مختلف، هم بیش‌برازش رو کم می‌کنه و هم دقت رو بالا می‌بره.

 

این الگوریتم با ساختن چند تا درخت تصمیم از روی زیرمجموعه‌های مختلفی از داده‌ها و ویژگی‌ها، بیش‌برازش رو کم می‌کنه. بعدش از پیش‌بینی‌ها میانگین می‌گیره؛ این کار باعث می‌شه مدل عمومی‌تر بشه و نویزهای موجود تو داده‌های آموزشی کمتر روش تأثیر بذارن.

 

هایپرپارامترهای کلیدی این الگوریتم شامل تعداد درخت‌ها، حداکثر عمق هر درخت، حداقل تعداد نمونه‌های لازم برای تقسیم یه گره (node) و تعداد ویژگی‌هاییه که باید موقع هر تقسیم در نظر گرفته بشن.

 

این الگوریتم در برابر بیش‌برازش مقاومه، با دیتاست‌های بزرگ خیلی خوب کار می‌کنه و می‌تونه هم ویژگی‌های عددی و هم دسته‌ای (categorical) رو مدیریت کنه. در ضمن، نسبت به الگوریتم‌های دیگه‌ای مثل شبکه‌های عصبی، حساسیت کمتری به تنظیم هایپرپارامترها داره.

 

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

 

الگوریتم دسته‌بندی جنگل تصادفی نتایج دسته‌ای (categorical) مثل برچسب‌ها یا کلاس‌ها (مثلاً اسپم بودن یا نبودن) رو پیش‌بینی می‌کنه، ولی الگوریتم رگرسیون جنگل تصادفی برای پیش‌بینی نتایج عددی پیوسته مثل قیمت خونه یا دما استفاده می‌شه.

دریافت اپلیکیشن فینکا

با اپلیکیشن فینکا، به بیشتر دوره‌ها و مسیرها روی موبایل دسترسی دارید، تمرین می‌کنید و یادگیری رو هم‌زمان روی موبایل و دسکتاپ ادامه می‌دید.