درخت تصمیم
در این بخش نحوه ایجاد یک «درخت تصمیم» را به شما نشان خواهیم داد. درخت تصمیم یک فلوچارت است و میتواند در تصمیم گیری براساس تجربههای قبلی به شما کمک کند.[۱]
در این مثال، شخصی تصمیم خواهد گرفت که آیا او میتواند یک نمایش کمدی اجرا کند یا نه.
خوشبختانه شخص مثال ما هربار که یک نمایش کمدی در شهر برگزار شده را ثبت کردهاست و برخی از اطلاعات مربوط به کمدین و همچنین اینکه او به نمایش رفته یا نه را ثبت کردهاست.
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]]))
نتایج مختلف
خواهید دید که اگر درخت تصمیم را به تعداد دفعات کافی اجرا کنید، نتایج مختلفی به شما ارائه میدهد، حتی اگر دادههای یکسان به آن دهید.
این مسئله به این دلیل است که درخت تصمیم یک پاسخ قطعی ۱۰۰٪ به ما نمیدهد. این پاسخ بر پایه احتمال یک خروجی است و پاسخ متفاوت خواهد بود.
منابع آموزشی