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


Δέντρο Δεδομένων (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% 的肯定答案。它基于结果的可能性,答案会有所不同。