درخت تصمیمگیری در یادگیری ماشین
- صفحه قبلی تدریب/تست
- صفحه بعدی MySQL مقدماتی

درخت تصمیمگیری (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% قطعی دهد. آن بر اساس احتمالات نتایج است، بنابراین پاسخها متفاوت خواهد بود.
- صفحه قبلی تدریب/تست
- صفحه بعدی MySQL مقدماتی