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.
Begreper
Sentrale begreper fra kapittelet med korte definisjoner.
En modell som følger en sekvens av featuretester fra rotnoden til en prediksjon i et blad.
Et punkt i treet som deler observasjonene etter en betingelse på en feature.
Valget av feature og grense som deler dataene i to eller flere barnegrupper.
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.
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.
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 er lav når én klasse dominerer en node og null når noden er ren.
Entropi
Entropi måler usikkerhet i klassefordelingen i en node.
Reduksjon i urenhet
En split vurderes etter hvor mye den reduserer vektet urenhet fra foreldrenoden.
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.
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.
Kodesnutter
Kodesnutter fra kapittelet, vist literal.
Et tre med to nivåer på kundedata
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)».
Dybde mot trenings- og testfeil
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?
XOR-mønster og skalering
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.
- 01Følg en observasjon fra rot til blad og forklar hva bladet predikerer i klassifikasjon og regresjon
- 02Regn ut Gini-urenhet og entropi for en node
- 03Velg splitten med lavest vektet urenhet eller størst informasjonsgevinst
- 04Regn ut vektet varians for kandidatsplitter i et regresjonstre
- 05Forklar hvordan maksimal dybde og minste bladstørrelse styrer overtilpasning
- 06Forklar hvorfor trær ikke trenger skalering og likevel fanger vekselvirkninger