Per delle previsioni più accurate nel machine learning (oppure nel data mining) vengono utilizzati i classificatori ensemble, i quali combinano le previsioni di più modelli con lo scopo di produrre una previsione finale più accurata rispetto a quella che si potrebbe ottenere da qualsiasi modello singolo. Ovviamente, aumenta la complessità computazionale perchè in questo modo occorre addestrare più modelli.

In questo articolo, ti spiego cos’è e come funziona il voting, una tipologia di classificatore che ricade nella famiglia degli ensemble.

Cos’è il voting

Il voting combina le previsioni di diversi modelli di machine learning per fare delle previsioni finali più accurate e robuste. Di solito il voting viene utilizzato per risolvere problemi di classificazione.

In fase di creazione del tuo modello ensemble, hai la libertà di scegliere quali classificatori includere, ad esempio alberi decisionali, reti neurali, SVM, regressione logistica, KNN, ecc… Quindi, potrai scegliere quali classificatori inserire in base agli obiettivi specifici del tuo progetto, dalle caratteristiche dei tuoi dati e dalle prestazioni individuali dei singoli classificatori.

L’idea di base per ottenere dei risultati migliori è quella di combinare modelli che sono sufficientemente diversi tra loro (in termini di algoritmi, iper-parametri, o subset di dati su cui sono addestrati) in modo tale da ridurre il rischio che tutti commettano gli stessi errori sulle stesse istanze, aumentando la possibilità che gli errori di un modello vengano colmati dalle previsioni corrette degli altri modelli.

Quante tipologie di voting esistono?

Esistono principalmente due tipologie di voting: hard e soft. In base alla tipologia varia il processo di produzione dell’output.

Hard voting

In questo caso ogni classificatore nel modello ensemble vota per una classe, e la classe che riceve la maggior parte dei voti viene scelta come la classe finale prevista dall’ensemble.

Questo metodo conta essenzialmente il numero di voti per ogni classe e la classe con il maggior numero di voti viene scelta come previsione finale. È un approccio utilizzato quando i classificatori forniscono previsioni etichettate (come ad esempio in task di classificazione binaria), senza stime di probabilità.

Ad esempio, supponiamo di dover predire la classe di un particolare campione di acqua tramite un voting costituito da tre classificatori di base:

  • Classificatore 1: Acqua Buona (1)
  • Classificatore 2: Acqua Non Buona (0)
  • Classificatore 3: Acqua Buona (1)

Al campione in esame verrà assegnata la classe “1 (Buona)”, perchè è si tratta della classe più votata.

Soft voting

Nel soft voting, invece di votare per la classe finale direttamente, ogni classificatore fornisce una probabilità che l’istanza appartenga a ciascuna delle possibili classi.

La classe finale viene scelta basandosi sulla media delle probabilità predette per quella classe. Infatti, viene calcolata la media di queste probabilità per ciascuna classe e viene selezionata la classe con la media più alta come output finale. Il soft voting sfrutta quindi informazioni aggiuntive sul livello di fiducia di ogni classificatore nelle sue previsioni, che può portare a decisioni più informate e potenzialmente più accurate rispetto all’hard voting.

Con i dati dell’esempio precedente vediamo come funziona nella pratica il soft voting.

  • Classificatore 1: Probabilità di “Acqua Buona (1)” = 0.9
  • Classificatore 2: Probabilità di “Acqua Buona (1)” = 0.2
  • Classificatore 3: Probabilità di “Acqua Buona (1)” = 0.8

A questo punto si calcola la media delle probabilità, ovvero:

(0.9+0.2+0.8)/3 = 0.63

Dal momento che la media delle probabilità (0.63) è maggiore di 0.5, il soft voting classificherà l’acqua come “Buona (1)”.

Questo approccio è preferibile rispetto all’hard voting perchè considera l’incertezza delle previsioni fornendo un peso maggiore alle probabilità più alte. Infatti, se un classificatore è molto sicuro della sua previsione (ad esempio, assegna una probabilità del 90% a una classe), questa sicurezza influenzerà più fortemente la decisione finale rispetto a un classificatore che fornisce una previsione meno certa (ad esempio, una probabilità del 60%).

Da utilizzare, soprattutto in casi dove diversi classificatori hanno competenze diverse e possono essere complementari l’uno all’altro. Ad esempio, se un classificatore è molto bravo a riconoscere esempi di una certa classe ma meno bravo con un’altra, mentre un altro classificatore ha un set complementare di competenze, combinando le loro probabilità di previsione attraverso il soft voting, il sistema ensemble può sfruttare i punti di forza di entrambi.

Come si implementa il voting in Python?

Per implementare il voting in Python puoi utilizzare la libreria tramite la classe chiamata VotingClassifier per i modelli ensemble di tipo voting. Tramite il parametro voting puoi scegliere tra “hard voting” e “soft voting”.

Ecco un esempio di codice:

from sklearn.ensemble import VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# Creazione di un dataset fittizio
X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, random_state=42)

# Split del dataset in training set e test set
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Definizione dei classificatori base
log_clf = LogisticRegression()
tree_clf = DecisionTreeClassifier()
svm_clf = SVC(probability=True) # `probability=True` è necessario per il soft voting

# Creazione del VotingClassifier per hard voting
voting_clf_hard = VotingClassifier(estimators=[('lr', log_clf), ('dt', tree_clf), ('svc', svm_clf)], voting='hard')
voting_clf_hard.fit(X_train, y_train)

# Predizione e valutazione per hard voting
y_pred_hard = voting_clf_hard.predict(X_test)
print("Accuracy (Hard Voting):", accuracy_score(y_test, y_pred_hard))

# Creazione del VotingClassifier per soft voting
voting_clf_soft = VotingClassifier(estimators=[('lr', log_clf), ('dt', tree_clf), ('svc', svm_clf)], voting='soft')
voting_clf_soft.fit(X_train, y_train)

# Predizione e valutazione per soft voting
y_pred_soft = voting_clf_soft.predict(X_test)
print("Accuracy (Soft Voting):", accuracy_score(y_test, y_pred_soft))

Come puoi vedere, in primis sono state importate tutte le librerie necessarie. Poi è stato creato un dataset fittizio e partizionato in train e test set. Sono stati definiti tre classificatori a scopo di esempio:

  • Regressione Logistica;
  • Albero Decisionale;
  • SVM (qui tramite il parametro probability per farsi che il classificatore sia in grado di stabilire stime probabilistiche delle appartenenze alle classi, gli altri classificatori lo fanno di default).

Successivamente sono stati creati i modelli di voting hard e soft. Infine, i modelli hanno fatto la previsione sui dati del train set.

Se ti va di sostenere il blog, unisciti al canale Telegram dove puoi trovare un sacco di offerte sulla tecnologia interessanti, con sconti fino all'80%. Manchi solo tu: unisciti subito al canale per non perderti le prossime occasioni!
Categorie: informatica