<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>alberi decisionali &#8211; paologironi blog</title>
	<atom:link href="https://www.gironi.it/blog/tag/alberi-decisionali-it/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.gironi.it/blog</link>
	<description>Appunti sparsi di (retro) informatica, analisi dei dati, statistica, seo, e cose che cambiano</description>
	<lastBuildDate>Tue, 14 Jul 2026 13:46:45 +0000</lastBuildDate>
	<language>it-IT</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	
	<item>
		<title>Come usare gli Alberi Decisionali per classificare i dati</title>
		<link>https://www.gironi.it/blog/come-usare-gli-alberi-decisionali-per-classificare-i-dati/</link>
					<comments>https://www.gironi.it/blog/come-usare-gli-alberi-decisionali-per-classificare-i-dati/#respond</comments>
		
		<dc:creator><![CDATA[paolo]]></dc:creator>
		<pubDate>Thu, 11 Jan 2024 10:17:41 +0000</pubDate>
				<category><![CDATA[statistica]]></category>
		<category><![CDATA[alberi decisionali]]></category>
		<guid isPermaLink="false">https://www.gironi.it/blog/?p=3065</guid>

					<description><![CDATA[Di cosa parleremo: L&#8217;idea generale Impurity e criteri di divisione Un albero decisionale in R sui dati iris Un esempio SEO: prevedere le pagine in top 10 Valutare l&#8217;accuratezza Overfitting e potatura Importanza delle variabili Dai singoli alberi alle foreste: la Random Forest FAQ Quando analizziamo un dataset con molte variabili e vogliamo prevedere una &#8230; <a href="https://www.gironi.it/blog/come-usare-gli-alberi-decisionali-per-classificare-i-dati/" class="more-link">Leggi tutto<span class="screen-reader-text"> "Come usare gli Alberi Decisionali per classificare i dati"</span></a>]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-group has-background" style="background-color:#f5f7f9;margin-top:2.5rem;margin-bottom:2.5rem;padding-top:1.5rem;padding-right:1.5rem;padding-bottom:1.5rem;padding-left:1.5rem"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<p><strong>Di cosa parleremo</strong>:</p>
<ul>
<li><a href="#idea-generale">L&#8217;idea generale</a></li>
<li><a href="#gini">Impurity e criteri di divisione</a></li>
<li><a href="#r-esempio">Un albero decisionale in R sui dati iris</a></li>
<li><a href="#seo-esempio">Un esempio SEO: prevedere le pagine in top 10</a></li>
<li><a href="#accuratezza">Valutare l&#8217;accuratezza</a></li>
<li><a href="#overfitting">Overfitting e potatura</a></li>
<li><a href="#feature-importance">Importanza delle variabili</a></li>
<li><a href="#random-forest">Dai singoli alberi alle foreste: la Random Forest</a></li>
<li><a href="#faq">FAQ</a></li>
</ul>
</div></div>



<p class="wp-block-paragraph">Quando analizziamo un dataset con molte variabili e vogliamo prevedere una categoria — se un utente convertirà o no, se una pagina andrà in top 10, se una keyword è ad alta o bassa competizione — il primo problema è capire quali variabili contano davvero e come combinarle. <br> Gli <strong>alberi decisionali</strong> affrontano questo problema nel modo più naturale che ci sia: una sequenza di domande sì/no che, passo dopo passo, separano i dati in gruppi sempre più omogenei.</p>



<h2 class="wp-block-heading" id="idea-generale">L&#8217;idea generale</h2>



<p class="wp-block-paragraph">Un albero decisionale è una struttura che prende decisioni in sequenza. Ogni <strong>nodo</strong> interno dell&#8217;albero pone una domanda (per esempio: &#8220;la lunghezza del petalo è maggiore di 2.45 cm?&#8221;), e in base alla risposta segue un ramo verso il nodo successivo. Si arriva così a una <strong>foglia</strong>, che assegna la classe di appartenenza.</p>



<p class="wp-block-paragraph">La potenza dell&#8217;idea è che il risultato è <strong>intrinsecamente interpretabile</strong>: si può capire perché l&#8217;albero ha preso una certa decisione, semplicemente seguendo il percorso dalle radici alla foglia. Nessuna scatola nera.</p>



<h2 class="wp-block-heading" id="gini">Impurity e criteri di divisione</h2>



<p class="wp-block-paragraph">Come decide l&#8217;albero quale domanda fare per prima? L&#8217;obiettivo è trovare la divisione che separa i dati nel modo più &#8220;pulito&#8221; possibile. Il concetto centrale è l&#8217;<strong>impurità</strong> (impurity): una suddivisione perfetta è quella in cui tutti gli elementi di un gruppo appartengono alla stessa classe.</p>



<p class="wp-block-paragraph">La misura più comune è l&#8217;<strong>indice di Gini</strong>. Per un nodo con \( K \) classi, dove \( p_k \) è la proporzione di elementi della classe \( k \), si definisce:</p>



\( G = \sum_{k=1}^{K} p_k (1 &#8211; p_k) \\ \)



<p class="wp-block-paragraph">L&#8217;indice vale 0 quando il nodo è puro (tutti gli elementi della stessa classe), e raggiunge il massimo quando le classi sono uniformemente distribuite. <br> L&#8217;albero prova tutte le possibili divisioni su tutte le variabili e sceglie quella che riduce di più l&#8217;impurità media ponderata dei due nodi figli.</p>



<p class="wp-block-paragraph">Esistono anche altre misure, come l&#8217;<strong>entropia</strong> (usata per costruire alberi C4.5), ma l&#8217;idea è la stessa: minimizzare l&#8217;incertezza.</p>



<h2 class="wp-block-heading" id="r-esempio">Un albero decisionale in R sui dati iris</h2>



<p class="wp-block-paragraph">Costruiamo un albero decisionale con R usando il dataset <code>iris</code>, che contiene 150 fiori con le misure di sepali e petali di tre specie. Il nostro obiettivo è classificare la specie in base alle misure.</p>



<p class="wp-block-paragraph">Prepariamo i dati:</p>



<pre class="wp-block-code"><code>data(iris)
library(rpart)

set.seed(123)
train_idx &lt;- sample(1:nrow(iris), 0.8 * nrow(iris))
train &lt;- iris[train_idx, ]
test  &lt;- iris[-train_idx, ]

tree &lt;- rpart(Species ~ ., data = train, method = "class")</code></pre>



<p class="wp-block-paragraph">Visualizziamo l&#8217;albero:</p>



<pre class="wp-block-code"><code>library(rpart.plot)
rpart.plot(tree, type = 2, extra = 104)</code></pre>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1050" height="675" src="https://www.gironi.it/blog/wp-content/uploads/2026/07/alberi-decisionali-iris.png" class="wp-image-4268" alt="Albero decisionale: classificazione delle specie di iris" srcset="https://www.gironi.it/blog/wp-content/uploads/2026/07/alberi-decisionali-iris.png 1050w, https://www.gironi.it/blog/wp-content/uploads/2026/07/alberi-decisionali-iris-300x193.png 300w, https://www.gironi.it/blog/wp-content/uploads/2026/07/alberi-decisionali-iris-1024x658.png 1024w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /><figcaption class="wp-element-caption">Albero decisionale: classificazione delle specie di iris</figcaption></figure>



<p class="wp-block-paragraph">L&#8217;albero è semplicissimo. Parte dalla radice con una domanda sulla lunghezza del petalo. Se è minore di 2.45 cm, abbiamo la certezza che si tratta di <em>setosa</em> (tutti i 41 casi del training set finiscono lì). Se è maggiore, entriamo nel ramo successivo, che separa <em>versicolor</em> da <em>virginica</em> basandosi ancora sulla lunghezza del petalo, questa volta con soglia 4.75 cm.</p>



<p class="wp-block-paragraph">La cosa notevole è che l&#8217;albero non ha usato affatto le misure dei sepali: le ha trovate irrilevanti per la classificazione, e le ha ignorate automaticamente. Questa è una forma implicita di <strong>selezione delle variabili</strong>: l&#8217;albero sceglie da solo quali metriche contano, e in che ordine.</p>



<h2 class="wp-block-heading" id="seo-esempio">Un esempio SEO: prevedere le pagine in top 10</h2>



<p class="wp-block-paragraph">Iris va bene per capire il meccanismo, ma proviamo qualcosa di più vicino al nostro lavoro quotidiano. Generiamo dati sintetici di 200 pagine web con metriche SEO reali — parole, leggibilità, velocità, backlink, immagini, keyword nel title, lunghezza della meta descrizione — e costruiamo un albero che preveda se una pagina arriverà in top 10.</p>



<pre class="wp-block-code"><code>set.seed(2026)

n &lt;- 200
word_count      &lt;- round(runif(n, 300, 3000))
readability     &lt;- round(runif(n, 20, 80), 1)
page_speed_ms   &lt;- round(runif(n, 500, 8000))
backlinks       &lt;- round(runif(n, 0, 150))
images          &lt;- round(runif(n, 0, 20))
keyword_in_title &lt;- rbinom(n, 1, 0.35)
meta_desc_len   &lt;- round(runif(n, 0, 165))

# target simulato: top_10 basato su combinazione di fattori
score &lt;- (
  (backlinks &gt; 30) * 0.30 +
  (keyword_in_title == 1) * 0.20 +
  (readability &gt; 45 &amp; readability &lt; 70) * 0.15 +
  (word_count &gt; 800 &amp; word_count &lt; 2200) * 0.15 +
  (page_speed_ms &lt; 3000) * 0.10 +
  (meta_desc_len &gt; 110 &amp; meta_desc_len &lt; 155) * 0.10
)
score &lt;- score + rnorm(n, 0, 0.12)
top_10 &lt;- factor(ifelse(score &gt; 0.50, "si", "no"))

seo_data &lt;- data.frame(word_count, readability, page_speed_ms,
                       backlinks, images, keyword_in_title,
                       meta_desc_len, top_10)</code></pre>



<p class="wp-block-paragraph">La variabile target <code>top_10</code> è stata costruita in modo che dipenda da tutti questi fattori, ciascuno con un peso diverso — i backlink sono i più influenti, seguiti dalla presenza della keyword nel title, da una leggibilità nella fascia giusta, e così via. Aggiungiamo anche una componente casuale per simulare ciò che non possiamo misurare.</p>



<p class="wp-block-paragraph">Alleniamo l&#8217;albero:</p>



<pre class="wp-block-code"><code>library(rpart)
train_idx &lt;- sample(1:n, 0.7 * n)
tree_seo &lt;- rpart(top_10 ~ ., data = seo_data[train_idx, ],
                  method = "class", control = rpart.control(cp = 0.01))</code></pre>



<p class="wp-block-paragraph">Visualizziamo l&#8217;albero risultante:</p>



<pre class="wp-block-code"><code>library(rpart.plot)
rpart.plot(tree_seo, type = 2, extra = 104)</code></pre>



<figure class="wp-block-image size-large"><img decoding="async" width="1125" height="750" src="https://www.gironi.it/blog/wp-content/uploads/2026/07/alberi-seo-albero.png" class="wp-image-4274" alt="Albero decisionale: previsione pagine in top 10" srcset="https://www.gironi.it/blog/wp-content/uploads/2026/07/alberi-seo-albero.png 1125w, https://www.gironi.it/blog/wp-content/uploads/2026/07/alberi-seo-albero-300x200.png 300w, https://www.gironi.it/blog/wp-content/uploads/2026/07/alberi-seo-albero-1024x683.png 1024w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /><figcaption class="wp-element-caption">Albero decisionale: previsione pagine in top 10</figcaption></figure>



<p class="wp-block-paragraph">L&#8217;albero ci dice qualcosa di molto interessante. La prima domanda — la variabile più discriminante — riguarda i <strong>backlink</strong>: se sono pochi, la pagina difficilmente entra in top 10, indipendentemente dagli altri fattori. Solo le pagine con un numero sufficiente di backlink passano al ramo successivo, dove l&#8217;albero valuta la <strong>leggibilità</strong> e la <strong>presenza della keyword nel title</strong>. È esattamente il genere di gerarchia che ci aspetteremmo da un&#8217;analisi SEO seria: prima l&#8217;autorità (backlink), poi la qualità on-page.</p>



<p class="wp-block-paragraph">La <strong>feature importance</strong> conferma questa gerarchia:</p>



<pre class="wp-block-code"><code>tree_seo$variable.importance</code></pre>



<figure class="wp-block-image size-large"><img decoding="async" width="975" height="600" src="https://www.gironi.it/blog/wp-content/uploads/2026/07/alberi-seo-importance.png" class="wp-image-4276" alt="Importanza delle variabili SEO" srcset="https://www.gironi.it/blog/wp-content/uploads/2026/07/alberi-seo-importance.png 975w, https://www.gironi.it/blog/wp-content/uploads/2026/07/alberi-seo-importance-300x185.png 300w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /><figcaption class="wp-element-caption">Importanza delle variabili SEO</figcaption></figure>



<p class="wp-block-paragraph">I backlink dominano, come previsto. Poi vengono leggibilità e keyword nel title, mentre la velocità e la lunghezza della meta descrizione contribuiscono meno. L&#8217;albero non ha selezionato il numero di immagini come rilevante — nei nostri dati sintetici non lo era, e l&#8217;albero lo ha ignorato.</p>



<p class="wp-block-paragraph">n.b. Questi dati sono sintetici: in un progetto reale con dati reali, l&#8217;albero rivelerebbe la gerarchia effettiva delle variabili per il vostro specifico contesto. L&#8217;esempio serve a mostrare il tipo di risposta che si ottiene, non a stabilire verità universali.</p>



<p class="wp-block-paragraph"><strong>Un&#8217;avvertenza importante</strong>: l&#8217;albero individua schemi ricorrenti nei dati osservati, non relazioni di causa-effetto. Una variabile può risultare molto utile per prevedere il comportamento di una pagina senza esserne la causa diretta. Per esempio, se l&#8217;albero seleziona il CTR come variabile discriminante, non significa che aumentare il CTR farà salire la pagina in top 10 — potrebbe essere che le pagine in top 10 tendono ad avere un CTR più alto perché sono già in top 10. L&#8217;albero ci dice cosa è correlato, non cosa è causale.</p>



<h2 class="wp-block-heading" id="accuratezza">Valutare l&#8217;accuratezza</h2>



<p class="wp-block-paragraph">Verifichiamo come si comporta sui dati di test:</p>



<pre class="wp-block-code"><code>pred &lt;- predict(tree, newdata = test, type = "class")
table(pred, test$Species)</code></pre>



<p class="wp-block-paragraph">La tabella di contingenza (matrice di confusione) mostra quante predizioni sono corrette e quante no. L&#8217;accuratezza si calcola come:</p>



\( \text{accuratezza} = \frac{\text{predizioni corrette}}{\text{predizioni totali}} \\ \)



<p class="wp-block-paragraph">Il nostro albero sbaglia pochissimo: è un modello semplice e i dati iris sono ben separabili. Nel mondo reale, però, le cose sono quasi sempre più complesse.</p>



<h2 class="wp-block-heading" id="overfitting">Overfitting e potatura</h2>



<p class="wp-block-paragraph">Qui arriviamo al punto delicato. Un albero decisionale può continuare a suddividersi finché ogni foglia contiene un solo elemento. In quel caso, l&#8217;accuratezza sul training set sarà del 100%. Ma l&#8217;albero avrà semplicemente <strong>memorizzato il dataset di addestramento</strong> invece di impararne le regolarità.</p>



<p class="wp-block-paragraph">Questo fenomeno si chiama <strong>overfitting</strong>: il modello si adatta troppo ai dati di addestramento, catturando rumore e dettagli specifici che non si ripresenteranno sui dati nuovi.</p>



<div class="wp-block-group has-background" style="background-color:#f5f7f9;margin-top:2.5rem;margin-bottom:2.5rem;padding-top:1.5rem;padding-right:1.5rem;padding-bottom:1.5rem;padding-left:1.5rem"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<p>L&#8217;overfitting è il problema principale degli alberi decisionali. Un albero troppo profondo memorizza il training set ma fallisce sui dati nuovi; uno troppo superficiale non coglie le strutture reali dei dati. Il punto giusto si trova con tecniche di validazione incrociata e <strong>potatura</strong> (pruning): si costruisce un albero volutamente grande e poi si tagliano i rami che non migliorano l&#8217;errore di previsione.</p>
</div></div>



<p class="wp-block-paragraph">In R, si può potare l&#8217;albero con <code>rpart</code> usando il parametro <code>cp</code> (complexity parameter), che impedisce all&#8217;albero di fare divisioni che non riducono l&#8217;errore di almeno una certa soglia. La funzione <code>printcp(tree)</code> mostra l&#8217;errore di validazione incrociata per diverse dimensioni dell&#8217;albero, aiutando a scegliere il punto di taglio.</p>



<h2 class="wp-block-heading" id="feature-importance">Importanza delle variabili</h2>



<p class="wp-block-paragraph">Uno dei sottoprodotti più utili di un albero decisionale è la <strong>feature importance</strong>: la misura di quanto ogni variabile contribuisce alla riduzione dell&#8217;impurità complessiva. In <code>rpart</code> si ottiene con:</p>



<pre class="wp-block-code"><code>tree$variable.importance</code></pre>



<p class="wp-block-paragraph">Questo ci dice, per esempio, che la lunghezza del petalo è di gran lunga la variabile più discriminante per l&#8217;iris — e le misure dei sepali contano poco o nulla. <br> Nel web marketing, un&#8217;analisi analoga si può fare per capire quali metriche separano davvero le pagine ad alte prestazioni da quelle a basse prestazioni.</p>



<h2 class="wp-block-heading" id="random-forest">Dai singoli alberi alle foreste: la Random Forest</h2>



<p class="wp-block-paragraph">Un singolo albero decisionale è instabile: un piccolo cambiamento nei dati di partenza può produrre un albero completamente diverso. Per ridurre questo problema, le <strong>Random Forest</strong> (foreste casuali) costruiscono centinaia di alberi su versioni leggermente diverse dei dati (campionamento con reinserimento) e ne mediano le previsioni. Il risultato è molto più stabile e accurato di un singolo albero, pur mantenendo gran parte dell&#8217;interpretabilità.</p>



<p class="wp-block-paragraph">Se un singolo albero è come chiedere il parere di un esperto, una Random Forest è come consultare centinaia di esperti indipendenti e prendere la decisione per maggioranza.</p>



<p class="wp-block-paragraph">Ne parleremo in un prossimo articolo.</p>



<h2 class="wp-block-heading" id="faq">FAQ</h2>



<p class="wp-block-paragraph"><strong>Quando usare un albero decisionale invece di una regressione logistica?</strong><br> Quando i dati hanno interazioni complesse tra variabili (per esempio, l&#8217;effetto dell&#8217;età sulla conversione cambia a seconda del canale di acquisizione) e quando la priorità è l&#8217;interpretabilità.</p>



<p class="wp-block-paragraph"><strong>L&#8217;albero può gestire variabili numeriche e categoriche insieme?</strong><br> Sì, <code>rpart</code> gestisce naturalmente entrambi i tipi. Le variabili categoriche vengono convertite internamente in split binari.</p>



<p class="wp-block-paragraph"><strong>Quanto deve essere profondo un albero?</strong><br> Dipende dai dati. La regola pratica: usare la validazione incrociata (il <code>plotcp()</code> di <code>rpart</code>) per trovare la profondità che minimizza l&#8217;errore di previsione su dati non visti.</p>



<p class="wp-block-paragraph"><strong>L&#8217;albero decisionale funziona anche per problemi di regressione?</strong><br> Sì. Con <code>method = "anova"</code> invece di <code>"class"</code>, l&#8217;albero prevede valori numerici (per esempio, il tempo sulla pagina atteso).</p>



<p class="wp-block-paragraph"><strong>Perché l&#8217;albero ha usato solo la lunghezza del petalo?</strong><br> Perché nei dati iris è la variabile più discriminante: da sola basta per separare una delle tre specie (setosa) e quasi separa le altre due. L&#8217;albero, essendo un algoritmo greedy, sceglie la variabile che dà la miglior divisione immediata.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph">Tra gli alberi decisionali, la <a href="https://www.gironi.it/blog/lalgoritmo-di-discesa-del-gradiente-gradient-descent-spiegato-semplice/">discesa del gradiente</a> e la riduzione delle dimensioni c&#8217;è un filo che li unisce: tutti risolvono il problema di dare struttura a dati complessi, ciascuno con il proprio approccio. La prossima tappa di questo percorso è la <strong>discesa del gradiente</strong>, il motore che fa funzionare buona parte del machine learning moderno.</p>



<h3 class="wp-block-heading">Per approfondire</h3>



<p class="wp-block-paragraph">Se vuoi approfondire gli alberi decisionali, <a href="https://www.amazon.it/dp/1461471370?tag=consulenzeinf-21" rel="nofollow sponsored noopener" target="_blank"><em>An Introduction to Statistical Learning</em></a> di James, Witten, Hastie e Tibshirani è il punto di riferimento: spiega alberi, Random Forest e criteri di divisione con il giusto equilibrio tra intuizione e formalismo. I laboratori R sono liberamente disponibili online.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.gironi.it/blog/come-usare-gli-alberi-decisionali-per-classificare-i-dati/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
