شجرة القرار في التعلم الآلي

شجرة القرار (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()
الطريقة، التي تأخذ دictionary تحتوي على معلومات حول كيفية تحويل القيم.
{'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
تمثل أن الكوميديون الذين لديهم 'Rank' أقل من 6.5 سيفعلون صحيح
السهم (إلى اليسار)، والباقي يتبع خطأ
السهم (إلى اليمين).
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 أو أقل، والآخر هو مربع.
صحيح - انتهت 5 كوميديون هنا:
gini = 0.0
تمثل أن جميع العينات قد حصلت على نفس النتيجة.
samples = 5
تمثل أن هناك ما يزال 5 ممثلون كوميديون في هذا الفرع (معدل الكوميديون 5 هو 6.5 أو أقل).
value = [5, 0]
يُشير إلى أن 5 سيحصل على "لا" و0 سيحصل على "نعم".
خطأ - استمر 8 ممثلين مسرحيين:
Nationality (الجنسية)
Nationality <= 0.5
يُشير إلى أن الممثلين الكوميديين الذين لديهم قيمة جنسية أقل من 0.5 سيتتبعون السهم على اليسار (وهذا يعني أن جميع من بريطانيا)، بينما سيتتبع البقية السهم على اليمين.
gini = 0.219
يعني أن حوالي 22% من العينات ستتحرك في اتجاه واحد.
samples = 8
يُشير إلى أن هناك 8 ممثلين كوميديين في هذا الفرع (8 ممثلين كوميديين ذوي تصنيف أعلى من 6.5).
value = [1, 7]
يُشير إلى أن في 8 ممثلين كوميديين، 1 سيحصل على "لا"، بينما سيحصل 7 على "نعم".

صحيح - استمر 4 ممثلين مسرحيين:
Age (السن)
Age <= 35.5
يُشير إلى أن الممثلين الكوميديين الذين تزيد أعمارهم عن 35.5 سنة سيتبعون السهم على اليسار، بينما سيتتبع البقية السهم على اليمين.
gini = 0.375
يعني أن حوالي 37.5% من العينات ستتحرك في اتجاه واحد.
samples = 4
يُشير إلى أن هناك 4 ممثلين كوميديين في هذا الفرع (4 ممثلين كوميديين من بريطانيا).
value = [1, 3]
يُشير إلى أن في 4 ممثلين كوميديين، 1 سيحصل على "لا"، بينما سيحصل 3 على "نعم".
خطأ - إنتهى 4 ممثلين كوميديين هنا:
gini = 0.0
表示所有样本都得到相同的结果。
samples = 4
يُشير إلى أن هناك 4 ممثلين كوميديين في هذا الفرع (4 ممثلين كوميديين من بريطانيا).
value = [0, 4]
يُشير إلى أن في 4 ممثلين كوميديين، 0 سيحصل على "لا"، بينما سيحصل 4 على "نعم".

صحيح - إنتهى 2 ممثلين كوميديين هنا:
gini = 0.0
表示所有样本都得到相同的结果。
samples = 2
يُشير إلى أن هناك 2 ممثل كوميدي في هذا الفرع (2 ممثلين كوميديين تزيد أعمارهم عن 35.5 سنة).
value = [0, 2]
يُشير إلى أن في هذين الممثلين الكوميديين، 0 سيحصل على "لا"، بينما سيحصل 2 على "نعم".
خطأ - استمر 2 ممثلين مسرحيين:
Experience (الخبرة)
Experience <= 9.5
يُشير إلى أن الممثلين الكوميديين الذين لديهم 9.5 سنة أو أكثر من الخبرة سيتتبعون السهم على اليسار، بينما سيتتبع البقية السهم على اليمين.
gini = 0.5
يُشير إلى أن 50% من العينات ستتحرك في اتجاه واحد.
samples = 2
يُشير إلى أن هناك 2 ممثل كوميدي في هذا الفرع (2 ممثلين كوميديين تزيد أعمارهم عن 35.5 سنة).
value = [1, 1]
يُشير إلى أن 1 من هذين الممثلين الكوميديين سيحصل على "لا"، بينما سيحصل الآخر على "نعم".

صحيح - إنتهى 1 ممثل كوميدي هنا:
gini = 0.0
表示所有样本都得到相同的结果。
samples = 1
表示此分支中还剩下 1 名喜剧演员(1 名具有 9.5 年或以下经验的喜剧演员)。
value = [0, 1]
表示 0 表示 "NO",1 表示 "GO"。
False - 1 名喜剧演员到这里为止:
gini = 0.0
表示所有样本都得到相同的结果。
samples = 1
表示此分支中还剩下 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% 的肯定答案。它基于结果的可能性,答案会有所不同。