Esercizio - Albero di decisione sul ristorante - guadagno d'informazione e potatura (slide del corso)
Teoria: Apprendimento automatico nell'IA - supervisionato, SVM e valutazioneQuadro del machine learning nel corso di IA. Tre forme di apprendimento: supervisionato (coppie ingresso-uscita, classificazione se l'uscita è discreta e regressione se è un numero), non supervisionato (pattern senza feedback, per esempio clustering) e per rinforzo (ricompense). Un'ipotesi h approssima la funzione vera f e si valuta sul test set, non sul training set: un modello troppo semplice ha bias alto (underfitting), uno troppo complesso varianza alta (overfitting). Servono training, validation e test set; con pochi dati si usa la k-fold cross-validation. Alberi di decisione: si sceglie l'attributo con massimo guadagno d'informazione Gain = B(p/(p+n)) - somma (Nk/N) B(pk/Nk), si pota con il test del chi quadro (Delta > Delta*), si riduce la varianza con bagging e random forest. Perdita L1 e L2, regressione lineare e discesa del gradiente w <- w - alpha dL/dw. SVM: separatore a margine massimo, vettori di supporto, kernel trick con K(xj,xk). Pipeline scikit-learn del laboratorio 10: load_digits, train_test_split, SVC(C, kernel, gamma), fit, predict, classification_report, confusion_matrix, cross_val_score.Apprendimento automatico nell'IA - supervisionato, SVM e valutazione →, sezione 4. Approfondimento sugli alberi: Alberi di decisioneUn albero di decisione partiziona i dati con una sequenza di regole su una sola variabile alla volta (nodi interni = regole, foglie = predizioni: classe più frequente, oppure media del target in regressione). Si costruisce in modo ricorsivo scegliendo a ogni nodo la divisione che rende i figli più «puri»: con l'entropia $H=-\sum p_i\log_2p_i$ e il guadagno d'informazione $IG=H(S)-\sum\frac{|S_v|}{|S|}H(S_v)$ (ID3), oppure con l'indice di Gini $1-\sum p_i^2$ e soglie $x\le t$ su variabili numeriche (CART); in regressione con MSE o riduzione di varianza. Un albero pienamente sviluppato fa overfitting (varianza alta): si limita con la profondità massima (pre-potatura) o con la potatura a costo-complessità $R_\alpha(T)=R(T)+\alpha|T|$ (post-potatura). Pro: interpretabile, niente normalizzazione, predizione immediata; contro: varianza alta, da cui le foreste. Programma di Telecomunicazioni: Decision Trees e Random Forests.Alberi di decisione → e Esercizio - Albero di decisione ID3 sul dataset del tennis.
Testo (dalle slide). Si vuole decidere se aspettare un tavolo al ristorante (WillWait, sì o no). Gli attributi sono 10: Alt (esiste un ristorante alternativo vicino), Bar (c'è un'area bar per aspettare), Fri (venerdì o sabato), Hun (si ha fame), Pat (clienti presenti: None, Some, Full), Price (fascia di prezzo: basso, medio, alto), Rain (piove), Res (c'è una prenotazione), Type (French, Italian, Thai, Burger), Est (attesa stimata in minuti: 0-10, 10-30, 30-60, >60). Il training set ha 12 casi:
| es. | Alt | Bar | Fri | Hun | Pat | Price | Rain | Res | Type | Est | WillWait |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | Sì | No | No | Sì | Some | alto | No | Sì | French | 0-10 | Sì |
| 2 | Sì | No | No | Sì | Full | basso | No | No | Thai | 30-60 | No |
| 3 | No | Sì | No | No | Some | basso | No | No | Burger | 0-10 | Sì |
| 4 | Sì | No | Sì | Sì | Full | basso | Sì | No | Thai | 10-30 | Sì |
| 5 | Sì | No | Sì | No | Full | alto | No | Sì | French | >60 | No |
| 6 | No | Sì | No | Sì | Some | medio | Sì | Sì | Italian | 0-10 | Sì |
| 7 | No | Sì | No | No | None | basso | Sì | No | Burger | 0-10 | No |
| 8 | No | No | No | Sì | Some | medio | Sì | Sì | Thai | 0-10 | Sì |
| 9 | No | Sì | Sì | No | Full | basso | Sì | No | Burger | >60 | No |
| 10 | Sì | Sì | Sì | Sì | Full | alto | No | Sì | Italian | 10-30 | No |
| 11 | No | No | No | No | None | basso | No | No | Thai | 0-10 | No |
| 12 | Sì | Sì | Sì | Sì | Full | basso | No | No | Burger | 30-60 | Sì |
(a) Calcolare l'entropia dell'insieme e il guadagno d'informazione di ogni attributo alla radice. (b) Costruire l'albero con l'algoritmo del corso. (c) Con il test del (5%), stabilire se vanno potati il nodo Hungry sotto Patrons = Full e il nodo Patrons alla radice.
Soluzione
Formule. ; .
(a) Radice
Positivi: 1, 3, 4, 6, 8, 12, cioè ; negativi: 2, 5, 7, 9, 10, 11, cioè . L'entropia è bit.
Conteggi (positivi, negativi) per ogni valore e guadagni:
| attributo | suddivisione (pos, neg) | Gain |
|---|---|---|
| Alt | No (3,3), Sì (3,3) | |
| Bar | No (3,3), Sì (3,3) | |
| Fri | No (4,3), Sì (2,3) | |
| Hun | No (1,4), Sì (5,2) | |
| Pat | None (0,2), Some (4,0), Full (2,4) | |
| Price | basso (3,4), medio (2,0), alto (1,2) | |
| Rain | No (3,4), Sì (3,2) | |
| Res | No (3,4), Sì (3,2) | |
| Type | French (1,1), Italian (1,1), Thai (2,2), Burger (2,2) | |
| Est | 0-10 (4,2), 10-30 (1,1), 30-60 (1,1), >60 (0,2) |
Calcoli rappresentativi:
- Pat: , quindi ( bit nelle slide). .
- Type: ogni sottoinsieme è metà e metà, entropia in ogni caso: , . Dividere per Type non aiuta (come dicono le slide).
- Hun: , quindi .
- Est: , quindi .
La radice è Patrons.
(b) L'albero
- Patrons = None: (0,2), tutti negativi, foglia No.
- Patrons = Some: (4,0), tutti positivi, foglia Sì.
- Patrons = Full: (es. 4 e 12), (es. 2, 5, 9, 10). Entropia . Si ricalcolano i guadagni solo su questi 6 esempi:
| attributo | suddivisione (pos, neg) in Full | Gain |
|---|---|---|
| Hun | No (0,2), Sì (2,2) | |
| Price | basso (2,2), alto (0,2) | |
| Res | No (2,2), Sì (0,2) | |
| Type | French (0,1), Italian (0,1), Thai (1,1), Burger (1,1) | |
| Est | 10-30 (1,1), 30-60 (1,1), >60 (0,2) | |
| Alt, Fri | No (0,1), Sì (2,3) | |
| Rain | No (1,3), Sì (1,1) | |
| Bar | No (1,2), Sì (1,2) |
Per esempio : , . Cinque attributi sono a pari merito (Hun, Price, Res, Type, Est): l'algoritmo non dice quale scegliere e le slide scelgono Hungry. (Con una scelta diversa si ottengono alberi diversi ma tutti coerenti con il training set.)
- Full e Hun = No: (0,2), foglia No.
- Full e Hun = Sì: (2,2) (es. 2, 4, 10, 12), ancora misto. Entropia 1. Guadagni: Type ; Fri ; si sceglie Type: Italian No; Burger Sì; Thai (es. 2 con Fri = No e es. 4 con Fri = Sì) si divide ancora con Fri (guadagno 1): Fri = No No, Fri = Sì Sì.
Albero completo (coerente con tutti i 12 esempi):
Patrons?
├─ None -> No
├─ Some -> Sì
└─ Full -> Hungry?
├─ No -> No
└─ Sì -> Type?
├─ Italian -> No
├─ Burger -> Sì
└─ Thai -> Fri? (No -> No, Sì -> Sì)(c) Potatura con il
Hungry sotto Full (0 positivi e 2 negativi se No; 2 e 2 se Sì): , , . Attesi: No (): , ; Sì (): , . Attributo a valori: 1 grado di libertà, (tavola, probabilità ). : l'ipotesi nulla (Hungry irrilevante) non si rifiuta: si pota. Il ramo Full diventa una foglia con il valore più frequente: No (4 negativi contro 2 positivi).
Patrons alla radice (, ): attesi : None () e ; Some () e ; Full () e . Con i gradi di libertà sono 2 e : , l'attributo è significativo, si tiene.
Albero potato: Patrons: None No, Some Sì, Full No. Accuratezza sul training: esempi su 12, cioè , contro il dell'albero completo; ma l'albero potato è molto più semplice (un solo test) e di solito generalizza meglio, come richiede il rasoio di Ockham.
Verifica con Python
import math
righe = """Sì No No Sì Some alto No Sì French 0-10 Sì
Sì No No Sì Full basso No No Thai 30-60 No
No Sì No No Some basso No No Burger 0-10 Sì
Sì No Sì Sì Full basso Sì No Thai 10-30 Sì
Sì No Sì No Full alto No Sì French >60 No
No Sì No Sì Some medio Sì Sì Italian 0-10 Sì
No Sì No No None basso Sì No Burger 0-10 No
No No No Sì Some medio Sì Sì Thai 0-10 Sì
No Sì Sì No Full basso Sì No Burger >60 No
Sì Sì Sì Sì Full alto No Sì Italian 10-30 No
No No No No None basso No No Thai 0-10 No
Sì Sì Sì Sì Full basso No No Burger 30-60 Sì""".split("\n")
nomi = ["Alt", "Bar", "Fri", "Hun", "Pat", "Price", "Rain", "Res", "Type", "Est"]
D = [r.split() for r in righe]
def B(q): return 0 if q in (0, 1) else -(q * math.log2(q) + (1 - q) * math.log2(1 - q))
def H(S): return B(sum(r[-1] == "Sì" for r in S) / len(S))
def gain(S, a):
resto = sum(len(T) / len(S) * H(T) for v in set(r[a] for r in S) for T in [[r for r in S if r[a] == v]])
return H(S) - resto
def delta(S, a): # statistica chi quadro per la potatura
p = sum(r[-1] == "Sì" for r in S); n = len(S) - p; d = 0
for v in set(r[a] for r in S):
T = [r for r in S if r[a] == v]; pk = sum(r[-1] == "Sì" for r in T); nk = len(T) - pk
ph, nh = p * len(T) / len(S), n * len(T) / len(S)
d += (pk - ph) ** 2 / ph + (nk - nh) ** 2 / nh
return d
for a, nome in enumerate(nomi): print(nome, round(gain(D, a), 4))
full = [r for r in D if r[4] == "Full"]
print("Hungry in Full: gain", round(gain(full, 3), 4), "delta", delta(full, 3)) # 0.2516 e 1.5
print("Patrons alla radice: delta", round(delta(D, 4), 3)) # 6.667Output: guadagni come in tabella (Pat ), e .
Versione ripasso
Teoria: Apprendimento automatico nell'IA - supervisionato, SVM e valutazioneQuadro del machine learning nel corso di IA. Tre forme di apprendimento: supervisionato (coppie ingresso-uscita, classificazione se l'uscita è discreta e regressione se è un numero), non supervisionato (pattern senza feedback, per esempio clustering) e per rinforzo (ricompense). Un'ipotesi h approssima la funzione vera f e si valuta sul test set, non sul training set: un modello troppo semplice ha bias alto (underfitting), uno troppo complesso varianza alta (overfitting). Servono training, validation e test set; con pochi dati si usa la k-fold cross-validation. Alberi di decisione: si sceglie l'attributo con massimo guadagno d'informazione Gain = B(p/(p+n)) - somma (Nk/N) B(pk/Nk), si pota con il test del chi quadro (Delta > Delta*), si riduce la varianza con bagging e random forest. Perdita L1 e L2, regressione lineare e discesa del gradiente w <- w - alpha dL/dw. SVM: separatore a margine massimo, vettori di supporto, kernel trick con K(xj,xk). Pipeline scikit-learn del laboratorio 10: load_digits, train_test_split, SVC(C, kernel, gamma), fit, predict, classification_report, confusion_matrix, cross_val_score.Apprendimento automatico nell'IA - supervisionato, SVM e valutazione →, Alberi di decisioneUn albero di decisione partiziona i dati con una sequenza di regole su una sola variabile alla volta (nodi interni = regole, foglie = predizioni: classe più frequente, oppure media del target in regressione). Si costruisce in modo ricorsivo scegliendo a ogni nodo la divisione che rende i figli più «puri»: con l'entropia $H=-\sum p_i\log_2p_i$ e il guadagno d'informazione $IG=H(S)-\sum\frac{|S_v|}{|S|}H(S_v)$ (ID3), oppure con l'indice di Gini $1-\sum p_i^2$ e soglie $x\le t$ su variabili numeriche (CART); in regressione con MSE o riduzione di varianza. Un albero pienamente sviluppato fa overfitting (varianza alta): si limita con la profondità massima (pre-potatura) o con la potatura a costo-complessità $R_\alpha(T)=R(T)+\alpha|T|$ (post-potatura). Pro: interpretabile, niente normalizzazione, predizione immediata; contro: varianza alta, da cui le foreste. Programma di Telecomunicazioni: Decision Trees e Random Forests.Alberi di decisione →.
Formule. ; ; , , .
Radice (, ). Guadagni: Alt , Bar , Fri , Hun , Pat , Price , Rain , Res , Type , Est .
- Pat: None (0,2), Some (4,0), Full (2,4): , .
- Type: ogni sottoinsieme (1,1) o (2,2), entropia 1, .
Albero. None No; Some Sì; Full (2,4), : Hun, Price, Res, Type, Est tutti con guadagno (pari merito; le slide scelgono Hungry: ). Hun = No No; Hun = Sì (2,2) Type (guadagno ): Italian No, Burger Sì, Thai Fri (No No, Sì Sì).
Potatura (, 5%).
- Hungry in Full: attesi No , ; Sì e : (1 grado di libertà): si pota, Full No.
- Patrons: (2 gradi di libertà): si tiene.
- Albero potato: None No, Some Sì, Full No; accuratezza sul training contro dell'albero completo.
Attributi: Alt, Bar, Fri, Hun, Pat (None, Some, Full), Price (basso, medio, alto), Rain, Res, Type (French, Italian, Thai, Burger), Est (0-10, 10-30, 30-60, >60). Positivi: esempi 1, 3, 4, 6, 8, 12 (); negativi: 2, 5, 7, 9, 10, 11 ().
Esempi di calcolo. Hun: , . Est: , . In Full: Rain , ; Alt e Fri ; Bar . In Full e Hun = Sì: Type , Fri .
Ricordare: ; i guadagni dei sottoalberi si calcolano solo sugli esempi del ramo; pari merito tra cinque attributi in Full, le slide scelgono Hungry; con 1 grado di libertà e con 2.
gain(D, 4) # 0.5409
delta([r for r in D if r[4] == "Full"], 3) # 1.5Errori tipici: calcolare i guadagni dei sottoalberi sull'insieme intero; non pesare per ; gradi di libertà diversi da ; dimenticare la foglia con il valore più frequente dopo la potatura.