pexels-ekrulila-3837494

Foreste casuali ed alberi decisionali – di che cosa si tratta ?

In questo nuovo capitolo parliamo della combinazione di sistemi di apprendimento debolì e forti tramite l’utilizzo di foreste casuali e come costruire, attraverso la libreria scikit-learn, un albero decisionale

Come visto negli articoli precedenti, gli alberi decisionali possono creare complessi confini decisionali dividendo lo spazio delle caratteristiche in rettangoli. Il problema però esiste perché più profondo è l’albero e più è possibile che si generi il fenomeno dell’overfitting. 

Per la realizzazione di un albero decisionale ci viene in aiuto la libreria scikit-learnscikit-learn la quale ci permette di costruire alberi di massima profondità 3 e di utilizzare come criterio di impurità l’entropia

				
					from sklearn.tree import DecisionTreeClassifier

tree = DecisionTreeClassifier(criterion='entropy', max_depth=3, random_state=0)
tree.fit(X_train, y_train)

X_combined = np.vstack((X_train, X_test))
y_combined = np.hstack((y_train, y_test))
plot_decision_regions(X_combined, y_combined, 
                      classifier=tree, test_idx=range(105, 150))

plt.xlabel('petal length [cm]')
plt.ylabel('petal width [cm]')
plt.legend(loc='upper left')
plt.tight_layout()
plt.show()
				
			
Foreste casuali

La potenza e l’usabilità di scikitlearn ci permette di visualizzare un albero decisionale, dopo averlo esportato come file .dot attraverso il programma GraphViz.

Per creare il file .dot utilizziamo la funzione export_graphviz del modulo tree.

				
					from sklearn.tree import export_graphviz

export_graphviz(tree, 
                out_file='tree.dot', 
                feature_names=['petal length', 'petal width'])
				
			

Ora, dopo l’installazione del programma GraphViz sul pc possiamo convertire il file tree.dot in un PNG lanciando il seguente comando da cmd dopo essere entrati all’interno della cartella dove risiede il file. 

				
					dot -Tpng tree.dot -o tree.png
				
			

Con la figura costruita con GraphViz, possiamo tracciare con comodità le suddivisioni determinate dall’albero decisionale sul dataset di addestramento. 

Abbiamo diviso i 105 campioni iniziali in 34 e 71 utilizzando per la suddivisione la lunghezza del petalo. Dopo la prima suddivisione la parte sinistra è già pura e contiene solo campioni della classe Iris setosa (entropia uguale a 0). Le suddivisioni sul lato destro invece servono a separare i campioni appartenenti alla classe Versicolor da quella Virginica . 

Combinare sistemi di apprendimento debolì e forti con le foreste casuali

Le foreste casuali hanno acquisito grande importanza nel machine learning durante l’ultimo decennio grazie alle loro buone prestazioni di classificazione, alla loro scalabilità e alla loro facilità d’uso. Una foresta casuale può essere considerata come un insieme di alberi decisionali. 

L’idea è quella di combinare più sistemi di apprendimento debolì per costruire un modello più robusto, un sistema di apprendimento forte che offra un miglior errore di generalizzazione e sia meno suscettibile a problemi di overfitting.

Leggi articolo   Socket Python 3.9 - Client e Server

L’algoritmo viene riepilogato in 4 semplici passi:

  1.  trarre un campione iniziale (bootstrap) di dimensioni n. 
  2. far crescere un albero partendo dal bootstrap e per ogni nodo:
    1. selezionare d caratteristiche senza reinserimento;
    2. suddividere il nodo utilizzando la caratteristica che fornisce la migliore suddivisione sulla base della funzione obbiettivo;
  3.  ripetere per k volte i passi 1 e 2;
  4. aggregare le previsioni di ciascun albero per assegnare l’etichetta della classe sulla base di un voto a maggioranza

Vi è una leggera modifica al passo 2 quando dobbiamo addestrare singoli alberi decisionali, infatti, invece di valutare tutte le funzioni sulle caratteristiche per determinare la miglior suddivisione in ciascun nodo, considereremo solo un sottoinsieme casuale di questi. 

Sebbene le foreste casuali non offrano lo stesso livello di interoperabilità degli alberi decisionali, un loro vantaggio è il fatto che non dobbiamo preoccuparci della scelta di un buon valore per gli iperparametri. In genere la foresta casuale non va neanche potata e l’unico valore di cui dobbiamo preoccuparci è il numero di alberi k che abbiamo scelto per la foresta. 

Maggiore è il numero di alberi e migliori saranno le prestazioni del classificatore a foresta causale. 

Implementiamo una foresta casuale con scikit-learn

				
					from sklearn.ensemble import RandomForestClassifier

forest = RandomForestClassifier(criterion='entropy',
                                n_estimators=10, 
                                random_state=1,
                                n_jobs=2)
forest.fit(X_train, y_train)

plot_decision_regions(X_combined, y_combined, 
                      classifier=forest, test_idx=range(105, 150))

plt.xlabel('petal length [cm]')
plt.ylabel('petal width [cm]')
plt.legend(loc='upper left')
plt.tight_layout()
plt.show()
				
			

Utilizzando il codice precedente abbiamo addestrato una foresta casuale di 10 alberi tramite il parametro n_estimetors e come criterio di impurità l’entropia. N_jobs serve a scopi dimostrativi per consentirci di parallelizzare l’addestramento del modello utilizzando i core disponibili nel pc. 

Condividi il post

Condividi su facebook
Condividi su google
Condividi su twitter
Condividi su email
Condividi su whatsapp