· ~5 λεπτά ανάγνωσης
Ποιότητα αέρα στη Μαδρίτη: clustering, ταξινόμηση και transfer learning
Ομαδικό project σε δεδομένα ποιότητας αέρα της Μαδρίτης: K-Means απέναντι σε DBSCAN, SVM απέναντι σε Naive Bayes, και ένα μικρό νευρωνικό δίκτυο που συμπεριφέρθηκε καλύτερα με transfer learning.
Στόχος
Αυτό ήταν το τελικό project του μαθήματος Ανάλυση Δεδομένων και Μηχανική Μάθηση στο μεταπτυχιακό μου, ομαδικό με δύο συμφοιτητές. Πήραμε το δημόσιο dataset «Air Quality Madrid» (ωριαίες μετρήσεις ρύπων από τους σταθμούς παρακολούθησης της πόλης) και κάναμε τρεις ερωτήσεις: υπάρχουν κρυφά προφίλ ρύπανσης, μπορεί ένα μοντέλο να προβλέψει την κατηγορία ποιότητας του αέρα, και μπορεί να προβλέψει την ακριβή τιμή του δείκτη;
Προετοιμασία των δεδομένων
- Επιλογή και κενά. Κρατήσαμε την ημερομηνία, τον σταθμό και επτά ρύπους: SO2, CO, NO2, NOx, O3, PM10 και PM2.5. Η σειρά κάθε σταθμού επεξεργάστηκε χωριστά, και τα μεμονωμένα κενά συμπληρώθηκαν με γραμμική παρεμβολή ώστε η χρονοσειρά να μένει συνεχής.
- Το πρόβλημα του PM2.5. Το PM2.5 είχε πολύ περισσότερες ελλείπουσες τιμές από τα υπόλοιπα, πάρα πολλές για παρεμβολή. Τις συμπληρώσαμε με γραμμική παλινδρόμηση πάνω στα SO2, CO και NOx, βασιζόμενοι στη συσχέτιση μεταξύ των ρύπων.
- Χαρακτηριστικά. Υπολογίσαμε τους επιμέρους δείκτες για NO2, O3, PM10 και PM2.5, τον CAQI (Common Air Quality Index) ως τον μεγαλύτερο επιμέρους δείκτη, και μια κατηγορία CAQI από 0 (πολύ χαμηλή) έως 4 (πολύ υψηλή) για την ταξινόμηση.
Τα διερευνητικά γραφήματα καθόρισαν την υπόλοιπη δουλειά. Ο πίνακας συσχέτισης έδειξε ισχυρή θετική συσχέτιση ανάμεσα στα οξείδια του αζώτου και το PM10. Τα ιστογράμματα είχαν έντονη δεξιά ασυμμετρία: οι περισσότερες ώρες είναι καθαρές, και μια μακριά ουρά δεν είναι. Τα box plots, σε λογαριθμική κλίμακα, έδειξαν πολλές ακραίες μέρες. Τις κρατήσαμε, γιατί είναι πραγματικά επεισόδια ρύπανσης και όχι σφάλματα αισθητήρων, και είναι ακριβώς αυτό που πρέπει να χειριστεί ένα χρήσιμο μοντέλο.
Clustering: απόσταση ή πυκνότητα;
Κάναμε clustering στα CO, NO2 και PM10, κανονικοποιημένα ώστε κανένας ρύπος να μην κυριαρχεί λόγω μονάδων, με ευκλείδεια απόσταση.
| Αλγόριθμος | Ρυθμίσεις που δοκιμάστηκαν | Καλύτερη | Silhouette |
|---|---|---|---|
| K-Means | k = 3, 4, 5 | k = 4 | περίπου 0,41 |
| DBSCAN | min_samples = 20, eps = 0,5, 0,6, 0,8 | eps = 0,6 | πάνω από 0,60 |
Το K-Means ήταν πιο γρήγορο και πιο εύκολο να εξηγηθεί, αλλά στριμώχνει τα δεδομένα σε στρογγυλά clusters παρόμοιου μεγέθους, και η ρύπανση δεν έρχεται σε μπάλες. Το DBSCAN βρήκε έναν πυκνό πυρήνα κανονικών συνθηκών και σημείωσε τις αραιές ώρες υψηλής ρύπανσης ως θόρυβο, που για αυτό το πρόβλημα είναι η χρήσιμη απάντηση: ξεχωρίζει τη συνηθισμένη ρύπανση από τα επεισόδια.
Ταξινόμηση: πρόβλεψη της κατηγορίας CAQI
| Μοντέλο | Ακρίβεια | Πού έκανε λάθη |
|---|---|---|
| SVM, πυρήνας RBF | 98% | Σχεδόν πουθενά· ο confusion matrix είναι σχεδόν διαγώνιος |
| Gaussian Naive Bayes | 74% | Στις μεσαίες κατηγορίες 1-3, π.χ. ένα πραγματικό «υψηλό» που προβλέφθηκε «μέτριο» ή «πολύ υψηλό» |
Το Naive Bayes υποθέτει ότι κάθε ρύπος είναι ανεξάρτητος από τους άλλους, και εδώ προφανώς δεν είναι: όταν ανεβαίνει το NO2, το PM10 τείνει να ανεβαίνει μαζί του. Το SVM μπορεί να μάθει αυτά τα κοινά μοτίβα.
Παλινδρόμηση: πρόβλεψη της τιμής CAQI
Φτιάξαμε ένα μικρό feed-forward δίκτυο σε PyTorch: είσοδος τα κανονικοποιημένα χαρακτηριστικά των ρύπων, δύο κρυφά επίπεδα με 64 και 32 μονάδες ReLU, μία έξοδος, εκπαίδευση με Adam πάνω στο μέσο τετραγωνικό σφάλμα. Μετά συγκρίναμε δύο τρόπους εκπαίδευσης. Τα δεδομένα εκπαίδευσης χωρίστηκαν σε ένα κομμάτι «πηγή» και ένα κομμάτι «στόχο»:
- Custom μοντέλο: εκπαιδεύτηκε από τυχαία βάρη μόνο στα δεδομένα στόχου.
- Μοντέλο transfer: προεκπαιδεύτηκε στα δεδομένα πηγής και μετά έγινε fine-tuning στα δεδομένα στόχου με χαμηλότερο learning rate (0,005), για να κρατήσει ό,τι είχε ήδη μάθει.
| Μοντέλο (test set, 20%) | R² | MAE |
|---|---|---|
| Custom | 0,88 | 21,29 |
| Transfer learning | 0,90 | 18,10 |
Οι βασικοί αριθμοί είναι κοντά, αλλά τα γραφήματα λένε την ιστορία. Το training loss του μοντέλου transfer ξεκινά χαμηλά, γιατί ήδη ξέρει το σχήμα του προβλήματος. Και στο γράφημα πραγματικών έναντι προβλεπόμενων τιμών, το custom μοντέλο χάνει τον έλεγχο στις υψηλές τιμές: για πραγματικές τιμές γύρω στο 400 πρόβλεψε έως 1.700, ενώ το μοντέλο transfer έμεινε κοντά στην ιδανική γραμμή.
Τι έμαθα
Τα συμπεράσματα που γράψαμε ήταν: τα ασύμμετρα δεδομένα με πραγματικές ακραίες τιμές είναι ο κανόνας στα περιβαλλοντικά δεδομένα· οι μέθοδοι βάσει πυκνότητας τους ταιριάζουν περισσότερο από αυτές βάσει απόστασης· τα μοντέλα που πιάνουν συσχετίσεις νικούν αυτά που υποθέτουν ανεξαρτησία· και η προεκπαίδευση έκανε το δίκτυο πολύ πιο σταθερό στις ακραίες τιμές.
Κοιτώντας το ξανά με πιο καχύποπτο μάτι, αυτοί είναι οι έλεγχοι που θα πρόσθετα πριν εμπιστευτώ τους αριθμούς:
- Το 98% μπορεί να μετρά μια φόρμουλα. Η κατηγορία CAQI υπολογίζεται απευθείας από τους επιμέρους δείκτες των ρύπων. Αν ο ταξινομητής βλέπει αυτές τις ίδιες μετρήσεις, ξαναμαθαίνει έναν ντετερμινιστικό κανόνα, δεν προβλέπει τίποτα. Το τίμιο τεστ είναι να προβλέψεις την κατηγορία μιας μελλοντικής ώρας από προηγούμενες μετρήσεις, ή να αφήσεις έξω τους ρύπους από τους οποίους υπολογίζεται η κατηγορία.
- Οι χρονοσειρές θέλουν διαχωρισμό βάσει χρόνου. Με ωριαία δεδομένα, οι γειτονικές ώρες είναι σχεδόν ίδιες. Αν το test set είναι ένα τυχαίο 20%, το μοντέλο έχει ουσιαστικά δει τους γείτονες στην εκπαίδευση. Το τίμιο τεστ είναι σε μια μεταγενέστερη περίοδο.
- Οι συμπληρωμένες τιμές διαρρέουν στον στόχο. Οι τιμές PM2.5 που συμπληρώσαμε προέρχονταν από παλινδρόμηση σε άλλους ρύπους και μετά τροφοδότησαν τον CAQI. Ένα μέρος από όσα έμαθαν τα μοντέλα είναι η δική μας συμπλήρωση.
- Το silhouette του DBSCAN εξαρτάται από το πώς μετράς τον θόρυβο. Αν τα σημεία θορύβου μείνουν έξω από το σκορ, τα clusters που απομένουν φαίνονται πιο καθαρά απ' ό,τι είναι πραγματικά τα δεδομένα.
Ομαδικό project μαθήματος για το MSc στην Κυβερνοασφάλεια & Επιστήμη Δεδομένων του Πανεπιστημίου Πειραιώς, σε δημόσιο dataset.
Θέλεις τα configs ή τον κώδικα από αυτό το lab, ή έχεις κάποια ερώτηση; Στείλε μου email στο kostaspapas1023@gmail.com