درخت های مدل (Model Trees) – راهنمای کاربردی


«درخت تصمیم» (Decision Tree) ابزار قدرتمندی برای «یادگیری نظارت شده» (Supervised Learning) در «یادگیری ماشین» (Machine Learning) است. از این ابزار برای تقسیم دادهها در «جزیرههای» مجزا به صورت بازگشتی (با تقسیم ویژگیها) استفاده میشود. هدف از این کار، کاهش «زیان وزنی کلی» (Overall Weighted Loss) از «برازش» (Fit) روی «مجموعه آموزش» (Training Set) است. آنچه به طور متداول در «دستهبندی» (Classification) درخت تصمیم مورد استفاده قرار میگیرد، «دستهبند مدل» (Modal Classifier) با «زیان اندیس جینی» (Gini Index Loss) و همچنین، «بازگشت به میانگین» (Mean Regression) با زیان L2 برای رگرسیون درخت تصمیم است. نکته دیگری که باید به آن توجه کرد این است که درخت تصمیم در اصل میتواند هر مدلی را، شامل «رگرسیون خطی» (Linear Regression)، «رگرسیون لوجستیک» (Logistic Regression) و «شبکههای عصبی» (Neural Networks) در طول روال تقسیم بگیرد. هدف از این مطلب، معرفی مبحثی عمومیتر از درخت تصمیم است که «درخت های مدل» (Model Trees) نامیده میشود و امکان ساخت درخت تصمیم را از هر مدل انتخابی فراهم میکند (به جای داشتن رویکرد CART استاندارد).
در تصویر پایین، شماتیک استفاده از یک مدل درخت رگرسیون خطی برای «برازش» (Fit) مجموعه آموزش یکبُعدی به منظور پیدا کردن بخشهایی از مجموعه آموزش که با یک خط راست به خوبی برازش میشوند، ارائه شده است. در ادامه و پیش از عمیقتر شدن در این بحث که چرا درختهای مدل مفید وحائز اهمیت هستند، کد کامل پیادهسازی درختهای مدل ارائه میشود.
ساخت درخت های مدل
در الگوریتم CART (درخت دستهبندی و رگرسیون)، یک درخت با تقسیمبندی بازگشتی دادههای آموزش ساخته میشود. در مدل مذکور، آستانههای برش ویژگی در نظر گرفته میشوند که از این جمله میتوان به این مورد اشاره کرد که تقسیم دادهها موجب کاهش زیان وزنی کلی تا حد امکان شود. با تخصیص یک تابع زیان به مدل رگرسیون/دستهبندی، به هر یک از «گرههای» (Nodes) درخت، یک مدل تخصیص داده میشود که مفهوم درختهای مدل را ایجاد میکند. پیادهسازی آن در ادامه انجام شده است.
برای بصریسازی سریع چگونگی آنکه یک مدل میتواند اثبات کند که از درخت CART متداول مفیدتر است، میتوان مجموعه داده آموزش یکبُعدی ارائه شده در زیر را در نظر گرفت که تلاش میشود یک مدل رگرسیون خطی برای آن برازش داده شود (این دقیقا درخت مدل با عمق مساوی سفر یا همان depth=0 است). برازش، همانطور که انتظار میرفت ضعیف است، زیرا داده آموزش از یک چندجملهای مرتبه چهارم تولید شده است، اما اگر تقسیم دادهها به بخش x را در نظر بگیرید که با افزایش عمق درخت مدل رگرسیون خطی انجام میشود، میتوان یک مجموعه از رگرسورهای خطی را ساخت که به درستی بخشهای مجزا را برازش میکنند (depth=1, 2, 3, 4, 5). بنابراین، یک مدل به خوبی آموزش دیده، بدون نیاز به دانش صریح زیاد از پیچیدگی اساسی توزیع دادههای آموزش ارائه میشود.
همچنین، میتوان نتایج حاصل از برازش مجموعه یکبُعدی آموزش با استفاده از مدل درخت رگرسیون را با رگرسور درخت تصمیم پیشفرض کتابخانه «سایکیتلِرن» (Scikit Learn) که از بازگشت به میانگین استفاده میکند، مقایسه کرد. در نمودار زیر، میتوان به خوبی مشاهده کرد که رگرسور درخت تصمیم درخت تصمیم در depth=5 هنوز یک مدل خوب نیست، زیرا در تقلا برای ثبت تغییرپذیری X در دادهها است. این در حالی است که درخت مدل هماکنون قادر به ثبت بخش زیادی از توزیع آموزش در عمقی کمتر از پنج است.
کاربرد
در زیر، پارامترهای درخت مدل برای تنظیم پیش از اجرای کد ارائه شدهاند.
model: mean_regr, linear_regr, logistic_regr, svm_regr, modal_clf
max_depth: 1, 2, 3, 4, ...
min_samples_leaf: 1, 2, 3, 4, ...
search_type: "greedy", "grid", "adaptive"
n_search_grid: تعداد نقاط جستوجوی Grid یکتا (تنها در صورتی فعال میشود که search_type = grid یا search_type = adaptive.)
verbose: True, False
کد مربوط به ساخت درخت مدل
کد زیر را باید در فایلی با عنوان run_model_tree و البته پسوند py. ذخیره کرد. شایان توجه است که در کدهای ارائه شده در این قسمت، از کتابخانههای «نامپای» (NumPy)، «پانداس» (Pandas)، «سایکیتلرن» (Scikit Learn)، «سایپای» (SciPy) و «گرافویز» (Graphviz) استفاده شده است.
این کدها توسط «انسون ونگ» (Anson Wong) نوشته شدهاند.
پس از آنکه پارامترها تنظیم شدند، میتوان دستور زیر را اجرا کرد.
این کد، دادهها را بارگذاری میکند و درخت مدل را آموزش میدهد. خروجی کد یک شماتیک نمودار درخت، درخت مدل آموزش دیده و پیشبینیهای آموزش درخت مدل است. همچنین، «اعتبارسنجی متقابل» (Cross Validate) مدل نیز انجام میشود. متن stdout حاصل از اجرای کد باید به صورت زیر باشد.
در دایرکتوری output، میتوان مدل ساخته شده را یافت (output/model_tree.p). یک بصریسازی از درخت ساخته شده موجود است (output/model_tree.png). فایل model_tree_pred.csv شامل پیشبینیهای درخت مدل و توصیفات «پیشمایش درخت» (Tree-Traversal) است.
آزمودن
برای حصول اطمینان از اینکه پیادهسازی درخت به درستی کار میکند، میتوان تابع تست را نیز اجرا کرد.
کد تابع تست به صورت زیر است و باید آن را در یک فایل با عنوان run_tests و پسوند py. ذخیره کرد.
این کد، نتایج مدل اصلی را در درخت مدل عمق صفر مجددا تولید میکند. همچنین، پیادهسازی دستهبند درخت تصمیم پیشفرض کتابخانه سایکیتلرن (DecisionTreeClassifier) را با استفاده از دستهبندی مدل با «زیان ناخالص کلاس جینی» (Gini class impurity loss) بازتولید میکند. در عین حال، پیادهساز رگرسور درخت تصمیم پیشفرض کتابخانه sklearn را (DecisionTreeRegressor) با استفاده از بازگشت به میانگین با «زیان میانگین مربعات خطا» (mean squared error loss) مجددا تولید میکند. در نهایت، نمودار پیشبینیهای درخت مدل برای چندجملهای مرتبه چهارم را در عمقهای مختلف درخت با استفاده از درخت مدل رگرسیون (output/test_linear_regr_fit.png) و درختهای مدل رگرسیون میانگین (output/test_mean_regr_fit.png) تولید میکند.
هدف درخت مدل چیست؟
فرض میشود که کاربر دادههای آموزش پیچیدهای دارد و به یک مدل ساده برای برازش این مجموعه داده فکر میکند (مانند رگرسیون خطی یا رگرسیون لجستیک). مخصوصا اگر مدل سادهای که کاربر به آن فکر میکند دارای پیچیدگی کمی باشد، شانس خوبی وجود دارد که مدل به خودی خود روی دادهها دچار «کمبرازش» (Underfit) شود.
اگرچه امید در این نقطه از بین نمیرود. هدف از درخت مدل ساخت یک سلسله مراتب درخت تصمیم از مدل ساده به عنوان تلاشی برای برازش چندین بخش کوچکتر از مجموعه دادهها است (با استفاده از بخشبندی ویژگیها) که در آن مدل کلی به خوبی با مجموعه آموزش کامل برازش میشود.
برای نشان دادن صریح مفید بودن ساخت یک مدل درخت نسبت به یک درخت تصمیم معمول، میتوان مثال بیان شده در بالا را در نظر گرفت. یک چند جملهای یکبُعدی مرتبه چهارم مفروض است و تفاوت بین آموزش دادن یک رگرسور درخت مدل رگرسیون خطی با عمق کم و رگرسور درخت تصمیم پیشفرض کتابخانه سایکیتلرن در تصاویر ارائه شده در زیر قابل مشاهده هستند. این تصاویر پیشتر نیز ارائه شده بودند، ولیکن برای درک بهتر مطلب، تصاویر مجددا در این قسمت آورده میشوند.


در شکل اول، برازشهای درخت مدل رگرسیون خطی برای دادهها ترسیم شده و عمق درخت افزایش داده شده و در نهایت در عمق پنج به خوبی برای دادهها برازش پیدا کرده است (برای مثال ۰، ۱ و ۲). برازش به گونهای بوده که مدل به طور حریصانهای در تلاش برای کاهش زیان با پوشش دادن بخش بزرگی از چند جملهای است، بهگونهای که از دور به نظر میرسد یک خط هستند. با رسیدن به عمق ۴ و ۵، درخت مدل به خوبی وابستگی-x دادهها را چنانکه از چندجملهای مرتبه چهارم انتظار میرود پیدا کرده است.
از سوی دیگر، در شکل دوم، برازش رگرسور درخت تصمیم پیشفرض کتابخانه سایکیتلرن پایتون رسم شده است. همانطور که از تصویر مشهود است، حتی در عمقهای بالا نیز مدل همچنان در برازش ضعیف عمل میکند زیرا نمیتواند به خوبی وابستگی-x دادهها را ثبت کند. دلیل آنچه بیان شد این است که درخت تصمیم سایکیتلرن، از رگرسیون میانگین استفاده میکند (که به متغیر x توجهی ندارد و فقط به y اهمیت میدهد). بنابراین، راهکار (بدون استفاده از روشهای ترکیبی) وادار کردن درخت به عمیقتر شدن برای نزدیکتر شدن در برآورد(بهبود برآوردها) است. به عنوان نکته آخر لازم به ذکر است که درختهای مدل به لحاظ مفهومی به شیوهای مشابه با درخت تصمیم مرسوم ساخته میشوند، بدین معنا که درختهای مدل ممکن است از همان نواقصی رنج ببرند که درخت تصمیم دارد و از این جمله میتوان به «بیشبرازش» (OverFitting) به ویژه هنگامی که از مدلهای پیچیده استفاده میشود اشاره کرد.
اگر نوشته بالا برای شما مفید بوده، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای آمار، احتمالات و دادهکاوی
- آموزشهای داده کاوی یا Data Mining در متلب
- مجموعه آموزشهای مدلسازی، برازش و تخمین
- داده کاوی (Data Mining) — از صفر تا صد
- زبان برنامهنویسی پایتون (Python) — از صفر تا صد
- یادگیری علم داده (Data Science) با پایتون — از صفر تا صد
^^