Rozhodovacie stromy a jednoduchá klasifikácia údajov

Rozhodovacie stromy: Jednoduchý úvod do strojového učenia

Rozhodovacie stromy sú jedným z najjednoduchších a najintuitívnejších algoritmov strojového učenia. Narozdiel od iných metód v tomto prípade nepoužívame zložité matematické výpočty a algoritmus je ľahko pochopiteľný aj pre začiatočníkov. V tomto článku si ukážeme, ako vytvoriť jednoduchý strom a využiť ho v praxi.

Čo je to rozhodovací strom

Predstavme si, že plánujeme program na víkend. Zisťujeme vlastnosti počasia a na ich základe vyberáme vhodnú aktivitu. Podľa týchto podmienok vieme rozhodnúť sa, čo budeme robiť – tento proces nazývame klasifikácia.

Toto je jednoduchý rozhodovací strom. Podľa jedného atribútu vieme rozhodnúť o výsledku. Avšak tento strom nie je veľmi užitočný v reálnych situáciách. Môžeme mať viac aktivít a viac podmienok. Komplexnejší strom by mohol vyzerať takto:

Ako si môžeme všimnúť, strom sa vie rozšíriť podľa potreby. V reálnom svete majú stromy stovky až tisíce vetiev a vedia pracovať s numerickými aj kategorickými atribútmi.

Základné pojmy

Node (uzol) – každá otázka v strome predstavuje uzol Root node (koreňový uzol) – prvý uzol na vrchole stromu Leaf nodes (listové uzly) – koncové body stromu, ktoré určujú výsledok Internal nodes (vnútorné uzly) – uzly medzi koreňom a listami, ktoré testujú atribúty

Algoritmus vždy pokračuje, až kým nedôjde k leaf node, ktorý poskytne finálne rozhodnutie.

Ako funguje výber najlepších otázok

Výber pozície jednotlivých uzlov sa realizuje pomocou information gain (informačný zisk). Ten sa vypočítava z entropie.

Entropia predstavuje stav neznáma alebo neistoty v dátach. Tento koncept pochádza z fyziky a informatiky.

Entrópiu si vieme predstaviť pomocou sáčku s cukríkmi:

  • Ak vieme, že všetky cukríky sú červené, entropia je 0 (vieme so 100% istotou určiť farbu)
  • Ak v sáčku sú cukríky červenej a modrej farby v pomere 1:1, entropia je 1 – nevieme presne určiť, aký cukrík vytiahneme
  • Cieľom je mať entrópiu čo najnižšiu

Pomocou entropie sa vypočítava informačný zisk, ktorý určuje, ktorá otázka najlepšie rozdelí dáta.

Praktická ukážka v Pythone

V reálnom svete nepíšeme celú funkcionalitu od začiatku. V prostredí Python nájdeme vynikajúcu knižnicu Scikit-learn, ktorá nám umožňuje vytvoriť rozhodovací strom pomocou niekoľkých riadkov kódu.

Kompletný príklad

from sklearn.tree import DecisionTreeClassifier, export_graphviz
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import pandas as pd

# Načítanie dát
data = load_iris()
X, y = data.data, data.target

# Rozdelenie na trénovacie a testovacie dáta
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# Vytvorenie a trénovanie modelu
clf = DecisionTreeClassifier(random_state=42, criterion="entropy", max_depth=3)
tree = clf.fit(X_train, y_train)

# Predikcia na testovacích dátach
y_pred = tree.predict(X_test)

# Vyhodnotenie presnosti
accuracy = accuracy_score(y_test, y_pred)
print(f"Presnosť modelu: {accuracy:.2f}")

# Export stromu do súboru
export_graphviz(tree, out_file='out.dot', 
                feature_names=data.feature_names,
                class_names=data.target_names,
                filled=True, rounded=True)

Vysvetlenie kódu

Import knižníc

from sklearn.tree import DecisionTreeClassifier, export_graphviz
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

Dáta a ich rozdelenie Scikit-learn má v sebe zabudované populárne datasety. Iris dataset obsahuje merania rôznych druhov kosatcov (kvetov).

data = load_iris()
X, y = data.data, data.target

Dáta rozdelíme na X (vlastnosti/atribúty) a y (výsledok/trieda). Na základe X sa vytvorí strom, ktorý predpovedá y.

Rozdelenie na trénovacie a testovacie dáta

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

Vytvorenie a trénovanie modelu

clf = DecisionTreeClassifier(random_state=42, criterion="entropy", max_depth=3)
tree = clf.fit(X_train, y_train)

Parametre:

  • criterion="entropy" – používa entrópiu na výpočet informačného zisku
  • max_depth=3 – obmedzuje hĺbku stromu, aby sme predišli pretrénovaniu
  • random_state=42 – zabezpečuje reprodukovateľnosť výsledkov, vo sfére umelej inteliencie je populárne používať číslo 42

Graf

Taktiež vieme vygenerovať graf. Uložíme ho ako súbor out.dot. Na vizualizáciu vieme využiť Graphviz.

export_graphviz(tree, out_file='out.dot', 
                feature_names=data.feature_names,
                class_names=data.target_names,
                filled=True, rounded=True)
Vizualizovaný graf

Záver

Verím že sme si algoritmus rozhodovacích stromov trocha priblížili. Taktiež vieme využiť rozhodovacie stromy aj na regresiu (predpovedanie numerických hodnôt). Náhodne stromy sa využívaju v bankovníctve, ecommerce odvetví, zdravotníctve a finančom odvetví. Taktiež sa používa veľmi populárný algoritmus náhodne stromy založený na rozhodovacích stromoch, ktorý rieší niektoré jeho nedostatky.

Komentáre

Pridaj komentár