English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

تعلم خوارزمية تصنيف الشجرة في Python

من هذا الفصل، ندخل في دراسة الخوارزميات الرسمية.

أولاً، نتعلم خوارزمية تصنيف فعالة وقديمة: خوارزمية تصنيف الشجرة الإدارية.

أولاً، نتعلم خوارزمية تصنيف فعالة وقديمة: خوارزمية تصنيف الشجرة الإدارية.

1. خوارزمية شجرة القرار
تستخدم الشجرة الإدارية بنية شجرة لفئة العينة المختلفة، وهي خوارزمية تصنيف واضحة للغاية، ويمكن أيضًا استخدامها للتنبؤ. ومع ذلك، قد يكون هناك صعوبة في بعض التصنيفات المنطقية الخاصة. مثل منطق XOR، لا تتمتع الشجرة الإدارية بمهارة في حل هذه المشاكل.
بناء الشجرة الإدارية ليس له شكل واحد، ويأسف لذلك أن بناء أفضل شجرة إدارية يعتبر مشكلة NP. لذلك، كيفية بناء شجرة إدارية جيدة هو重点研究的课题.

J. Ross Quinlan اقترح في عام 1975 إدخال مفهوم إنتروبي المعلومات في بناء الشجرة الإدارية، وهذا هو الخوارزمية الشهيرة ID3. الخوارزميات اللاحقة مثل C4.5، C5.0، CART هي تحسينات لهذه الطريقة.

الإنتروبي هو درجة “اللامتناسقية، الفوضى”. قد تشعر بالحيرة عند اكتشاف هذه الفكرة لأول مرة. إذا كنت ترغب في معرفة كيفية استخدام زيادة إنتروبي المعلومات لتحديد الخصائص، يمكنك الرجوع إلى مقال هذا الشخص: Python Machine Learning Decision Tree Algorithm

إذا لم تفهم بعد، راجع هذا المثال أدناه.
النموذج    أحمر      كبير      تفاحة جيدة 
0         1        1         1 
1         1        0         1 
2         0        1         0 
3         0        0         0 

لدي العينة 2 خصائص، حيث يُرمز A0 إلى ما إذا كانت تفاحة حمراء. A1 يُرمز إلى ما إذا كانت تفاحة كبيرة.

لذلك، إنتروبي المعلومات للعينة قبل الفئة هي S = -(1/2 * log(1/2) + 1/2 * log(1/2)) = 1.

إنتروبي المعلومات تساوي 1 تعني أن الحالة الحالية هي أكثر فوضى وأقل نظامًا.

في هذا المثال، هناك فقط 2 خصائص. لذلك، من الطبيعي أن يكون هناك فقط 2 شجرة إدارية، كما هو موضح في الشكل التالي:

من الواضح أن الشجرة الإدارية التي تستخدم A0 (الأحمر) كنقطة تقسيم هي أفضل من الشجرة الإدارية التي تستخدم A1 (الحجم) كنقطة تقسيم.
بالطبع، هذا هو التعرف على الإدراك البصري. للتحقق الكمي، يجب حساب زيادة إنتروبي المعلومات لكل حالة تقسيم.
أولاً، يتم اختيار A0 كنقطة تقسيم، وتم حساب إنتروبي المعلومات لكل فرع فرعي كما يلي:
0،1 نواة الأوراق لديها 2 حالة إيجابية، و 0 حالة سلبية. إنتروبي المعلومات: e1 = -(2/2 * log(2/2) + 0/2 * log(0/2)) = 0.
2،3 نواة الأوراق لديها 0 حالة إيجابية، و 2 حالات سلبية. إنتروبي المعلومات: e2 = -(0/2 * log(0/2) + 2/2 * log(2/2)) = 0.

لذلك يتم اختيار معادلة معادلة إنتروبي المعلومات بعد تقسيم A0 كنسبة وزن لمتوسط كل فرع فرعي: E = e1 * 2/4 + e2 * 2/4 = 0.
مكافأة معلوماتية التقسيم باستخدام A0 هي G(S, A0) = S - E = 1 - 0 = 1.

في الواقع، تمثل أوراق شجرة القرار أن جميع العينات تعتبر من نفس الفئة، وبالتالي فإن معلوماتية دائمًا تساوي 0.

بالمثل، إذا تم اختيار A1 كتقسيم أولاً، يمكن حساب معلوماتية كل فرع فرعي كما يلي:
الفرع 0،2 يحتوي على 1 حالة إيجابية و1 حالة سلبية. معلوماتية: e1 = -(1/2 * log(1/2) + 1/2 * log(1/2)) = 1.
الفرع 1،3 يحتوي على 1 حالة إيجابية و1 حالة سلبية. معلوماتية: e2 = -(1/2 * log(1/2) + 1/2 * log(1/2)) = 1.
لذلك، تقسيم A1 بعد التقسيم هو معلوماتية كل فرع فرعي: E = e1 * 2/4 + e2 * 2/4 = 1. أي أن التقسيم لم يكن له تأثير!
مكافأة معلوماتية التقسيم باستخدام A1 هي G(S, A1) = S - E = 1 - 1 = 0.
لذلك، قبل كل تقسيم، نحتاج فقط إلى حساب التقسيم الذي يوفر أكبر زيادة في مكافأة معلوماتية.

2、مجموعة البيانات

لسهولة الشرح وفهم، نستخدم مجموعة بيانات اختبارية بسيطة جدًا كالتالي:
1.5 50 thin 
1.5 60 fat 
1.6 40 thin 
1.6 60 fat 
1.7 60 thin 
1.7 80 fat 
1.8 60 thin 
1.8 90 fat 
1.9 70 thin 
1.9 80 fat 

هذه المجموعة تحتوي على 10 عينة، وكل عينة تحتوي على 2 خاصية، وهي ارتفاع القدم ووزن، والصف الثالث هو علامة الفئة، مما يعني “سمين” أو “نحيف”. يتم حفظ هذه المعلومات في ملف 1.txt.

مهمتنا هي تدريب ملاحظة تصنيف شجرة القرار، حيث يمكن للمحول أن يحدد ما إذا كان الشخص سمينًا أم نحيفًا.
(المعلومات هي تخمينات موضوعية للكاتب، ولديها طبيعة منطقية، ولكن يرجى تجاهل صحة هذا.)

شجرة القرار تعكس فرعًا منطقيًا ثنائيًا “نعم/لا” بشكل طبيعي. ولكن ماذا إذا كانت ارتفاع القدم ووزن هي قيم متتابعة في هذه مجموعة البيانات؟

على الرغم من أن ذلك معقد بعض الشيء، إلا أن هذا ليس مشكلة، فقط تحتاج إلى العثور على نقاط وسطية لتحويل القيم المتتابعة إلى مشكلة منطق ثنائي.
مهمة هذا شجرة القرار هي العثور على قيم حرج لارتفاع القدم ووزن، وتصنيف عيناتها على شكل زوجين بناءً على منطق أكبر أو أصغر من هذه القيم، بناء شجرة القرار من أعلى إلى أسفل.

استخدام مكتبة التعلم الآلي في بايثون، يمكن تنفيذها بسهولة وجمال.

3、تنفيذ بايثون

أعطى الكود باللغة البايثون كما يلي:

# -*- coding: utf-8 -*- 
استيراد مكتبة numpy كـ np 
استيراد مكتبة scipy كـ sp 
من sklearn import tree 
من sklearn.metrics import precision_recall_curve 
من sklearn.metrics import classification_report 
من sklearn.cross_validation import train_test_split 
'''قراءة البيانات''' 
data = [] 
labels = [] 
مع فتح("data\\1.txt", 'r') كـ ifile: 
    لـ line في ifile: 
      tokens = line.strip().split(' ') 
      data.append([float(tk) for tk in tokens[:-1]]) 
      labels.append(tokens[-1]) 
x = np.array(data) 
labels = np.array(labels) 
y = np.zeros(labels.shape) 
'''تحويل العلامات إلى 0/1''' 
y[labels=='fat']=1 
'''تقسيم بيانات التدريب والاختبار''' 
x_التعلم, x_الاختبار, y_التعلم, y_الاختبار = train_test_split(x, y, test_size = 0.2) 
'''استخدام معادلة المعلومات كمعيار للتفريق، لتدريب شجرة القرار''' 
clf = tree.DecisionTreeClassifier(criterion='entropy') 
print(clf) 
clf.fit(x_التعلم, y_التعلم) 
'''كتابة هيكل الشجرة القرار في الملف''' 
مع فتح("tree.dot", 'w') كـ f: 
  f = tree.export_graphviz(clf, out_file=f) 
'''المعادلات تعكس تأثير كل ميزة. كلما زادت قيمتها، زاد تأثير الميزة في التمييز''' 
print(clf.feature_importances_) 
'''طباعة نتائج الاختبار''' 
الإجابة = clf.predict(x_التعلم) 
print(x_التعلم) 
print(الإجابة) 
print(y_التعلم) 
print(np.mean( answer == y_train)) 
'''''دقة الاستدلال ومدى الاستدلال''' 
precision, recall, thresholds = precision_recall_curve(y_train, clf.predict(x_train)) 
answer = clf.predict_proba(x)[:,1] 
print(classification_report(y, answer, target_names = ['thin', 'fat'])) 

النتيجة ستكون مشابهة للشكل التالي:
[ 0.2488562  0.7511438]
array([[  1.6,  60. ]
       [  1.7,  60. ]
       [  1.9,  80. ]
       [  1.5,  50. ]
       [  1.6,  40. ]
       [  1.7,  80. ]
       [  1.8,  90. ]
       [  1.5,  60. ]
array([ 1.,  0.,  1.,  0.,  0.,  1.,  1.,  1.])
array([ 1.,  0.,  1.,  0.,  0.,  1.,  1.,  1.])
1.0
             precision    recall  f1-score   support
       thin       0.83      1.00      0.91         5
        fat        1.00      0.80      0.89         5
avg / total       1.00      1.00      1.00         8
array([ 0.,  1.,  0.,  1.,  0.,  1.,  0.,  1.,  0.,  0.])
array([ 0.,  1.,  0.,  1.,  0.,  1.,  0.,  1.,  0.,  1.])

يمكن رؤية أن النسبة المئوية للتحقق من البيانات المدربة هي 100%. ولكن عند اختبار جميع البيانات، سيكون هناك عينة اختبار واحدة مخطئة في التصنيف.
يظهر أن شجرة القرار في هذا المثال تمتص القواعد من مجموعة التدريب بشكل جيد، ولكن مستوى التنبؤ يبدو أقل قليلاً.
هناك ثلاثة أمور يجب توضيحها، وهذا سيتم استخدامه في تعلم الآلة في المستقبل.

1- تقسيم بيانات التدريب والاختبار.

هذا يهدف إلى سهولة القيام بالتدقيق المتعدد. التدقيق المتعدد يهدف إلى اختبار استقرار الخوارزمية بشكل كامل.
0.2 في الكود يمثل أخذ 20% من البيانات لتجربة. الباقي 80% يستخدم لتدريب شجرة القرار.
也就是说,在10个样本中随机取8个进行训练。本文数据集较小,这里的目的是可以看到由于取的训练数据随机,每次构建的决策树都不一样。

2、特征的不同影响因子。

样本的不同特征对分类的影响权重差异会很大。分类结束后查看每个样本对分类的影响度也是很重要的。
在本例中,身高的权重为0.25,体重为0.75,可以看到重量的重要性远远高于身高。对于胖瘦的判断而言,这也是相当符合逻辑的。

3、准确率与召回率。

这两个值是评估分类准确率的一个重要标准。例如代码的最后将所有10个样本输入分类器进行测试的结果:
测试结果:array([ 0.,  1.,  0.,  1.,  0.,  1.,  0.,  1.,  0.,  0.])
真实结果:array([ 0.,  1.,  0.,  1.,  0.,  1.,  0.,  1.,  0.,  1.])
将thin分类的准确率为0.83。这是因为分类器分出了6个thin,其中正确的有5个,因此将thin分类的准确率为5/6=0.83。
将thin分类的召回率为1.00。这是因为数据集中共有5个thin,而分类器将它们全部分对了(尽管将一个fat分成了thin!),召回率5/5=1。
将fat分类的准确率为1.00。不再赘述。
将fat分类的召回率为0.80。这是因为数据集中共有5个fat,而分类器只分出了4个(将一个fat分成了thin!),召回率4/5=0.80。
在许多情况下,尤其是数据分类难度较大的情况下,准确率与召回率往往是矛盾的。您可能需要根据您的需求找到最佳的一个平衡点。
例如在本例中,您的目标是尽可能保证找到的胖子是真胖子(准确率),还是保证尽可能找到更多的胖子(召回率)。

代码还把决策树的结构写入了tree.dot中。打开该文件,很容易画出决策树,还可以看到决策树的更多分类信息。
本文的tree.dot如下所示:

digraph Tree { 
0 [label="X[1] <= 55.0000\nentropy = 0.954434002925\nsamples = 8", shape="box"] ; 
1 [label="entropy = 0.0000\nsamples = 2\nvalue = [ 2. 0.]", shape="box"] ; 
0 -> 1 ; 
2 [label="X[1] <= 70.0000\nentropy = 0.650022421648\nsamples = 6", shape="box"] ; 
0 -> 2 ; 
3 [label="X[0] <= 1.6500\nentropy = 0.918295834054\nsamples = 3", shape="box"] ; 
2 -> 3 ; 
4 [label="entropy = 0.0000\nsamples = 2\nvalue = [ 0. 2.]", shape="box"] ; 
3 -> 4 ; 
5 [label="entropy = 0.0000\nsamples = 1\nvalue = [ 1. 0.]", shape="box"] ; 
3 -> 5 ; 
6 [label="entropy = 0.0000\nsamples = 3\nvalue = [ 0. 3.]", shape="box"] ; 
2 -> 6 ; 
} 

بناءً على هذه المعلومات، يجب أن يبدو شجرة القرار كما يلي:

هذا هو نهاية محتوى هذا المقال، نأمل أن يكون قد ساعدكم في التعلم، ونأمل أن تدعموا تعليمات النطق بشكل أكبر.

البيان: محتويات هذا المقال تم جمعها من الإنترنت، حقوق النشر تخص المالك الأصلي، المحتوى تم تقديمه من قبل مستخدمي الإنترنت وتم تحميله بشكل مستقل، هذا الموقع لا يملك حقوق الملكية، لم يتم تعديل المحتوى بشكل يدوي، ولا يتحمل أي مسؤولية قانونية. إذا كنت قد وجدت محتوى يشتبه في انتهاك حقوق النسخ، فنرجو منك إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال # ب @) لإبلاغنا، وقدم الدليل على الدليل، إذا تم التحقق من ذلك، سيتم حذف المحتوى المشبوه فوراً.

سيكون لديك اهتمام