Machine Learning Academy · Oppitunti

Päätöspuiden visualisointi ja tulkinta

Vie ja piirrä puu sklearnin plot_tree-funktiolla, lue päätössäännöt ja poimi piirteiden tärkeydet sidosryhmäraportteja varten.

Oppitunti 4/413 vaihetta

Päätöspuiden visualisointi ja tulkinta on ilmainen Machine Learning Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Machine Learning Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Machine Learning Academy-kurssilla on yhteensä 4 oppituntia.

Miksi puun visualisointi on tärkeää

Päätöspuita kutsutaan usein white-box-malleiksi, koska niiden päätöslogiikka on täysin läpinäkyvä. Koulutetun puun visualisoinnin avulla voitte varmistaa, että malli tekee päätöksiä järkevien piirteiden perusteella, selittää ennusteita teknisille asiantuntijoille, tunnistaa mahdollisia datan laatuongelmia (esimerkiksi tilanteen, jossa juurisolmussa tärkeänä näkyy piirre, jonka ei pitäisi olla merkittävä) ja selvittää odottamattoman toiminnan syitä. Visualisointi muuttaa puun matemaattisen rakenteen ihmisen luettavaksi vuokaavioksi, jonka toimialan asiantuntijat voivat tarkistaa tietämyksensä perusteella.

from sklearn.tree import DecisionTreeClassifier, plot_tree
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt

X, y = load_iris(return_X_y=True)
feature_names = load_iris().feature_names
class_names   = load_iris().target_names

tree = DecisionTreeClassifier(max_depth=3, random_state=42)
tree.fit(X, y)

plt.figure(figsize=(14, 6))
plot_tree(tree,
          feature_names=feature_names,
          class_names=class_names,
          filled=True,      # Color by majority class
          rounded=True,     # Rounded boxes
          fontsize=10)
plt.title('Iris Decision Tree (depth=3)')
plt.show()

Solmun lukeminen plot_tree-tulosteesta

Jokainen plot_tree-tulosteen solmu näyttää neljä tietoa: (1) jakoehdon (esimerkiksi petal length <= 2.45), (2) solmun Gini-epäpuhtauden, (3) niiden näytteiden määrän, jotka saavuttivat solmun koulutuksen aikana, ja (4) luokkajakauman luokkakohtaisten näytemäärien luettelona. Lehtisolmut näyttävät kaikki neljä tietoa, mutta eivät jakoehtoa – ennusteena käytetään enemmistöluokkaa. Solmun värin voimakkuus ilmaisee puhtautta: tummempi väri tarkoittaa useampia dominantin luokan näytteitä.

# Interpreting node output from plot_tree:
#
# petal length (cm) <= 2.45     <- split condition
# gini = 0.667                  <- impurity before split
# samples = 150                 <- training samples reaching node
# value = [50, 50, 50]          <- samples per class [setosa, versicolor, virginica]
# class = setosa                <- majority class (prediction if leaf)

print('Gini 0.667 = equal 3-class split (maximum 3-class impurity)')
print('samples=150 at root = all training samples')
print('value=[50,50,50] = perfectly balanced classes')

Puun vieminen tekstiksi export_textillä

Lokitusta ja raportteja varten tai ympäristöissä, joissa ei ole graafista näyttöä, export_text() tuottaa puusta tekstimuotoisen esityksen. Jokainen sisennystaso vastaa yhtä jakotasoa. Pystyviiva näyttää haarat, ja lehtirivit näyttävät ennustetun luokan. Tämä muoto sopii päätössääntöjen sisällyttämiseen dokumentaatioon, lokitiedostoihin tallentamiseen tai komentoriviympäristöissä näyttämiseen. Sen avulla puiden rakenteita voi myös verrata numeerisesti eri hyperparametrikonfiguraatioissa.

from sklearn.tree import DecisionTreeClassifier, export_text
from sklearn.datasets import load_iris

X, y = load_iris(return_X_y=True)
tree = DecisionTreeClassifier(max_depth=3, random_state=42)
tree.fit(X, y)

text_repr = export_text(
    tree,
    feature_names=list(load_iris().feature_names)
)
print(text_repr)

Vienti Graphviz DOT -muotoon

export_graphviz() luo DOT-kielisen tiedoston, jonka voi muuntaa Graphvizilla korkealaatuiseksi SVG- tai PNG-kuvaksi. Tämä sopii erinomaisesti esityslaatuisiin puukaavioihin sekä suuriin puihin, joiden tarkastelemiseen tarvitaan vieritystä. DOT-tiedoston voi myös muuntaa PDF-tiedostoksi tai upottaa raportteihin. Jupyterissa voitte käyttää komentoa graphviz.Source(dot_data) kaavion näyttämiseen suoraan muistikirjassa. Tämä lähestymistapa antaa täyden hallinnan fonttikokoon, värimaailmaan ja asetteluun – mikä on tärkeää, kun puu jaetaan liiketoiminnan sidosryhmille.

from sklearn.tree import export_graphviz
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
import graphviz

X, y = load_iris(return_X_y=True)
tree = DecisionTreeClassifier(max_depth=3, random_state=42)
tree.fit(X, y)

dot_data = export_graphviz(
    tree,
    out_file=None,
    feature_names=load_iris().feature_names,
    class_names=load_iris().target_names,
    filled=True, rounded=True,
    special_characters=True
)
# graph = graphviz.Source(dot_data)  # Renders in Jupyter
# graph.render('iris_tree', format='png')  # Save as PNG

Ominaisuuksien tärkeys: mikä ohjasi mallia?

Koulutuksen jälkeen tree.feature_importances_ paljastaa kunkin syöteominaisuuden suhteellisen vaikutuksen mallin ennusteisiin. Juuressa ja ylemmillä tasoilla käytetyillä ominaisuuksilla on yleensä suuri tärkeys, koska niiden jaot vaikuttavat kaikkiin koulutusnäytteisiin. Vain syvissä lehdissä käytetyillä ominaisuuksilla on vähäinen tärkeys. Ominaisuuksien tärkeyksien esittäminen pylväskaaviona on vakiovaihe puupohjaisessa analyysissä – se varmistaa, että malli hyödyntää järkeviä ja toimialan kannalta merkityksellisiä ominaisuuksia eikä sattumanvaraisia korrelaatteja, jotka toimivat vain koulutusdatassa.

from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_breast_cancer
import pandas as pd
import matplotlib.pyplot as plt

X, y = load_breast_cancer(return_X_y=True)
features = load_breast_cancer().feature_names

tree = DecisionTreeClassifier(max_depth=5, random_state=42)
tree.fit(X, y)

imp = pd.Series(tree.feature_importances_, index=features).sort_values(ascending=False)

imp.head(10).plot(kind='barh')
plt.title('Top 10 Feature Importances')
plt.xlabel('Importance')
plt.gca().invert_yaxis()
plt.show()

print('Top feature:', imp.index[0], '(importance:', imp.iloc[0].round(3), ')')

Yksittäisen ennusteen jäljittäminen

decision_path()-metodi palauttaa harvan indikaattorimatriisin, joka näyttää, missä solmuissa kukin näyte käy. Yhdistämällä sen tree.tree_-rakenteeseen voitte rekonstruoida minkä tahansa ennusteen tarkan päätösjärjestyksen. Tämä on automaattisten selitysjärjestelmien perusta: jokaiselle ennusteelle voitte muodostaa ihmiselle ymmärrettävän sääntöluettelon, kuten ”terälehden pituus oli 1,4 cm (≤2,45), joten siirryttiin vasemmalle; päädyttiin lehteen, joka ennustaa setosaa”. Tällainen läpinäkyvyys on välttämätöntä säännellyillä toimialoilla, joilla jokaisen päätöksen on oltava tarkastettavissa.

from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
import numpy as np

X, y = load_iris(return_X_y=True)
features = load_iris().feature_names
tree = DecisionTreeClassifier(max_depth=3, random_state=42)
tree.fit(X, y)

# Trace the path for sample 0
node_indicator = tree.decision_path(X[[0]])
nodes_visited = node_indicator.indices

T = tree.tree_
for node in nodes_visited[:-1]:  # All except leaf
    feature = features[T.feature[node]]
    threshold = T.threshold[node]
    val = X[0, T.feature[node]]
    direction = 'left (<= )' if val <= threshold else 'right (> )'
    print(f'Node {node}: {feature} = {val:.2f}, threshold={threshold:.2f} -> {direction}')

Jakoehtojen tulkitseminen sidosryhmille

Kun puun päätöksistä viestitään teknisesti suuntautumattomille sidosryhmille, matemaattiset jakoehdot kannattaa muuntaa selkeiksi, arkikielisiksi lauseiksi. Sen sijaan että kirjoittaisitte ”petal length (cm) <= 2.45: gini=0.0, samples=50”, sanokaa ”Jos terälehti on alle 2,45 cm pitkä, kukka on lähes varmasti Setosa.” Kuvailkaa jokainen haara ominaisuuden liiketoiminnallisen merkityksen kautta. Päätöspuut soveltuvat koneoppimismalleista erityisen hyvin viestintään sidosryhmille, koska jokainen päätös vastaa testattavaa ja tulkittavaa liiketoimintasääntöä.

# Human-readable rule extraction from a trained tree
from sklearn.tree import _tree

def extract_rules(tree, feature_names, class_names):
    T = tree.tree_
    rules = []
    
    def recurse(node, path):
        if T.feature[node] != _tree.TREE_UNDEFINED:
            feat = feature_names[T.feature[node]]
            thresh = T.threshold[node]
            recurse(T.children_left[node],  path + [f'{feat} <= {thresh:.2f}'])
            recurse(T.children_right[node], path + [f'{feat} > {thresh:.2f}'])
        else:
            majority_class = class_names[T.value[node].argmax()]
            rules.append(' AND '.join(path) + f' => {majority_class}')
    
    recurse(0, [])
    return rules

Yksittäisten ominaisuuksien osittaisriippuvuuskuviot

Ominaisuuksien tärkeydet osoittavat, mitkä ominaisuudet ovat tärkeimpiä, kun taas osittaisriippuvuuskuviot (PDP) osoittavat, miten ominaisuus vaikuttaa ennusteeseen. PDP-kuvioissa muiden ominaisuuksien vaikutus marginalisoidaan, ja mallin ennustama tulos esitetään yhden tai kahden ominaisuuden funktiona. Päätöspuilla PDP-kuviot muodostavat porrasfunktiota muistuttavia muotoja, jotka heijastavat akseleiden suuntaisia jakokynnyksiä. Scikit-learnin PartialDependenceDisplay luo nämä kuviot suoraan sovitetusta puusta, joten yksittäisten ominaisuusvaikutusten selittäminen toimialan asiantuntijoille on helppoa.

from sklearn.inspection import PartialDependenceDisplay
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt

X, y = load_iris(return_X_y=True)
features = load_iris().feature_names

tree = DecisionTreeClassifier(max_depth=4, random_state=42)
tree.fit(X, y)

# PDP for the two most important features
fig, ax = plt.subplots(figsize=(10, 4))
PartialDependenceDisplay.from_estimator(
    tree, X, features=[2, 3],  # petal length and petal width
    feature_names=features, ax=ax
)
plt.tight_layout()
plt.show()

Puurakenteiden vertailu hyperparametrien across

Puurakenteen muuttumisen visualisointi syvyyden funktiona auttaa muodostamaan intuitiivisen käsityksen mallista. Syvyyden 1 puussa eli kannossa on yksi jako ja kaksi lehteä – kyseessä on tärkein yksittäinen ominaisuus. Syvyyden 2 puu tarkentaa kumpaakin haaraa toisen tason kysymyksillä. Kun saman aineiston puita verrataan syvyyksillä 1, 3 ja 5, nähdään, miten malli rakentaa yhä monimutkaisempaa päätöslogiikkaa. Jos syvyyden 5 puu käyttää ylemmillä tasoillaan samoja ominaisuuksia kuin syvyyden 3 puu, nämä ominaisuudet ovat aidosti tärkeitä. Jos syvyydellä 5 ilmaantuu uusia ja vaikeasti tulkittavia ominaisuuksia, ne todennäköisesti kuvaavat kohinaa.

from sklearn.tree import DecisionTreeClassifier, export_text
from sklearn.datasets import load_iris

X, y = load_iris(return_X_y=True)
feat_names = list(load_iris().feature_names)

for depth in [1, 3, 5]:
    tree = DecisionTreeClassifier(max_depth=depth, random_state=42)
    tree.fit(X, y)
    print(f'\n--- max_depth={depth}, leaves={tree.get_n_leaves()} ---')
    print(export_text(tree, feature_names=feat_names)[:300])

Puiden käyttäminen liiketoimintasääntöjen luomiseen

Yksi päätöspuiden arvokkaimmista teollisista käyttötavoista on eksplisiittisten liiketoimintasääntöjen luominen. Säännöt voidaan toteuttaa sääntökoneissa ja laskentataulukoissa tai vanhoissa järjestelmissä, joissa koneoppimismalleja ei voida käyttää. Jokainen polku juuresta lehteen muodostaa täydellisen JOS–NIIN-säännön. Säännöt voidaan muuntaa SQL:n WHERE-lausekkeiksi, Python-sanakirjoiksi tai luottopisteytyksen pistekorteiksi. Kun puun syvyyttä ja näytteiden vähimmäismäärää koskevia rajoituksia säädetään huolellisesti, voidaan luoda pieni ja tarkka sääntökokoelma, jonka liiketoiminta-analyytikko voi tarkistaa, hyväksyä ja ylläpitää manuaalisesti.

# Generate SQL-like rules from a trained decision tree
from sklearn.tree import _tree

def tree_to_sql(tree, feature_names, class_names):
    T = tree.tree_
    rules = []
    
    def traverse(node, conditions):
        if T.feature[node] != _tree.TREE_UNDEFINED:
            fname = feature_names[T.feature[node]]
            thresh = T.threshold[node]
            traverse(T.children_left[node],
                     conditions + [f'{fname} <= {thresh:.3f}'])
            traverse(T.children_right[node],
                     conditions + [f'{fname} > {thresh:.3f}'])
        else:
            pred = class_names[T.value[node].argmax()]
            where = ' AND '.join(conditions)
            rules.append(f'WHEN {where} THEN {pred!r}')
    
    traverse(0, [])
    return 'CASE\n  ' + '\n  '.join(rules) + '\nEND',

Puuvisualisointien tallentaminen tiedostoihin

Puuvisualisointien tallentaminen tiedostoihin helpottaa niiden jakamista raporteissa, esityksissä ja mallidokumentaatiossa. Kun käytätte plot_tree-funktiota ja matplotlibia, voitte tallentaa kuvan PNG- tai SVG-muodossa komennolla plt.savefig(). Graphvizilla voitte muodostaa PDF-tiedoston suoraan. Jupyter-muistikirjojen vuorovaikutteiseen tarkasteluun upotettu SVG tuottaa selkeimmän tuloksen, koska sen kokoa voi suurentaa rajattomasti – tämä on hyödyllistä syvissä puissa, jotka näyttäisivät kiinteän tarkkuuden PNG-kuvana sumeilta. Sidosryhmille toimitettavat aineistot kannattaa aina viedä suurella DPI-arvolla (vähintään 300) tai vektori-SVG-muodossa, jotta solmujen teksti säilyy terävänä suurennettaessa.

from sklearn.tree import DecisionTreeClassifier, plot_tree
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt

X, y = load_iris(return_X_y=True)
tree = DecisionTreeClassifier(max_depth=3, random_state=42)
tree.fit(X, y)

# Save as high-DPI PNG for reports
fig, ax = plt.subplots(figsize=(16, 8))
plot_tree(tree, feature_names=load_iris().feature_names,
          class_names=load_iris().target_names,
          filled=True, rounded=True, ax=ax, fontsize=10)
fig.savefig('iris_decision_tree.png', dpi=200, bbox_inches='tight')
fig.savefig('iris_decision_tree.svg', format='svg', bbox_inches='tight')
print('Saved PNG and SVG tree visualisations')

Pikatarkistus

Testatkaa tämän oppitunnin Machine Learning with Python -käsitteiden ymmärtämistänne.

Oppitunnin yhteenveto

Tässä oppitunnissa opitte, miten päätöspuita visualisoidaan funktioilla plot_tree, export_text ja export_graphviz, miten solmujen tietoja luetaan (jakoehto, Gini, näytteet, arvo) sekä miten ominaisuuksien tärkeydet ja päätöspolut poimitaan sidosryhmille viestimistä varten. Seuraavaksi tutustumme Naive Bayesiin – todennäköisyyspohjaiseen luokittimeen, joka tekee ennusteita Bayesin teoreeman avulla.

Aloita maksutta

Opi Python tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
30
Oppitunnit
120

Usein kysytyt kysymykset

Onko oppitunti ”Päätöspuiden visualisointi ja tulkinta” ilmainen?

Kyllä – oppitunnin ”Päätöspuiden visualisointi ja tulkinta” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Machine Learning Academy-kurssin, päivitä CoddyKit PROhon. Machine Learning Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Päätöspuiden visualisointi ja tulkinta”?

Vie ja piirrä puu sklearnin plot_tree-funktiolla, lue päätössäännöt ja poimi piirteiden tärkeydet sidosryhmäraportteja varten. Harjoittelet Machine Learning Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Machine Learning Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Machine Learning Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.

Kuinka kauan ”Päätöspuiden visualisointi ja tulkinta”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Machine Learning Academy-oppitunnilla?

Kyllä. Jokainen Machine Learning Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Puun rakentaminen: jaot, solmut ja lehdet
  2. Gini-epäpuhtaus ja informaatiovoitto
  3. Puun syvyyden rajoittaminen ylisovittamisen estämiseksi
  4. Päätöspuiden visualisointi ja tulkinta
← Takaisin: Machine Learning Academy