التعلم الآلي - شجرة القرار
شجرة القرار
في هذا الفصل سوف نوضح لك كيفية عمل "شجرة قرارات". شجرة القرار هي مخطط انسيابي ، ويمكن أن تساعدك في اتخاذ القرارات بناءً على الخبرة السابقة.
في المثال ، سيحاول الشخص أن يقرر ما إذا كان يجب عليه / عليها الذهاب إلى عرض كوميدي أم لا.
لحسن الحظ ، قام شخص مثالنا بالتسجيل في كل مرة كان هناك عرض كوميدي في المدينة ، وقام بتسجيل بعض المعلومات حول الممثل الكوميدي ، كما تم تسجيله إذا ذهب أم لا.
عمر | خبرة | مرتبة | جنسية | يذهب |
36 | 10 | 9 | المملكة المتحدة | رقم |
42 | 12 | 4 | الولايات المتحدة الأمريكية | رقم |
23 | 4 | 6 | ن | رقم |
52 | 4 | 4 | الولايات المتحدة الأمريكية | رقم |
43 | 21 | 8 | الولايات المتحدة الأمريكية | نعم |
44 | 14 | 5 | المملكة المتحدة | رقم |
66 | 3 | 7 | ن | نعم |
35 | 14 | 9 | المملكة المتحدة | نعم |
52 | 13 | 7 | ن | نعم |
35 | 5 | 9 | ن | نعم |
24 | 3 | 5 | الولايات المتحدة الأمريكية | رقم |
18 | 3 | 7 | المملكة المتحدة | نعم |
45 | 9 | 9 | المملكة المتحدة | نعم |
الآن ، بناءً على مجموعة البيانات هذه ، يمكن لـ Python إنشاء شجرة قرار يمكن استخدامها لتحديد ما إذا كانت أي عروض جديدة تستحق الحضور.
كيف يعمل؟
أولاً ، قم باستيراد الوحدات التي تحتاجها ، واقرأ مجموعة البيانات باستخدام الباندا:
مثال
قراءة وطباعة مجموعة البيانات:
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)
لصنع شجرة قرار ، يجب أن تكون جميع البيانات رقمية.
علينا تحويل العمودين غير العدديين "الجنسية" و "الذهاب" إلى قيم عددية.
لدى 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 <= 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 على "لا" ، وسيحصل 7 على "GO".
جيني
هناك طرق عديدة لتقسيم العينات ، نستخدم طريقة GINI في هذا البرنامج التعليمي.
تستخدم طريقة جيني هذه الصيغة:
Gini = 1 - (x/n)2 - (y/n)2
أين x
هو عدد الإجابات الإيجابية ("GO") ،
n
وعدد العينات ،
y
وعدد الإجابات السلبية ("NO") ، مما يعطينا هذا الحساب:
1 - (7 / 13)2 - (6 / 13)2 = 0.497
تحتوي الخطوة التالية على صندوقين ، صندوق واحد للممثلين الكوميديين الحاصلين على "رتبة" 6.5 أو أقل ، ومربع واحد بالباقي.
صحيح - ينتهي 5 كوميديين هنا:
gini = 0.0
يعني أن جميع العينات حصلت على نفس النتيجة.
samples = 5
يعني أن هناك 5 فنانين كوميديين بقوا في هذا الفرع (5 فنانين كوميديين بدرجة 6.5 أو أقل).
value = [5, 0]
يعني أن الرقم 5 سيحصل على "NO" و 0 سيحصل على "GO".
خطأ - 8 فنانين كوميديين يتابعون:
جنسية
Nationality <= 0.5
يعني أن الكوميديين الذين تقل قيمة الجنسية لديهم عن 0.5 سيتبعون السهم الموجود على اليسار (مما يعني كل شخص من المملكة المتحدة) ، وسيتبع البقية السهم إلى اليمين.
gini = 0.219
يعني أن حوالي 22٪ من العينات ستذهب في اتجاه واحد.
samples = 8
يعني أن هناك 8 فنانين كوميديين بقوا في هذا الفرع (8 كوميديين بدرجة أعلى من 6.5).
value = [1, 7]
يعني أنه من بين هؤلاء الكوميديين الثمانية ، سيحصل 1 على "لا" و 7 سيحصل على "GO".
صحيح - يتابع 4 كوميديين:
عمر
Age <= 35.5
يعني أن الكوميديين في سن 35.5 أو أقل سيتبعون السهم إلى اليسار ، وسيتبع الباقون السهم إلى اليمين.
gini = 0.375
يعني أن حوالي 37.5٪ من العينات ستذهب في اتجاه واحد.
samples = 4
يعني أن هناك 4 فنانين كوميديين بقوا في هذا الفرع (4 كوميديين من المملكة المتحدة).
value = [1, 3]
يعني أن من بين هؤلاء الكوميديين الأربعة ، 1 سيحصل على "لا" و 3 سيحصل على "GO".
خطأ - ينتهي 4 فنانين كوميديين هنا:
gini = 0.0
يعني أن جميع العينات حصلت على نفس النتيجة.
samples = 4
يعني أن هناك 4 فنانين كوميديين بقوا في هذا الفرع (4 كوميديين ليسوا من المملكة المتحدة).
value = [0, 4]
يعني أنه من بين هؤلاء الكوميديين الأربعة ، سيحصل 0 على "لا" وسيحصل 4 على "GO".
صحيح - ينتهي اثنان من الكوميديين هنا:
gini = 0.0
يعني أن جميع العينات حصلت على نفس النتيجة.
samples = 2
يعني أن هناك فنانين كوميديين متبقين في هذا الفرع (ممثلان كوميديان في سن 35.5 أو أقل).
value = [0, 2]
يعني أنه من بين هذين الكوميديين ، سيحصل 0 على "NO" وسيحصل 2 على "GO".
خطأ - يستمر اثنان من الكوميديين:
خبرة
Experience <= 9.5
يعني أن الكوميديين الذين لديهم 9.5 سنوات من الخبرة ، أو أقل ، سيتبعون السهم إلى اليسار ، والباقي سيتبعون السهم إلى اليمين.
gini = 0.5
يعني أن 50٪ من العينات ستذهب في اتجاه واحد.
samples = 2
يعني أن هناك فنانين كوميديين متبقين في هذا الفرع (ممثلان كوميديان أكبر من 35.5 عامًا).
value = [1, 1]
يعني أنه من بين هذين الكوميديين ، سيحصل 1 على "لا" والآخر سيحصل على "GO".
صحيح - ينتهي ممثل كوميدي واحد هنا:
gini = 0.0
يعني أن جميع العينات حصلت على نفس النتيجة.
samples = 1
يعني أنه لا يزال هناك ممثل كوميدي واحد في هذا الفرع (ممثل كوميدي واحد لديه خبرة 9.5 سنوات أو أقل).
value = [0, 1]
يعني أن 0 سيحصل على "NO" وسيحصل 1 على "GO".
خطأ - ينتهي ممثل كوميدي واحد هنا:
gini = 0.0
يعني أن جميع العينات حصلت على نفس النتيجة.
samples = 1
يعني أنه لا يزال هناك ممثل كوميدي واحد في هذا الفرع (ممثل كوميدي واحد يتمتع بخبرة تزيد عن 9.5 سنوات).
value = [1, 0]
يعني أن 1 سيحصل على "NO" و 0 سيحصل على "GO".
توقع القيم
يمكننا استخدام شجرة القرار للتنبؤ بالقيم الجديدة.
مثال: هل يجب أن أذهب لمشاهدة عرض بطولة فنان كوميدي أمريكي يبلغ من العمر 40 عامًا ، ولديه 10 سنوات من الخبرة ، وترتيب كوميدي في المرتبة 7؟
مثال
استخدم طريقة التنبؤ () للتنبؤ بالقيم الجديدة:
print(dtree.predict([[40, 10, 7, 1]]))
مثال
ماذا سيكون الجواب لو كانت مرتبة الكوميديا 6؟
print(dtree.predict([[40, 10, 6, 1]]))
نتائج مختلفة
سترى أن شجرة القرار تمنحك نتائج مختلفة إذا قمت بتشغيلها مرات كافية ، حتى إذا قمت بإطعامها بنفس البيانات.
وذلك لأن شجرة القرار لا تعطينا إجابة مؤكدة بنسبة 100٪. يعتمد على احتمال وجود نتيجة ، وستختلف الإجابة.