درخت تصمیم

از ویکی‌کد، دانشنامهٔ برنامه‌نویسی
پرش به ناوبری پرش به جستجو
Main Page Tutorial
Python-menu.png
موارد آموزشی
مدیریت فایل
یادگیری ماشین
۱شروع کار
۲میانگین، میانه، مُد
۳انحراف استاندارد
۴صدک
۵توزیع داده
۶توزیع داده نرمال
۷نمودار پراکندگی
۸رگرسیون خطی
۹رگرسیون چند جمله‌ای
۱۰رگرسیون چندگانه
۱۱مقیاس
۱۲آموزش / تست
۱۳درخت تصمیم
MySQL در پایتون
MongoDB در پایتون
مرجع پایتون
مرجع ماژول
چگونه در پایتون؟
مثال‌های پایتون


در این بخش نحوه ایجاد یک «درخت تصمیم» را به شما نشان خواهیم داد. درخت تصمیم یک فلوچارت است و می‌تواند در تصمیم گیری براساس تجربه‌های قبلی به شما کمک کند.[۱]

در این مثال، شخصی تصمیم خواهد گرفت که آیا او می‌تواند یک نمایش کمدی اجرا کند یا نه.

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

Age Experience Rank Nationality Go
36 10 9 UK NO
42 12 4 USA NO
23 4 6 N NO
52 4 4 USA NO
43 21 8 USA YES
44 14 5 UK NO
66 3 7 N YES
35 14 9 UK YES
52 13 7 N YES
35 5 9 N YES
24 3 5 USA NO
18 3 7 UK YES
45 9 9 UK YES

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

چگونه کار می کند؟

ابتدا، ماژول‌هایی را که نیاز داریم Import کرده و مجموعه داده را با pandas می‌خوانیم:

مثال

مجموعه را می‌خواند و چاپ می‌کند:

 1 import pandas
 2 from sklearn import tree
 3 import pydotplus
 4 from sklearn.tree import DecisionTreeClassifier
 5 import matplotlib.pyplot as plt
 6 import matplotlib.image as pltimg
 7 
 8 df = pandas.read_csv("shows.csv")
 9 
10 print(df)


مشاهدهٔ نتیجه


برای ایجاد یک درخت تصمیم، همهٔ داده‌ها باید عددی باشند.

باید ستون‌های غیرعددی مانند 'Nationality' و 'Go' به مقدارهای عددی تبدیل کنیم.

Pandas یک متد map() دارد که یک دیکشنری را با اطلاعاتی در مورد چگونگی تبدیل اطلاعت می‌گیرد.

{'UK': 0, 'USA': 1, 'N': 2}

یعنی مقدارهای ‘UK’ به ۰ و ‘N’ به ۲ را تبدیل می‌کند.

مثال

تغییر مقدارهای رشته‌ای به مقدارهای عددی:

1 d = {'UK': 0, 'USA': 1, 'N': 2}
2 df['Nationality'] = df['Nationality'].map(d)
3 d = {'YES': 1, 'NO': 0}
4 df['Go'] = df['Go'].map(d)
5 
6 print(df)


مشاهدهٔ نتیجه


سپس باید ستون‌های feature (به انگلیسی: ویژگی‌ها) را از ستون target (به انگلیسی: هدف) جدا کنیم.

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

مثال

X ستون‌های ویژگی است، y ستون هدف است:

1 features = ['Age', 'Experience', 'Rank', 'Nationality']
2 
3 X = df[features]
4 y = df['Go']
5 
6 print(X)
7 print(y)


مشاهدهٔ نتیجه


حال می‌توانیم درخت تصمیم واقعی را پیش بینی کنیم، آن را با جزئیات خود سازگار کنیم و یک فایل .png در کامپیوتر ذخیره کنیم:

مثال

یک درخت تصمیم ایجاد می‌کند، آن را بعنوان یک تصویر ذخیره می‌کند و تصویر را نشان می‌دهد:

1 dtree = DecisionTreeClassifier()
2 dtree = dtree.fit(X, y)
3 data = tree.export_graphviz(dtree, out_file=None, feature_names=features)
4 graph = pydotplus.graph_from_dot_data(data)
5 graph.write_png('mydecisiontree.png')
6 
7 img=pltimg.imread('mydecisiontree.png')
8 imgplot = plt.imshow(img)
9 plt.show()


مشاهدهٔ نتیجه


توضیح نتیجه

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

می‌خواهیم جنبه‌های مختلف درخت تصمیم را بخوانیم:

رتبه (به انگلیسی: Rank)

Rank <= 6.5 یعنی کمدین با رتبه ۶٫۵ یا پایین‌تر به سمت Trueمی‌رود (سمت چپ) و بقیه به سمت False می‌روند (سمت راست).

gini = 0.497 به کیفیت جداسازی برمی گردد، و همیشه عددی بین ۰٫۰ و ۰٫۵ است که ۰٫۰ به معنی همه نمونه‌های مشابه است و ۰٫۵ نشان دهنده این است که تقسیم دقیقاً در وسط انجام می‌شود. (دقیقاً نصف نمونه‌ها در یک گروه و نصف نمونه‌ها در گروه دیگر است).

samples = 13 یعنی ۱۳ کمدین در این نقطه از تصمیم‌گیری باقیمانده است که همه آنها را شامل می‌شود، زیرا اینجا مرحله اول است.

value = [6, 7] یعنی در بین این ۱۳ کمدین، ۶ تا “NO” می‌گیرند و ۷ تا “GO”.

Gini

روش‌های بسیاری برای تقسیم نمونه‌ها وجود دارد، ما از متد GINI در این آموزش استفاده می‌کنیم.

متد Gini از این فرمول استفاده می‌کند:

Gini = 1 - (x/n)<sup>2</sup> (y/n)<sup>2</sup>

که در آن x تعداد پاسخ‌های مثبت ("GO") است، n تعداد نمونه هاست، y تعداد پاسخ‌های منفی ("NO") است که این محاسبه را به ما می‌دهد:

1 - (7 / 13)<sup>2</sup> - (6 / 13)<sup>2</sup> = 0.497

مرحله بعدی شامل دو جعبه می‌شود، یک جعبه برای کمدین‌های با ‘Rank’ ۶٫۵ یا پایین‌تر و یک جعبه برای بقیه.

True - در این قسمت ۵ کمدین در اینجا خاتمه می‌یابند

=gini = 0.0 یعنی همهٔ نمونه‌ها نتیجه مشابه دارند.

samples = 5 یعنی ۵ کمدین در این شاخه باقی می‌مانند (۵ کمدین با رتبه ۶٫۵ یا کمتر)

value = [5, 0] یعنی ۵ تا “NO” و ۰ تا “GO” می‌گیرند.

False - در این قسمت ۸ کمدین ادامه دارند

ملیت

Nationality <= 0.5 یعنی کمدین‌هایی با مقدار nationality کمتر ۰٫۵ به سمت چپ می‌روند (که یعنی همه از UK هستند) و بقیه به سمت راست می‌روند.

gini = 0.219 یعنی حدود ۲۲٪ نمونه‌ها به یک جهت می‌روند.

samples = 8 یعنی ۸ کمدین وجود در این شاخه باقی مانده‌اند (۸ کمدین با رتبه بالاتر از ۶٫۵)

value = [1, 7] یعنی در بین این ۸ کمدین، یکی "NO" و ۷ تای دیگر "GO" می‌گیرند.

True - در این قسمت ۴ کمدین ادامه می‌یابند

سن

Age <= 35.5 یعنی کمدین‌هایی با ۳۵٫۵ سن یا جوانتر به سمت چپ می‌روند و بقیه به سمت راست می‌روند.

gini = 0.375 یعنی حدود ۳۷٬۵٪ نمونه‌ها به یک سمت می‌روند.

samples = 4 یعنی ۴ کمدین در این شاخه باقی می‌مانند (۴ کمدین از UK هستند).

value = [1, 3] یعنی در بین این ۴ کمدین، یکی “NO” و ۳ تا “GO” می‌گیرند.

False - در این قسمت ۴ کمدین ادامه می‌یابند

gini = 0.0 یعنی همه نمونه‌ها نتیجه مشابه دارند.

samples = 4 یعنی ۴ کمدین در این شاخه باقی مانده‌اند (۴ کمدین از UK نیستند).

value = [0, 4] یعنی در بین این ۴ کمدین، ۰ تا "NO" و ۴ تا “GO” می‌گیرند.

True - در این قسمت ۲ کمدین ادامه می‌یابند

gini = 0.0 یعنی همه نمونه‌ها نتیجه مشابه دارند.

samples = 2 یعنی ۲ کمدین در این شاخه باقی مانده‌اند (۲ کمدین با سن ۳۵٫۵ یا جوانتر)

value = [0, 2] یعنی در بین این ۲ کمدین، ۰ تا "NO" و ۴ تا “GO” می‌گیرند.

False - در این قسمت ۲ کمدین ادامه می‌یابند

تجربه

Experience <= 9.5 یعنی کمدین‌هایی با ۹٫۵ سال تجربه، یا بیشتر، به سمت چپ و مابقی به سمت راست می‌روند.

gini = 0.5 یعنی ۵۰٪ نمونه‌ها به یک جهت می‌روند.

samples = 2 یعنی ۲ کمدین در شاخه چپ وجود دارند (۲ کمدین بزرگتر از ۳۵٫۵ هستند).

value = [1, 1] یعنی در بین این ۲ کمدین، یکی “NO” و یکی “GO” می‌گیرد.

True - در این قسمت ۱ کمدین در اینجا خاتمه می‌یابند

gini = 0.0 یعنی همه نمونه‌ها نتیجه مشابه دارند.

samples = 1 یعنی ۱ کمدین در شاخه چپ وجود دارند (۲ کمدین با ۹٫۵ سال تجربه یا کمتر).

value = [0, 1]یعنی ۰ کمدین “NO” و یکی “GO” می‌گیرد.

False - در این قسمت ۱ کمدین در اینجا خاتمه می‌یابند

gini = 0.0 یعنی همه نمونه‌ها نتیجه مشابه دارند.

samples = 1 یعنی ۱ کمدین در شاخه چپ وجود دارند (۲ کمدین با بیش از ۹٫۵ سال تجربه).

value = [1, 0] یعنی ۱ کمدین “NO” و ۰ کمدین“GO” می‌گیرد.

پیش بینی مقدارها

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

مثال: آیا باید به نمایش کمدین آمریکایی ۴۰ ساله، با ۱۰ سال تجربه و رتبه کمدی ۷ بروم؟

مثال

از متد predict() برای پیش بینی مقدارها استفاده می‌کند:

print(dtree.predict([[40, 10, 7, 1]]))


مشاهدهٔ نتیجه


مثال

اگر رتبه کمدی ۶ بود جواب چه می‌شد؟

print(dtree.predict([[40, 10, 6, 1]]))


مشاهدهٔ نتیجه


نتایج مختلف

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

این مسئله به این دلیل است که درخت تصمیم یک پاسخ قطعی ۱۰۰٪ به ما نمی‌دهد. این پاسخ بر پایه احتمال یک خروجی است و پاسخ متفاوت خواهد بود.


منابع آموزشی