CMD + K

Kapittel 9Begreper & formler · Beslutningstrær
Referanseside · Kapittel 9

Begreper & referanser

Alle nøkkelbegrepene, formlene og referansene fra Beslutningstrær, samlet på én side. Bruk denne som oppslag når du leser, øver flashcards eller tar quiz.

Øv med flashcards16 kort fra dette kapittelet

Begreper

Sentrale begreper fra kapittelet med korte definisjoner.

01Beslutningstre

En modell som følger en sekvens av featuretester fra rotnoden til en prediksjon i et blad.

02Beslutningsnode

Et punkt i treet som deler observasjonene etter en betingelse på en feature.

03Split

Valget av feature og grense som deler dataene i to eller flere barnegrupper.

04Bladnode

En terminal node som gir treets klasse eller regresjonsprediksjon.

05Urenhet

Et mål på hvor blandet klassefordelingen er i en node.

06Informasjonsgevinst

Reduksjonen i entropi fra en node til den vektede entropien i barna etter en split: . Måler hvor mange bits usikkerhet spørsmålet i snitt fjerner.

07Regresjonstre

Beslutningstre som predikerer et tall. Hvert blad predikerer gjennomsnittet av målverdiene i bladet, og splittene velges slik at den vektede variansen (treningens MSE) i barna blir lavest mulig.

08Forbeskjæring

Regler som stopper veksten av et tre før bladene blir rene, for eksempel maksimal dybde, minste antall punkter per blad eller minste urenhetsreduksjon. Gir mer bias og mindre varians.

Formler

Hver formel: hva den heter, hvordan den ser ut, og hva symbolene betyr.

gini-urenhet

Gini-urenhet

Gini er lav når én klasse dominerer en node og null når noden er ren.

GGini-urenhet
p_kandel av klasse k i noden
Kantall klasser
entropi

Entropi

Entropi måler usikkerhet i klassefordelingen i en node.

Hentropi målt i bit
p_kandel av klasse k i noden
Kantall klasser
urenhetsreduksjon

Reduksjon i urenhet

En split vurderes etter hvor mye den reduserer vektet urenhet fra foreldrenoden.

ΔIreduksjon i vektet urenhet
I(P)urenhet i foreldrenoden
I(L)urenhet i venstre barn
I(R)urenhet i høyre barn
n_L,n_R,n_Pantall observasjoner i nodene
vektet-varians

Vektet varians etter split

Splitkriteriet i et regresjonstre. er gjennomsnittlig kvadratavvik fra bladgjennomsnittet. Treet velger splitten med lavest , som er det samme som størst variansreduksjon.

V_splitvektet varians i barna
Var(L), Var(R)varians i venstre og høyre barn
n_L, n_R, n_Pantall punkter i barna og i forelderen
bladprediksjon

Bladprediksjon i regresjon

Et blad i et regresjonstre predikerer gjennomsnittet av målverdiene til treningspunktene som havnet i bladet. Gjennomsnittet er tallet som minimerer kvadratisk feil i bladet.

ŷ_bladbladets prediksjon
Streningspunktene i bladet
y_imålverdien til punkt i

Kodesnutter

Kodesnutter fra kapittelet, vist literal.

Kode

Et tre med to nivåer på kundedata

Python
import numpy as npfrom sklearn.tree import DecisionTreeClassifier, export_text # Kunder: [alder, tidligere besøk] og om besøket endte i kjøp (1) eller ikke (0)X = np.array([[19, 1], [22, 4], [21, 0], [31, 0], [24, 2], [34, 1],              [26, 1], [39, 4], [27, 0], [44, 2], [29, 2], [48, 0],              [23, 2], [53, 3], [25, 5]])y = np.array([0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1])dybde = 2  # @param 1..4alder = 24  # @param 18..60 tre = DecisionTreeClassifier(max_depth=dybde, random_state=0).fit(X, y)print(export_text(tre, feature_names=["alder", "besok"]))ny = np.array([[alder, 1]])                 # ny kunde med 1 tidligere besøkprint(f"ny kunde, {alder} år og 1 besøk: P(kjøp) = {tre.predict_proba(ny)[0, 1]:.2f}")print("sti for den nye kunden:")t = tre.tree_for node in tre.decision_path(ny).indices:    if t.children_left[node] == -1:        print(f"  blad: klasse {t.value[node][0].argmax()}")    else:        v = ny[0, t.feature[node]]        print(f"  {['alder', 'besok'][t.feature[node]]} = {v} {'<=' if v <= t.threshold[node] else '>'} {t.threshold[node]:.2f}")

Prøv: Dra dybde ned til 1 og se hvilket spørsmål treet stiller alene, og dra alder for å følge «sti for den nye kunden» og «P(kjøp)».

Kode

Dybde mot trenings- og testfeil

Python
import numpy as npimport matplotlib.pyplot as pltfrom sklearn.tree import DecisionTreeRegressor rng = np.random.default_rng(9)x = rng.uniform(0, 10, 120)y = np.sin(x) + rng.normal(0, 0.3, 120)      # sann kurve + støyX = x.reshape(-1, 1)tren = np.arange(120) < 80                   # 80 til trening, 40 til testmin_blad = 1  # @param 1..20 dybder = list(range(1, 13))mse_tren, mse_test = [], []for d in dybder:    tre = DecisionTreeRegressor(max_depth=d, min_samples_leaf=min_blad, random_state=0).fit(X[tren], y[tren])    mse_tren.append(np.mean((tre.predict(X[tren]) - y[tren]) ** 2))    mse_test.append(np.mean((tre.predict(X[~tren]) - y[~tren]) ** 2))print(f"min_samples_leaf={min_blad}: lavest test-MSE {min(mse_test):.3f} ved max_depth={dybder[np.argmin(mse_test)]}")print(f"dybde 12: {tre.get_n_leaves()} blader, MSE trening {mse_tren[-1]:.3f}, test {mse_test[-1]:.3f}") plt.figure()plt.plot(dybder, mse_tren, label="trening")plt.plot(dybder, mse_test, label="test")plt.xlabel("max_depth")plt.ylabel("MSE")plt.legend()plt.tight_layout()plt.show()

Prøv: Dra min_blad opp og se «dybde 12» få færre blader og test-MSE slutte å stige; hvilken dybde ville du valgt?

Kode

XOR-mønster og skalering

Python
import numpy as npfrom sklearn.linear_model import LogisticRegressionfrom sklearn.tree import DecisionTreeClassifier seed = 4  # @param 0..20dybde = 2  # @param 1..6rng = np.random.default_rng(seed)X = rng.uniform(0, 10, size=(300, 2))             # [fukt, temperatur] i en kornsiloy = ((X[:, 0] > 5) != (X[:, 1] > 5)).astype(int)  # risiko når nøyaktig én er høy lin = LogisticRegression().fit(X, y)tre = DecisionTreeClassifier(max_depth=dybde, random_state=0).fit(X, y)print(f"logistisk regresjon: accuracy {lin.score(X, y):.2f}")print(f"tre, max_depth={dybde}:    accuracy {tre.score(X, y):.2f}") # Samme tre på omregnede features: fukt i promille, temperatur i FahrenheitX2 = np.column_stack([X[:, 0] * 10, X[:, 1] * 1.8 + 32])tre2 = DecisionTreeClassifier(max_depth=dybde, random_state=0).fit(X2, y)print(f"like prediksjoner etter omregning: {np.all(tre.predict(X) == tre2.predict(X2))}")

Prøv: Dra dybde ned til 1 og se «accuracy» for treet falle mot «logistisk regresjon»; dra seed og se hvor mye treets accuracy svinger.

Læringsmål

Hva du skal kunne etter å ha lest kapittelet.

  1. 01Følg en observasjon fra rot til blad og forklar hva bladet predikerer i klassifikasjon og regresjon
  2. 02Regn ut Gini-urenhet og entropi for en node
  3. 03Velg splitten med lavest vektet urenhet eller størst informasjonsgevinst
  4. 04Regn ut vektet varians for kandidatsplitter i et regresjonstre
  5. 05Forklar hvordan maksimal dybde og minste bladstørrelse styrer overtilpasning
  6. 06Forklar hvorfor trær ikke trenger skalering og likevel fanger vekselvirkninger