درخت تصمیم‌گیری در یادگیری ماشین


درخت تصمیم‌گیری (Decision Tree)

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

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

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

سن تجربه 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

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

روش کار

ابتدا ما باید ماژول‌های مورد نیاز را وارد کنیم و داده‌ها را با استفاده از pandas بخوانیم:

نمونه

داده‌ها را بخوانید و چاپ کنید:

import pandas
from sklearn import tree
import pydotplus
from sklearn.tree import DecisionTreeClassifier
import matplotlib.pyplot as plt
import matplotlib.image as pltimg
df = pandas.read_csv("shows.csv")
print(df)

اجرای نمونه

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

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

Pandas یک map() این روش، یک دیکشنری می‌پذیرد که شامل اطلاعات مربوط به نحوه تبدیل مقادیر است.

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

این به معنای تبدیل مقادیر 'UK' به 0، 'USA' به 1 و 'N' به 2 است.

نمونه

مقادیر زبانی را به عددی تبدیل کنید:

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

اجرای نمونه

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

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

نمونه

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

features = ['Age', 'Experience', 'Rank', 'Nationality']
X = df[features]
y = df['Go']
print(X)
print(y)

اجرای نمونه

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

نمونه

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

dtree = DecisionTreeClassifier()
dtree = dtree.fit(X, y)
data = tree.export_graphviz(dtree, out_file=None, feature_names=features)
graph = pydotplus.graph_from_dot_data(data)
graph.write_png('mydecisiontree.png')
img=pltimg.imread('mydecisiontree.png')
imgplot = plt.imshow(img)
plt.show()

اجرای نمونه

توضیح نتایج

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

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


Rank

Rank <= 6.5 نشان‌دهنده این است که بازیگران کمدی با رتبه کمتر از 6.5 به دنبال خواهند رفت: True پیکان (در سمت چپ)، بقیه نیز به همین ترتیب. False پیکان (در سمت راست).

gini = 0.497 نشان‌دهنده کیفیت تقسیم است و همیشه عددی بین 0.0 تا 0.5 است، که 0.0 نشان‌دهنده این است که همه نمونه‌ها به نتایج مشابهی دست یافته‌اند و 0.5 نشان‌دهنده این است که تقسیم کاملاً در وسط انجام شده است.

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

value = [6, 7] نشان‌دهنده این است که در این 13 بازیگر کمدی، 6 نفر "NO" خواهند گرفت و 7 نفر "GO".

Gini

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

روش Gini با استفاده از فرمول زیر استفاده می‌شود:

Gini = 1 - (x/n)2 - (y/n)2

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

1 - (7 / 13)2 - (6 / 13)2 = 0.497


مرحله بعد شامل دو قاب است، یکی برای بازیگران کمدی که 'Rank' آن‌ها 6.5 یا پایین‌تر است و بقیه یک قاب.

True - 5 بازیگر کمدی در اینجا به پایان می‌رسند:

gini = 0.0 نشان‌دهنده این است که همه نمونه‌ها به نتایج مشابهی دست یافته‌اند.

samples = 5 نشان‌دهنده این است که در این شاخه هنوز 5 بازیگر کمدی باقی مانده است (5 بازیگر با درجه 6.5 یا پایین‌تر).

value = [5, 0] این به این معناست که 5 "NO" دریافت خواهد کرد و 0 "GO".

False - هشت بازیگر تئاتر ادامه دادند:

Nationality (ملیت)

Nationality <= 0.5 این به این معناست که بازیگران کمدی با ارزش ملی کمتر از 0.5 باید از پرچم چپ پیروی کنند (این به این معناست که همه‌ی افراد بریتانیایی).

gini = 0.219 این به این معناست که حدود 22% از نمونه‌ها در یک جهت حرکت خواهند کرد.

samples = 8 این به این معناست که هنوز هشت بازیگر کمدی در این شاخه باقی مانده است (هشت بازیگر کمدی با رتبه بالاتر از 6.5).

value = [1, 7] این به این معناست که در این هشت بازیگر کمدی، یک نفر "NO" دریافت خواهد کرد و هفت نفر "GO".


True - چهار بازیگر تئاتر ادامه دادند:

Age (سن)

Age <= 35.5 این به این معناست که بازیگران کمدی با سن 35.5 سال یا کمتر باید از پرچم چپ پیروی کنند و بقیه از پرچم راست.

gini = 0.375 این به این معناست که حدود 37.5% از نمونه‌ها در یک جهت حرکت خواهند کرد.

samples = 4 این به این معناست که هنوز چهار بازیگر کمدی در این شاخه باقی مانده است (چهار بازیگر کمدی از بریتانیا).

value = [1, 3] این به این معناست که در این چهار بازیگر کمدی، یک نفر "NO" دریافت خواهد کرد و سه نفر "GO".

False - چهار بازیگر کمدی به اینجا رسیدند:

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

samples = 4 این به این معناست که هنوز چهار بازیگر کمدی در این شاخه باقی مانده است (چهار بازیگر کمدی از بریتانیا).

value = [0, 4] این به این معناست که در این چهار بازیگر کمدی، 0 "NO" دریافت خواهند کرد و 4 "GO".


True - دو بازیگر کمدی در اینجا پایان یافتند:

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

samples = 2 این به این معناست که هنوز دو بازیگر کمدی در این شاخه باقی مانده است (دو بازیگر کمدی 35.5 سال یا جوان‌تر).

value = [0, 2] این به این معناست که در این دو بازیگر کمدی، 0 "NO" دریافت خواهند کرد و 2 "GO".

False - دو بازیگر تئاتر ادامه دادند:

Experience (تجربه)

Experience <= 9.5 این به این معناست که بازیگران کمدی با تجربه 9.5 سال یا بیشتر باید از پرچم چپ پیروی کنند و بقیه از پرچم راست.

gini = 0.5 این به این معناست که 50% از نمونه‌ها در یک جهت حرکت خواهند کرد.

samples = 2 این به این معناست که هنوز دو بازیگر کمدی در این شاخه باقی مانده است (دو بازیگر کمدی با سن بالاتر از 35.5).

value = [1, 1] این به این معناست که یکی از این دو بازیگر کمدی "NO" دریافت خواهد کرد و دیگری "GO".


در اینجا یک بازیگر کمدی پایان یافت: True - 1

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

samples = 1 نشان‌دهنده این است که در این شاخه هنوز 1 بازیگر کمدی باقی مانده است (یکی از آنها بازیگر کمدی با تجربه 9.5 سال یا کمتر است).

value = [0, 1] نشان‌دهنده این است که 0 نشان‌دهنده "NO" و 1 نشان‌دهنده "GO" است.

False - 1 بازیگر کمدی تا اینجا آمده است:

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

samples = 1 نشان‌دهنده این است که در این شاخه هنوز 1 بازیگر کمدی باقی مانده است (یکی از آنها بازیگر کمدی با تجربه بیش از 9.5 سال است).

value = [1, 0] 1 نشان‌دهنده "NO" و 0 نشان‌دهنده "GO" است.

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

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

مثلاً: آیا باید برنامه‌ای را که توسط یک بازیگر کمدی 40 ساله آمریکایی با 10 سال تجربه اجرا می‌شود و رتبه کمدی 7 دارد، ببینم؟

نمونه

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

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

اجرای نمونه

نمونه

اگر درجه کمدی 6 باشد، پاسخ چیست؟

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

اجرای نمونه

نتایج متفاوت

اگر به اندازه کافی بارگذاری شود، حتی اگر داده‌های ورودی شما مشابه باشد، درخت تصمیم‌گیری نتایج متفاوتی به شما ارائه خواهد داد.

این به این دلیل است که درخت تصمیم‌گیری نمی‌تواند به ما پاسخ 100% قطعی دهد. آن بر اساس احتمالات نتایج است، بنابراین پاسخ‌ها متفاوت خواهد بود.