Il progetto “Water Quality Prediction” (disponibile nella mia repository) ha l’obiettivo, sfruttando le tecniche di data mining, di analizzare grandi quantità di dati e sviluppare modelli predittivi per la classificazione della qualità dell’acqua.
Attraverso l’utilizzo di un dataset scaricato da Kaggle, il progetto ha analizzato oltre un milione di campionamenti, contenenti 24 attributi tra cui pH, concentrazioni di metalli (come ferro e zinco), torbidità, temperatura dell’acqua e altre variabili chimico-fisiche.
L’obiettivo principale è stato quello di classificare l’acqua come potabile o non potabile, evidenziando al contempo i fattori chiave che influenzano la qualità.
Vediamo insieme le varie fasi sulle quali è stato strutturato il progetto.
Preprocessing
Il preprocessing è stato un passaggio cruciale per garantire la qualità e la coerenza dei dati. Questa fase ha incluso:
Gestione dei valori mancanti
Il dataset iniziale conteneva numerosi valori NaN. Per ridurre il rischio di introdurre bias, si è scelto di rimuovere le righe con valori mancanti, mantenendo comunque una quantità significativa di osservazioni (686.413 righe finali).
Rimozione dei duplicati
Sono stati rilevati ed eliminati 14.784 duplicati. Sebbene costituissero solo l’1,4% del dataset, la loro eliminazione ha garantito una maggiore rappresentatività dei dati.
Trasformazione delle variabili
Gli attributi categorici, come il colore e la sorgente dell’acqua, sono stati convertiti in numerici tramite Label Encoding, mentre gli attributi numerici sono stati scalati con lo StandardScaler per uniformarne le distribuzioni.
Bilanciamento del dataset
Un dataset sbilanciato può portare a modelli che privilegiano una classe rispetto all’altra. Sono state utilizzate tecniche di oversampling e undersampling per bilanciare le due classi di acqua potabile e non potabile.
Rimozione degli outlier
Utilizzando l’algoritmo DBSCAN, sono stati identificati e rimossi 104.451 outlier, migliorando così la qualità del dataset.
Selezione delle variabili
Non tutti gli attributi erano rilevanti per la classificazione. Utilizzando una feature importance calcolata tramite Random Forest, sono stati eliminati attributi poco significativi come “month”, “day” e “time of day”, riducendo il dataset a 20 variabili utili.
Il dataset finale, composto da 76.060 osservazioni, è stato diviso in un train set (66,7%) e un test set (33,3%) per addestrare e valutare i modelli.
Modelli predittivi
Sono stati sviluppati e testati diversi modelli per classificare l’acqua come potabile o non potabile. I modelli utilizzati includono:
Classificatori di base
- Decision Tree: Ha mostrato buone performance, con un’accuratezza del 91% e un recall del 90%.
- K-Nearest Neighbors (KNN): Ha ottenuto risultati inferiori rispetto all’albero decisionale, pur restando competitivo.
- Support Vector Machines (SVM): Non è stato ottimizzato per via dei costi computazionali elevati.
- Naive Bayes e Regressione Logistica: Entrambi i modelli hanno fornito risultati accettabili ma non eccezionali.
Classificatori ensemble
- Random Forest: Ha ottenuto un’accuratezza del 95% e un recall elevato, rendendolo una scelta solida.
- AdaBoost: Con un’accuratezza del 96%, ha mostrato ottime prestazioni in tutte le metriche.
- XGBoost: È risultato il migliore, raggiungendo un’accuratezza del 98% e un recall di 0.9819, ideale per ridurre i falsi negativi.
- Voting Ensemble: Ha combinato più classificatori ma con prestazioni leggermente inferiori rispetto ad AdaBoost e XGBoost.
Reti neurali
Le reti neurali sono state implementate in due configurazioni principali:
- MLP (Multi-Layer Perceptron): Con un singolo strato nascosto, ha raggiunto un’accuratezza del 94%.
- ANN (Artificial Neural Network): Progettata con cinque strati (tre nascosti), ha ottenuto risultati comparabili al modello MLP, ma con tempi di addestramento più lunghi.
Risultati: sintesi delle performance
Modello | Accuratezza | Precisione | Recall | F1-Score |
---|---|---|---|---|
Albero Decisionale | 0.97637 | 0.98155 | 0.97139 | 0.97645 |
Albero Decisionale GSCV | 0.97386 | 0.97725 | 0.97076 | 0.97399 |
KNN | 0.88135 | 0.98938 | 0.77296 | 0.86788 |
KNN GSCV | 0.89562 | 0.97555 | 0.81334 | 0.88709 |
SVM | 0.95514 | 0.98476 | 0.92422 | 0.95353 |
Naive Bayes | 0.81586 | 0.98667 | 0.64343 | 0.77892 |
Naive Bayes GSCV | 0.81590 | 0.98679 | 0.64343 | 0.77895 |
Regressione Logistica | 0.86833 | 0.90211 | 0.82875 | 0.86387 |
Regressione Logistica GSCV | 0.86805 | 0.90108 | 0.82930 | 0.86370 |
SGD | 0.86681 | 0.89658 | 0.83175 | 0.86295 |
SGD GSCV | 0.86530 | 0.89850 | 0.82614 | 0.86080 |
Random Forest | 0.97869 | 0.98410 | 0.97345 | 0.97875 |
AdaBoost | 0.96805 | 0.98935 | 0.94682 | 0.96761 |
XGBoost | 0.98590 | 0.99004 | 0.98190 | 0.98595 |
Voting Hard | 0.90793 | 0.99117 | 0.82472 | 0.90031 |
Voting Soft | 0.94645 | 0.98792 | 0.90485 | 0.94456 |
MLP | 0.96084 | 0.97578 | 0.94579 | 0.96055 |
ANN | 0.94978 | 0.96676 | 0.93248 | 0.94931 |
Per ogni modello, è stata calcolata e analizzata la curva ROC (Receiver Operating Characteristic), una misura fondamentale per valutare la capacità del modello di distinguere correttamente tra le classi. I modelli con AUC (Area Under the Curve) più alto, come XGBoost e Random Forest, hanno dimostrato una maggiore efficacia nel separare le classi di acqua potabile e non potabile.
Conclusioni
Il progetto “Water Quality Prediction” ha evidenziato come le tecniche di data mining possano affrontare sfide pratiche, fornendo soluzioni basate sui dati per la gestione delle risorse idriche. La valutazione tramite curva ROC ha rafforzato ulteriormente la robustezza dei modelli. Guardando al futuro, l’integrazione di dati geografici e meteorologici potrebbe migliorare ulteriormente le previsioni, rendendo i modelli ancora più utili per applicazioni reali.