39 lines
No EOL
3.8 KiB
Markdown
39 lines
No EOL
3.8 KiB
Markdown
L'algoritmo non è altro che una serie di condizioni if/else che vanno a formare un albero di decisione.
|
|
Questo albero ci divide il nostro spazio con i dati di training in una griglia.
|
|
![[Pasted image 20241208151358.png|120]]![[Pasted image 20241208151418.png|200]]
|
|
|
|
Un decision tree fatto bene fa in modo che la griglia divida perfettamente tutte le classi. Non è sempre possibile, nei casi in cui nella stessa "cella" si trovano più classi, si va a voto di maggioranza.
|
|
|
|
Tutto bello, ma come si traina sto coso?
|
|
|
|
#### Training
|
|
Il processo di training di un _decision tree_ si basa sulla scelta iterativa delle condizioni di splitting, ovvero i criteri che permettono di dividere i dati in due o più sottoinsiemi. Questo processo avviene nodo per nodo, partendo dalla radice fino a raggiungere i nodi foglia.
|
|
|
|
1. **Scegliere lo splitting ottimale:**
|
|
Per ciascun nodo, si seleziona la condizione di splitting che massimizza il _information gain_ (guadagno informativo) o, in alternativa, minimizza una misura di impurità. Le metriche comuni includono:
|
|
- **Gini Impurity:** misura quanto è probabile classificare in modo errato un campione scelto casualmente.
|
|
- **Entropy:** derivata dalla teoria dell'informazione, misura il livello di disordine o incertezza in un nodo. Nel nostro caso, è un valore che sarà 0 se un dataset (in our case, il sottoinsieme dato dalla condizione di splitting che stiamo esaminando) contiene solo punti di una classe, sarà 1 se invece è uniformemente distribuito:$$H(D) = \Sigma^n _{i=1}\;p_{i}\; log_{2}(p_{i})$$
|
|
, nella formula, $p_i$ rappresenta la proporzione di punti appartenenti alla classe $i$.
|
|
A questo punto si calcola l'**information gain**, considerando l'entropia.
|
|
La maggior parte delle implementazioni fa uso di alberi binari. In questo caso ogni possibile condizione di splitting divide i dati in due sotto-dataset. Calcoliamo l'entropia $H(D_{1})$ e $H(D_{2})$ dei due sotto-dataset, e definiamo $|D_{1}|$ e $|D_{2}|$ come le loro cardinalità, mentre $|D|$ è la cardinalità del dataset parent (sia $D_{1}$ che $D_{2}$), a questo punto possiamo calcolare il gain come $H(D)-\frac{D_{1}}{D}H(D_{1})-\frac{D_{2}}{D}H(D_{2})$ , più generalmente la formula diventa: $$H(D) - \Sigma^V_{v=1} \frac{|D_{v}|}{|D|}H (D_{v})$$
|
|
- **Variance Reduction (per problemi di regressione):** misura quanto la divisione riduce la varianza dei valori nei sottoinsiemi.
|
|
|
|
2. **Applicare lo splitting:**
|
|
Una volta scelta la condizione ottimale, il nodo corrente si divide in due o più figli, separando i dati in base alla condizione di splitting.
|
|
|
|
3. **Ripetere ricorsivamente:**
|
|
Il processo viene ripetuto per ciascun nodo figlio, finché:
|
|
- Non si raggiunge una condizione di stop (ad esempio, una profondità massima dell'albero o un numero minimo di campioni in un nodo).
|
|
- Il nodo non contiene solo dati di una singola classe (nodo puro).
|
|
- Non si ottiene un guadagno informativo significativo dallo splitting.
|
|
|
|
4. **Gestione dell'overfitting:**
|
|
Gli alberi di decisione tendono a crescere troppo, creando divisioni molto specifiche per adattarsi perfettamente ai dati di training, il che può portare a sovradattamento. Per evitarlo, si utilizzano tecniche come:
|
|
- **Pruning (potatura):** rimuovere rami non significativi dopo che l'albero è stato costruito.
|
|
- **Early Stopping:** fermare la crescita dell'albero quando si raggiunge una soglia predefinita.
|
|
- **Impostare limiti:** come profondità massima o numero minimo di campioni per nodo.
|
|
|
|
5. **Assegnare la classe alle foglie:**
|
|
Nei nodi foglia, la classe predetta è quella con la maggioranza relativa dei campioni presenti nel nodo (per classificazione). Nei problemi di regressione, invece, la predizione è in genere la media dei valori nei dati del nodo.
|
|
|
|
Esistono vari tipi di decision tree, lascio il link: https://www.geeksforgeeks.org/decision-tree-algorithms/ |