در نوشته   آموزش دادیم که درخت تصمیم یک الگوریتم یادگیری نظارت شده (Supervised Learning Algorithm) است که هم برای کلاس بندی و هم برای رگرسیون به کار می رود. از این الگوریتم برای ایجاد مدل (Model) کمک گرفته می شود که این مدل بوسیله مجموعه ای از قوانین تصمصم گیری درون ویژگی های (ورودی ها، متغیرهای مستقل) مجموعه داده ها ایجاد می شود و در نهایت از مدل برای پیش بینی مقدار خروجی (برچسب، متغیر وابسته، Target) کمک گرفته خواهد شد.

همانطور که پیش از این نیز گفتیم، می توانید درخت تصمیم را به صورت مجموعه ای از عبارت های if … then در نظر بگیرید. در ریشه درخت تصمیم، تمامی نمونه داده ها به ازای بهترین ویژگی (Feature) وجود دارند و سپس بر اساس قانون، زیر شاخه هایی (زیر درخت هایی) ایجاد خواهد شد. در این مطلب می خواهیم دو کلاس DecisionTreeClassifier و DecisionTreeRegressor از ماژول tree در کتابخانه Scikirt-Learn را با مثال ساده و ابتدایی آموزش دهیم. همچنین در ادامه یاد می دهیم چگونه بوسیله Graphviz درخت تصمیم ایجاد شده را نمایش دهیم.

کلاس DecisionTreeClassifier

کلاس DecisionTreeClassifier را می توانیم برای کلاس بندهای چند کلاس (Multi-Class Classification) به کار بگیریم. متد ()fit از کلاس DecisionTreeClassifier دو آرایه ورودی را دریافت می کند که یکی برابر با مجموعه داده های یادگیری (Training Data) و دیگری برابر با برچسب ها یا همان کلاس ها است. کار با این کلاس بسیار ساده است و در ادامه توضیح داده ایم که چگونه درخت تصمیم مجموعه داده Iris درون کتابخانه Scikit-Learn را ایجاد کنیم. در کدهای زیر چندین متد و ماژول از کتابخانه Scikt-Learn به درون برنامه ضمیمه شده اند.

در ابتدا متد ()load_iris از ماژول sklearn.datasets به برنامه ضمیمه شده است با بتوانیم با اجرای این متد، داده های درون مجموعه داده Iris را بارگذاری کنیم. لطفا پیش از هر چیز برای آگاهی بیشتر در این مورد، مطلب لینک زیر را بخوانید. در خط دوم ماژول tree از sklearn ضمیمه شده است که دو کلاس DecisionTreeClassifier و DecisionTreeRegressor در آن وجود دارند. در خط سوم متد () train_test_split از ماژول sklearn.model_selection ضمیمه شده است که پیش از این آنرا آموزش داده ایم و برای شکستن مجموعه داده به دو زیر مجموعه یادگیری (Training Data) و آزمایش (Test Data) به کار گرفته می شود.

بارگذاری داده ها در کتابخانه Scikit-Learn

در کدهای زیر به ترتیب مجموعه داده های Iris بارگذاری و نام ویژگی ها و برچسب های آن نمایش داده می شوند. تاکید می کنم پیش از هر چیز و برای درک بهتر کدهای زیر حتما مطلب بارگذاری داده ها در کتابخانه Scikit-Learn را بخوانید.

در کد زیر و بوسیله متد ()train_test_split مجموعه داده Iris را به دو زیر مجموعه یادگیری و آزمایش شکسته ایم که ۸۰ در صد از آن  به عنوان مجموعه داده یادگیری و ۲۰ در صد دیگر به عنوان مجموعه داده آزمایش خواهد بود.

ساخت شی از کلاس DecisionTreeClassfier

در کدهای زیر نوبت به ایجاد یک شی (نمونه) از کلاس DecisionTreeClassifier می رسد که سپس از آن و مطابق کدهای زیر متد ()fit از این کلاس را فراخوانی خواهیم کرد. توجه کنید که X_train همان مجموعه ویژگی ها و y_test همان مجموعه برچسب ها هستند که به متد ()fit فرستاده شده اند.

رسم نمودار درخت تصمیم بوسیله Graphviz

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

و در نهایت پس از اتمام نصب Brew، بازهم از خط فرمان دستور زیر را اجرا کنید تا در نهایت Graphviz نیز نصب شود.

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

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

در این مطلب نمی خواهیم در مورد Graphviz آموزش دهیم بلکه می خواهیم از آن برای نمایش درخت تصمیم درون Jupyter Notebook کمک بگیریم. برای ایجاد یک فایل Graphviz که پسوند آن dot است، در ماژول کتابخانه Scikit-Learn متدی به نام ()export_graphviz وجود دارد که نخستین آرگومان آن نام شی است که پیش از این و در کدهای بالا از روی کلاس DecisionTreeClassifier ایجاد کرده بودیم که نام آن در کد زیر dtree است.

در کد بالا آرگومان دوم، یعنی out_file نام و مسیر فایل با پسوند dot را تعیین می کند که در این کد در هان جایی ایجاد می شود که فایل برنامه وجود دارد. آرگومان های feature_names و class_names نیز به ترتیب با مقدارهای ویژگی های Iris و Target های (برچسب های) Iris مقداردهی می شوند.

دیگر آرگومان ها بر روی نمایش درخت تصمیم اثر می گذارند. به طور نمونه، اگر آرگومان rounded برابر با True باشد، پس گوشه های هر مستطیل که نماینده یک گره است، به صورت خمیده خواهد بود. اگر آرگومان filled برابر با True باشد، پس گره ها به صورت رنگی پر خواهند شد.

تا به اینجا آنچه که آموزش دادیم این بود که بوسیله متد ()export_graphviz فایلی به پسوند dot را آماده کنیم که پس از این آنرا می خواهیم به یک فرمت تصویر مانند png تبدیل کنیم. توجه کنید نام فایل dot بوسیله آرگومان out_file از متد ()export_graphviz مشخص می شود که در کد بالا، نام این فایل tree.dot است.

در دستورهای بالا، ابتدا متد call از ماژول subprocess به درون برنامه ضمیمه می شود. از این متد می خواهیم برای فراخوانی و اجرای یک دستور به نام dot و آرگومان های آن دستور کمک بگیریم. در واقع دستور بالا برابر با دستور زیر در خط فرمان است.

هدف از این دستور تبدیل فایل tree.dot به فایل tree.png است. پس از اینکه دستور با موفقیت اجرا شد، باید بوسیله کلاس Image از ماژول Ipython باید تصویر png ایجاد شده را درون Jupyter Notebook نمایش دهیم.

تفسیر درخت تصمیم ایجاد شده

درنهایت پس از اجرای کلاس Image باید تصویر درخت تصمیم در Jupyter Notebook نمایش داده شود. در این بخش می خواهیم آنرا تفسیر کنیم. پیش از این گفته بودیم که گره ریشه (Root Note) شامل تمامی مجموعه داده ها یا به عبارت دیگر شامل تمامی نمونه ها یا مشاهده ها (Sample or Observation) است. در شکل زیر میتوانید ببینید که ۱۲۰ نمونه در گره ریشه وجود دارند.

اما چرا ۱۲۰ نمونه، در حالی که تعداد نمونه های مجموعه داده Iris برابر با ۱۵۰ است؟ به این خاطر که در مطلب  از متد ()train_test_split برای شکستن مجموعه داده به زیر مجموعه های یادگیری و آزمایش کمک گرفتیم که ۸۰ درصد از ۱۵۰ نمونه برای مجموعه یادگیری که برابر با ۱۲۰ نمونه است و ۲۰ در صد باقیمانده که برابر با ۳۰ نمونه است را به مجموعه آزمایش اختصاص داده ایم.

اگر به گره ریشه در شکل بالا دقت کنید می توانید نخستین قانون را ببنید که اگر مقدار ویژگی Petal Width کوچتر و یا مساوی ۰.۸ (هشت دهم) باشد، پس این گونه گیاهی جز کلاس یا دسته Setosa خواهد بود. با توجه به ساختار مجموعه داده یادگیری که به ازای هر کلاس، ۴۰ نمونه وجود دارد، در شکل زیر می توانید ببینید که همه نمونه های Setosa دارای Petal Width کوچکتر یا مساوی ۰.۸ هستند.

همچنین در شکل بالا می توانید ببینید که اگر Petal Width بزرگتر از ۰.۸ باشد، پس جز یکی از کلاس های  یا  خواهد بود. بنابراین می توانید با خواندن این درختواره، مدل ایجاد شده توسط الگوریتم درخت تصمیم را درک کنید و حتی با ورود داده های تازه (یا مقدارهای تازه برای ویژگی ها)، خودتان با پیمایش گره های درخت، می توانید کلاس ویژگی ها را پیدا کنید.

در برخی از درخت های ایجاد شده ممکن است به جای نام ویژگی، کاراکترهای X0, X1 و غیره به کار روند که به ترتیب به نخستین، دومین ویژگی اشاره دارند. پس در این مطلب چون Petal Width برابر با چهارمین ویژگی است، پس شاید X3 به جای آن نشان داده شود.

پیش بینی بوسیله مدل ایجاد شده

پس از ایجاد مدل، نوبت به انجام پیش بینی بوسیله آن می شود، که این کار با ورود داده های از پیش دیده نشده انجام می شود. مانند هر کلاس الگوریتم یادگیری دیگری در کتابخانه Scikit-Learn، متد ()predict وجود دارد که بوسیله آن پیش بینی را انجام می دهیم. در این مطلب چون مجموعه داده دارای ۴ ویژگی بود، پس باید یک لیست از لیست ها از عددها به متد ()predict فرستاده شود، در غیر این صورت و در صورت کم یا زیاد بودن عددهای فرستاده شده در لیست، خطای شکل زیر نشان داده خواهد شد.

ولی در شکل زیر یک لیست شامل مقدارهای چهار ویژگی به متد ()predict فرستاده شده است که خروجی آن عدد ۲ است که برابر با سومین کلاس، یعنی Virginica است. همچنین در شکل زیر می بینید که چندین لیست از مقدارهای ویژگی ها به متد ()predict فرستاده شده است.

در کد زیر از شرط کمک گرفته ای تا خروجی را به گونه بهتری نمایش دهیم . توجه کنید کلاس نخست Setosa با اندیس صفر و کلاس دوم Versicolour با اندیس ۱ و کلاس سوم Virginica با اندیس ۲ است. از این نشانی می توانید کدهای به کار رفته در این نوشته را دانلود کنید.