0Pricing
Learn AI with Python · Lezione

Alberi decisionali: teoria e implementazione

Impurità di Gini, guadagno informativo, profondità dell’albero e overfitting: sklearn DecisionTreeClassifier.

Alberi decisionali: teoria e implementazione è una lezione Learn AI with Python gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Learn AI with Python, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Learn AI with Python include 4 lezioni in totale.

Che cos'è un albero decisionale

Un albero decisionale divide i dati in rami in base ai valori delle feature, ponendo domande con risposta sì/no fino a raggiungere una predizione in un nodo foglia.

Ogni nodo interno verifica una feature, ogni ramo rappresenta un risultato e ogni foglia assegna una classe. Gli alberi sono facili da interpretare perché può seguire il percorso delle decisioni.

Impurità di Gini

L'impurità di Gini misura quanto sono mescolate le classi in un nodo. Un nodo puro, che contiene una sola classe, ha Gini pari a 0.

La formula è Gini = 1 - sum(p_i^2), dove p_i è la frazione appartenente alla classe i. L'albero sceglie le divisioni che riducono maggiormente l'impurità.

import numpy as np

def gini(labels):
    classes, counts = np.unique(labels, return_counts=True)
    probs = counts / counts.sum()
    return 1 - np.sum(probs ** 2)

print(gini([0, 0, 1, 1]))   # 0.5 (max mix)
print(gini([0, 0, 0, 0]))   # 0.0 (pure)

Guadagno informativo ed entropia

Un criterio alternativo per la divisione è il guadagno informativo, basato sull'entropia. L'entropia è -sum(p_i * log2(p_i)).

Guadagno informativo = entropia del genitore - entropia ponderata dei figli. In genere Gini ed entropia producono alberi simili; Gini è leggermente più rapido da calcolare.

import numpy as np

def entropy(labels):
    _, counts = np.unique(labels, return_counts=True)
    p = counts / counts.sum()
    return -np.sum(p * np.log2(p))

print(entropy([0, 0, 1, 1]))   # 1.0
print(entropy([0, 0, 0, 1]))   # ~0.81

Addestrare un DecisionTreeClassifier

Scikit-learn mette a disposizione DecisionTreeClassifier. Scelga il criterio di divisione con il parametro criterion (gini o entropy).

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

X, y = load_iris(return_X_y=True)
Xtr, Xte, ytr, yte = train_test_split(X, y, random_state=0)

clf = DecisionTreeClassifier(criterion="gini", random_state=0)
clf.fit(Xtr, ytr)
print("Accuracy:", clf.score(Xte, yte))

Overfitting e max_depth

Un albero senza vincoli cresce finché ogni foglia non è pura, memorizzando il rumore. In questo modo va in overfitting.

Il parametro max_depth limita la profondità massima dell'albero, obbligandolo a generalizzare. Una profondità minore significa un modello più semplice e meno overfitting.

from sklearn.tree import DecisionTreeClassifier

shallow = DecisionTreeClassifier(max_depth=3, random_state=0)
deep = DecisionTreeClassifier(max_depth=None, random_state=0)
# shallow generalizes better on unseen data;
# deep often overfits the training set

Altri parametri di pre-potatura

Oltre a max_depth, può controllare la crescita con:

  • min_samples_split: numero minimo di campioni per dividere un nodo
  • min_samples_leaf: numero minimo di campioni in una foglia
  • max_leaf_nodes: limite al numero totale di foglie

Tutti questi parametri riducono la varianza e contrastano l'overfitting.

from sklearn.tree import DecisionTreeClassifier

clf = DecisionTreeClassifier(
    max_depth=5,
    min_samples_split=10,
    min_samples_leaf=5,
    random_state=0,
)

Visualizzare con plot_tree

plot_tree disegna l'intero albero, così può leggere ogni divisione, il valore Gini e la distribuzione delle classi in ciascun nodo.

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

X, y = load_iris(return_X_y=True)
clf = DecisionTreeClassifier(max_depth=3).fit(X, y)

plt.figure(figsize=(12, 6))
plot_tree(clf, filled=True, feature_names=load_iris().feature_names)
plt.show()

Importanza delle feature

Dopo l'addestramento, feature_importances_ indica quanto ogni feature ha ridotto l'impurità considerando tutte le divisioni. I valori hanno somma pari a 1.0.

È un modo rapido per stabilire quali input siano più importanti per il modello.

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

data = load_iris()
clf = DecisionTreeClassifier(max_depth=3).fit(data.data, data.target)

for name, imp in zip(data.feature_names, clf.feature_importances_):
    print(f"{name}: {imp:.3f}")

Potatura basata sulla complessità dei costi (ccp_alpha)

La post-potatura fa crescere un albero completo e poi elimina i rami deboli. Il parametro ccp_alpha controlla quanto aggressivamente potare l'albero: un alpha più alto rimuove più nodi.

Usi cost_complexity_pruning_path per trovare i valori alpha candidati.

from sklearn.tree import DecisionTreeClassifier

base = DecisionTreeClassifier(random_state=0)
path = base.cost_complexity_pruning_path(Xtr, ytr)
alphas = path.ccp_alphas

pruned = DecisionTreeClassifier(ccp_alpha=0.01, random_state=0)
pruned.fit(Xtr, ytr)

Scegliere il valore alpha migliore

Per scegliere ccp_alpha, addestri un albero per ogni valore alpha candidato e confronti l'accuratezza sul set di validazione. Il valore alpha migliore bilancia accuratezza e semplicità.

from sklearn.tree import DecisionTreeClassifier

scores = []
for a in alphas:
    t = DecisionTreeClassifier(ccp_alpha=a, random_state=0)
    t.fit(Xtr, ytr)
    scores.append((a, t.score(Xte, yte)))

best = max(scores, key=lambda s: s[1])
print("Best alpha:", best[0])

Punti di forza e debolezze

Vantaggi: interpretabili, non richiedono ridimensionamento, gestiscono confini non lineari e tipi di dati misti.

Svantaggi: alta varianza, perché piccole modifiche ai dati possono cambiare l'albero, propensione all'overfitting e sole divisioni allineate agli assi. Queste debolezze motivano l'uso di ensemble come le foreste casuali.

Verifica rapida

Verifichi la sua comprensione dei concetti relativi agli alberi decisionali.

Riepilogo

Riepilogo: gli alberi decisionali dividono i dati usando l'impurità di Gini o il guadagno informativo. Contrasti l'overfitting con la pre-potatura (max_depth, min_samples_leaf) o la post-potatura (ccp_alpha). Esamini i modelli con plot_tree e feature_importances_. La loro alta varianza motiva l'uso dei metodi ensemble.

Domande Frequenti

La lezione «Alberi decisionali: teoria e implementazione» è gratuita?

Sì — il testo completo di «Alberi decisionali: teoria e implementazione» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Learn AI with Python, passa a CoddyKit PRO. Il corso Learn AI with Python include 4 lezioni in totale.

Cosa imparerò in «Alberi decisionali: teoria e implementazione»?

Impurità di Gini, guadagno informativo, profondità dell’albero e overfitting: sklearn DecisionTreeClassifier. Eserciti Learn AI with Python con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Learn AI with Python?

Non è richiesta alcuna esperienza precedente. Learn AI with Python su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.

Quanto tempo richiede la lezione «Alberi decisionali: teoria e implementazione»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Learn AI with Python?

Sì. Ogni lezione Learn AI with Python include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Alberi decisionali: teoria e implementazione
  2. Random forest e bagging
  3. Gradient boosting: GBM e XGBoost
  4. LightGBM e CatBoost
← Torna a Learn AI with Python