Δέντρο Δεδομένων Μηχανικής Εκμάθησης

Δέντρο Δεδομένων (Decision Tree)
Σε αυτό το κεφάλαιο, θα σας δείξουμε πώς να δημιουργήσετε ένα "Δέντρο Δεδομένων" (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
Αναφέρεται ότι οι κωμικοί ηθοποιοί με 'Rank' κάτω από 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 κωμικοί ηθοποιοί (οι ηθοποιοί αυτού του τμήματος έχουν βαθμό 6.5 ή χαμηλότερο).
value = [5, 0]
Symvainei oti 5 xanei "NO" kai 0 xanei "GO".
False - 8 onomatoskepastes prosegeioun:
Nationality (ethnikotita)
Nationality <= 0.5
Symvainei oti oi onomatoskepastes me ethnikotita mikroterai 0.5 thelei na segoun tin aristeri fani (to theo hoi onomatoskepastes apo tin Ellada), oi alloi thelei na segoun tin deksi.
gini = 0.219
Menei oti megales 22% twn samplei thelei na kinithei mia orizontia.
samples = 8
Symvainei oti h meria autou tis branhs meizon 8 onomatoskepastes (8 onomatoskepastes me katigoria yper 6.5).
value = [1, 7]
Symvainei oti apo tous 8 onomatoskepastes, 1 xanei "NO" kai 7 xanei "GO".

True - 4 onomatoskepastes prosegeioun:
Age (etia)
Age <= 35.5
Symvainei oti oi onomatoskepastes me etia yper 35.5 etia thelei na segoun tin aristeri fani, oi alloi thelei na segoun tin deksi.
gini = 0.375
Menei oti megales 37.5% twn samplei thelei na kinithei mia orizontia.
samples = 4
Symvainei oti h meria autou tis branhs meizon 4 onomatoskepastes (4 onomatoskepastes apo tin Ellada).
value = [1, 3]
Symvainei oti apo tous 4 onomatoskepastes, 1 xanei "NO" kai 3 xanei "GO".
False - 4 onomatoskepastes teleutei ekei:
gini = 0.0
表示所有样本都得到相同的结果。
samples = 4
Symvainei oti h meria autou tis branhs meizon 4 onomatoskepastes (4 onomatoskepastes apo tin Ellada).
value = [0, 4]
Symvainei oti apo tous 4 onomatoskepastes, 0 xanei "NO" kai 4 xanei "GO".

True - 2 onomatoskepastes teleutei hena:
gini = 0.0
表示所有样本都得到相同的结果。
samples = 2
Symvainei oti h meria autou tis branhs meizon 2 onomatoskepastes (2 onomatoskepastes 35.5 etia kai yper).
value = [0, 2]
Symvainei oti apo tous 2 onomatoskepastes, 0 xanei "NO" kai 2 xanei "GO".
False - 2 onomatoskepastes prosegeioun:
Experience (etia)
Experience <= 9.5
Symvainei oti oi onomatoskepastes me 9.5 etia kai yper thelei na segoun tin aristeri fani, oi alloi thelei na segoun tin deksi.
gini = 0.5
Symvainei oti 50% twn samplei thelei na kinithei mia orizontia.
samples = 2
Symvainei oti h meria autou tis branhs meizon 2 onomatoskepastes (2 onomatoskepastes me onoma yper 35.5).
value = [1, 1]
Symvainei oti apo tous 2 onomatoskepastes, 1 xanei "NO" kai 1 xanei "GO".

True - 1 onomatoskepastis teleutei hena:
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% 的肯定答案。它基于结果的可能性,答案会有所不同。