Drzewa decyzyjne w uczeniu maszynowym


Drzewo decyzyjne (Decision Tree)

W tym rozdziale pokażemy, jak tworzyć "drzewo decyzyjne". Drzewo decyzyjne to diagram procesowy, który pomaga w podejmowaniu decyzji na podstawie wcześniejszego doświadczenia.

W tym przykładzie osoba spróbuje zdecydować, czy powinna wziąć udział w przedstawieniu komediowym.

Na szczęście, nasz przykładowy bohater zawsze rejestruje się na przedstawienie komediowe w mieście, rejestruje również informacje o aktorach komediowych i zapisuje, czy byli oni już tam.

Wiek Doświadczenie 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

Teraz, na podstawie tego zestawu danych, Python może stworzyć drzewo decyzyjne, które można użyć do decydowania, czy warto wziąć udział w nowym koncercie.

Działanie

Najpierw zaimportuj wymagane moduły i użyj pandas do odczytania zestawu danych:

Przykład

Przeczytaj i wydrukuj zestaw danych:

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)

Uruchom przykład

Aby stworzyć drzewo decyzyjne, wszystkie dane muszą być liczbami.

Musimy przekształcić nieliczbowe kolumny 'Nationality' i 'Go' na liczby.

Pandas ma funkcję map() Metoda, która przyjmuje słownik zawierający informacje o tym, jak przekształcać wartości.

{'UK': 0, 'USA': 1, 'N': 2}

Oznacza to, że wartość 'UK' jest przekształcana na 0, wartość 'USA' na 1, a wartość 'N' na 2.

Przykład

Zamień wartości tekstowe na liczby:

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)

Uruchom przykład

Następnie, musimy oddzielić kolumny cech od kolumny docelowej.

Kolumny cech to te, z których próbujemy przewidywać, a kolumny docelowe to te, które zawierają wartości, które próbujemy przewidywać.

Przykład

X to kolumna cech, y to kolumna docelowa:

features = ['Age', 'Experience', 'Rank', 'Nationality']
X = df[features]
y = df['Go']
print(X)
print(y)

Uruchom przykład

Teraz możemy utworzyć rzeczywisty drzewo decyzyjne, dostosowany do naszych szczegółów, a następnie zapisać go na komputerze jako plik .png:

Przykład

Utwórz drzewo decyzji, zapisz je jako obraz i wyświetl go:

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()

Uruchom przykład

Wyjaśnienie wyników

Drzewo decyzji używa Twoich wcześniejszych decyzji do obliczenia prawdopodobieństwa, że chcesz zobaczyć aktora komediowego.

Pozwólmy przeczytać różne aspekty drzewa decyzji:


Rank

Rank <= 6.5 Oznacza to, że aktorzy komediowi o rankingu poniżej 6.5 będą podążać: True Strzałka (w lewo), reszta jest zgodna z False Strzałka (w prawo).

gini = 0.497 Oznacza jakość podziału, która zawsze jest liczbą w zakresie 0.0 do 0.5, gdzie 0.0 oznacza, że wszystkie próbki uzyskują ten sam wynik, a 0.5 oznacza, że podział jest całkowicie w środku.

samples = 13 Oznacza to, że w tym momencie decyzji jeszcze pozostaje 13 aktorów komediowych, ponieważ to jest pierwszy krok, więc wszyscy są aktorami komediowymi.

value = [6, 7] Oznacza to, że w 13 aktorach komediowych 6 z nich uzyska "NO", a 7 "GO".

Gini

Metod podziału próbek jest wiele, w tym tutorialu używamy metody GINI.

Metoda Gini używa następującego wzoru:

Gini = 1 - (x/n)2 - (y/n)2

W tym, x to liczba pozytywnych odpowiedzi ("GO"), n to liczba próbek, y to liczba negatywnych odpowiedzi ("NO"), obliczane za pomocą następującego wzoru:

1 - (7 / 13)2 - (6 / 13)2 = 0.497


Następny krok zawiera dwa pudełka, jedno dla aktorów komediowych o 'Rank' 6.5 lub niższym, a reszta dla jednego pudełka.

True - 5 aktorów komediowych kończy się tutaj:

gini = 0.0 Oznacza to, że wszystkie próbki uzyskują ten sam wynik.

samples = 5 Oznacza to, że w tej gałęzi jeszcze pozostaje 5 aktorów komediowych (5 aktorów o poziomie 6.5 lub niższym).

value = [5, 0] oznacza, że 5 otrzyma "NO", a 0 otrzyma "GO".

Fałsz - 8 aktorów teatralnych kontynuują:

Narodowość (narodowość)

Narodowość <= 0,5 oznacza, że aktorzy komediowi z wartością narodowości mniejszą niż 0,5 będą podążać za strzałką po lewej stronie (co oznacza wszystkich z Wielkiej Brytanii), a reszta za strzałką po prawej stronie.

gini = 0,219 oznacza, że około 22% próbek będzie poruszać się w jednym kierunku.

samples = 8 oznacza, że w tej gałęzi jeszcze pozostaje 8 aktorów komediowych (8 aktorów z oceną wyższą niż 6,5).

value = [1, 7] oznacza, że z tych ośmiu aktorów komediowych, 1 aktor otrzyma "NO", a 7 aktorów otrzyma "GO".


Prawda - 4 aktorzy teatralni kontynuują:

Wiek (wiek)

Wiek <= 35,5 oznacza, że aktorzy komediowi w wieku 35,5 lat lub młodszy będą podążać za strzałką po lewej stronie, a reszta za strzałką po prawej stronie.

gini = 0,375 oznacza, że około 37,5% próbek będzie poruszać się w jednym kierunku.

samples = 4 oznacza, że w tej gałęzi jeszcze pozostaje 4 aktorów komediowych (4 aktorów z Wielkiej Brytanii).

value = [1, 3] oznacza, że z tych czterech aktorów komediowych, 1 aktor otrzyma "NO", a 3 aktorzy otrzymają "GO".

Fałsz - 4 aktorzy komediowi tutaj kończą:

gini = 0.0 Oznacza, że wszystkie próbki uzyskują ten sam wynik.

samples = 4 oznacza, że w tej gałęzi jeszcze pozostaje 4 aktorów komediowych (4 aktorów z Wielkiej Brytanii).

value = [0, 4] oznacza, że z tych czterech aktorów komediowych, 0 otrzyma "NO", a 4 otrzyma "GO".


Prawda - 2 aktorów komediowych tutaj kończą:

gini = 0.0 Oznacza, że wszystkie próbki uzyskują ten sam wynik.

samples = 2 oznacza, że w tej gałęzi jeszcze pozostaje 2 aktorów komediowych (2 aktorów 35,5 lat lub młodszych).

value = [0, 2] oznacza, że z tych dwóch aktorów komediowych, 0 otrzyma "NO", a 2 otrzyma "GO".

Fałsz - 2 aktorzy teatralni kontynuują:

Doświadczenie (doświadczenie)

Doświadczenie <= 9,5 oznacza, że aktorzy komediowi z doświadczeniem 9,5 lat lub więcej będą podążać za strzałką po lewej stronie, a reszta za strzałką po prawej stronie.

gini = 0,5 oznacza, że 50% próbek będzie poruszać się w jednym kierunku.

samples = 2 oznacza, że w tej gałęzi jeszcze pozostaje 2 aktorów komediowych (2 aktorów powyżej 35,5 lat).

value = [1, 1] oznacza, że z tych dwóch aktorów komediowych, 1 otrzyma "NO", a 1 otrzyma "GO".


Prawda - 1 aktor komediowy tutaj kończy:

gini = 0.0 Oznacza, że wszystkie próbki uzyskują ten sam wynik.

samples = 1 Oznacza, że w tej gałęzi pozostał 1 aktor komediowy (1 z których 1 ma 9,5 lat lub mniej doświadczenia w komedii).

value = [0, 1] Oznacza, że 0 oznacza "Nie", 1 oznacza "Tak".

False - 1 aktor komediowy tutaj:

gini = 0.0 Oznacza, że wszystkie próbki uzyskują ten sam wynik.

samples = 1 Oznacza, że w tej gałęzi pozostał 1 aktor komediowy (z którego 1 ma więcej niż 9,5 lat doświadczenia w komedii).

value = [1, 0] 1 oznacza "Nie", 0 oznacza "Tak".

Przewidywane wartości

Możemy użyć drzewa decyzji do przewidywania nowych wartości.

Na przykład: Czy powinienem zobaczyć program z aktorem komediowym w wieku 40 lat, który ma 10 lat doświadczenia i ranking komedii wynosi 7?

Przykład

Użycie predict() Metoda przewidywania nowych wartości:

print(dtree.predict([[40, 10, 7, 1]]))

Uruchom przykład

Przykład

Co jeśli poziom komedii wynosi 6, jaka jest odpowiedź?

print(dtree.predict([[40, 10, 6, 1]]))

Uruchom przykład

Różne wyniki

Jeśli uruchomisz go wystarczająco wiele razy, nawet jeśli wprowadzisz takie same dane, drzewo decyzji może dostarczyć różnych wyników.

To dlatego, że drzewo decyzji nie może dać nam 100% pewnej odpowiedzi. Odpowiedź opiera się na prawdopodobieństwie wyników, odpowiedzi mogą się różnić.