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/