master-degree-notes/Foundation of data science/notes/9 Decision tree.md

3.8 KiB

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!Pasted image 20241208151418.png

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/