Come Funziona l’Algoritmo K-Nearest Neighbors (KNN) in Python?
Oggi proverò a descrivere uno degli algoritmi di classificazione più intuitivi e affascinanti nella sua semplicità: il K-Nearest Neighbors , noto come KNN .
Il KNN si basa su un concetto semplice ma potente: “Dimmi con chi vai e ti dirò chi sei”. In termini pratici, classifica un nuovo dato basandosi sui k dati del set di training che gli sono più vicini, utilizzando la distanza euclidea come metrica.
I Vicini Più Prossimi
Immagina di avere un dataset che rappresenta vari animali in uno zoo, con informazioni come peso, altezza ed età. Quando un nuovo animale viene aggiunto, il KNN controlla quali sono i k animali più vicini in termini di distanza euclidea e utilizza queste informazioni per classificarlo. È un approccio semplice ma estremamente efficace.
Distanza Euclidea
La distanza euclidea rappresenta la “linea retta” tra due punti in uno spazio euclideo. Matematicamente, la distanza tra due punti P(x1, y1) e Q(x2, y2) si calcola come:
sqrt((x2 - x1)2 + (y2 - y1)2)
Questo metodo si estende facilmente a spazi multidimensionali, rendendolo adatto per dataset con molte caratteristiche.
Implementazione in Python
Vediamo come mettere in pratica il KNN utilizzando scikit-learn , una libreria Python che semplifica l’implementazione degli algoritmi di machine learning.
# Importiamo le librerie necessarie from sklearn.neighbors import KNeighborsClassifier import numpy as np # Creiamo un piccolo dataset di esempio X = np.array([[1, 2], [2, 3], [3, 4], [6, 7], [7, 8]]) y = np.array([0, 0, 0, 1, 1]) # Inizializziamo il classificatore KNN con k=3 knn = KNeighborsClassifier(n_neighbors=3) knn.fit(X, y) # Prediciamo la classe di un nuovo elemento nuova_entrata = np.array([[5, 5]]) predizione = knn.predict(nuova_entrata) print("Classe predetta:", predizione[0]) # Output: 0 o 1, a seconda dei vicini più prossimi
In poche righe di codice, abbiamo creato, addestrato e utilizzato un classificatore KNN. Questo esempio illustra la semplicità con cui è possibile implementare questo algoritmo.
Vantaggi e Limitazioni del KNN
Dopo aver esplorato il funzionamento del KNN, è importante esaminare i suoi vantaggi e le sue limitazioni.
Vantaggi del KNN
– Semplicità : Facile da implementare e da comprendere.
– Assenza di Assunzioni Preliminari : Essendo un algoritmo non parametrico, non fa assunzioni sulla distribuzione dei dati.
– Adattabilità Multiclasse : Può gestire facilmente problemi di classificazione con più classi.
– Versatilità : Può essere utilizzato sia per problemi di classificazione che di regressione.
Limitazioni del KNN
– Efficienza Computazionale : Può essere lento su grandi dataset poiché richiede il calcolo della distanza con tutti i punti del set.
– Sensibilità agli Outlier : Gli outlier possono influenzare negativamente le predizioni.
– Curse of Dimensionality : In spazi ad alta dimensionalità, la distanza euclidea può diventare meno significativa.
– Scelta del Valore di k : Trovare il valore ottimale di k richiede spesso sperimentazione e validazione.
In sintesi, il KNN è un algoritmo potente ma è fondamentale comprendere quando e come utilizzarlo al meglio.
Esempio Pratico: Classificazione di Specie di Fiori con il Dataset Iris
Per illustrare ulteriormente l’uso del KNN, consideriamo il famoso dataset Iris , che contiene 150 campioni di fiori suddivisi in tre specie: Setosa, Versicolor e Virginica. Ogni campione include quattro caratteristiche: lunghezza e larghezza del sepalo, lunghezza e larghezza del petalo.
Implementazione del KNN in Python
Ecco come implementare il KNN per classificare le specie di fiori:
import numpy as np from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier from sklearn.metrics import accuracy_score # Carichiamo il dataset Iris iris = load_iris() X = iris.data y = iris.target # Dividiamo il dataset in training set e test set X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42) # Creiamo il modello KNN con k=3 knn = KNeighborsClassifier(n_neighbors=3) # Addestriamo il modello knn.fit(X_train, y_train) # Facciamo le predizioni y_pred = knn.predict(X_test) # Calcoliamo la precisione accuracy = accuracy_score(y_test, y_pred) print(f"Precisione del modello: {accuracy * 100:.2f}%")
– Dataset : Utilizzo del dataset Iris con `load_iris()`.
– Preparazione dei Dati : Divisione dei dati in training set e test set con `train_test_split()`.
– Creazione del Modello : Inizializzazione del classificatore KNN con `n_neighbors=3`.
– Addestramento del Modello : Addestramento con `fit()`.
– Predizione e Valutazione : Predizione delle classi e calcolo dell’accuratezza con `accuracy_score()`.
Questo esempio dimostra come il KNN possa essere utilizzato per risolvere problemi reali di classificazione.
Sono amante della tecnologia e delle tante sfumature del mondo IT, ho partecipato, sin dai primi anni di università ad importanti progetti in ambito Internet proseguendo, negli anni, allo startup, sviluppo e direzione di diverse aziende; Nei primi anni di carriera ho lavorato come consulente nel mondo dell’IT italiano, partecipando attivamente a progetti nazionali ed internazionali per realtà quali Ericsson, Telecom, Tin.it, Accenture, Tiscali, CNR. Dal 2010 mi occupo di startup mediante una delle mie società techintouch S.r.l che grazie alla collaborazione con la Digital Magics SpA, di cui sono Partner la Campania, mi occupo di supportare ed accelerare aziende del territorio .
Attualmente ricopro le cariche di :
– CTO MareGroup
– CTO Innoida
– Co-CEO in Techintouch s.r.l.
– Board member in StepFund GP SA
Manager ed imprenditore dal 2000 sono stato,
CEO e founder di Eclettica S.r.l. , Società specializzata in sviluppo software e System Integration
Partner per la Campania di Digital Magics S.p.A.
CTO e co-founder di Nexsoft S.p.A, società specializzata nella Consulenza di Servizi in ambito Informatico e sviluppo di soluzioni di System Integration, CTO della ITsys S.r.l. Società specializzata nella gestione di sistemi IT per la quale ho partecipato attivamente alla fase di startup.
Sognatore da sempre, curioso di novità ed alla ricerca di “nuovi mondi da esplorare“.