Ξεκινάμε με την "δορυφορική" φωτογραφία ενός καμένου δάσους, το οποίο δημιούργησα σε python. Θέλουμε να εκπαιδεύσουμε τον αλγόριθμο να αναγνωρίζει το καμένο δάσος αυτόματα. Στο απλό αυτό παράδειγμα το καμένο δάσος είναι απλά μαύρα pixel.
Εδώ το domain set είναι το σύνολο των pixels της εικόνας και το label set είναι το δυαδικό σύνολο {0, 1} όπου: 0 = μη καμένο pixel 1 = καμένο pixel.
Στο παράδειγμά μας κάθε pixel της εικόνας πρέπει να ταξινομηθεί ως:
Ο αλγόριθμος προσπαθεί να μάθει μια μαθηματική σχέση που συνδέει τα χαρακτηριστικά (features) των pixels με την πιθανότητα να είναι καμένα. Στην logistic regression η εξαρτημένη μεταβλητή παίρνει δυαδική (binary) μορφή. Ο στόχος της μεθόδου είναι να προβλέψει αν η likelihood του Y=1 δεδομένων συγκεκριμένων τιμών των Χ.
Σε μια δορυφορική εικόνα κάθε pixel περιγράφεται από τις τιμές χρώματος του. Στο απλό αυτό παράδειγμα χρησιμοποιούμε τις τρεις βασικές συνιστώσες:
| Feature | Περιγραφή |
|---|---|
| R | Ένταση κόκκινου καναλιού |
| G | Ένταση πράσινου καναλιού |
| B | Ένταση μπλε καναλιού |
Έτσι κάθε pixel μπορεί να γραφτεί ως διάνυσμα χαρακτηριστικών:
Η Logistic Regression ξεκινά από έναν γραμμικό συνδυασμό των χαρακτηριστικών:
Οι παράμετροι β0, β1, β2 και β3 είναι άγνωστοι συντελεστές που μαθαίνει ο αλγόριθμος κατά την εκπαίδευση. Στην logistic regression οι ανεξάρτητες μεταβλητές έχουν συνεχή (continuous) μορφή.
Ο γραμμικός συνδυασμός z μπορεί να πάρει οποιαδήποτε πραγματική τιμή. Για να τον μετατρέψουμε σε πιθανότητα χρησιμοποιούμε την λογιστική συνάρτηση (logistic function):
Η συνάρτηση αυτή περιορίζει τις τιμές στο διάστημα:
Άρα το αποτέλεσμα ερμηνεύεται ως η πιθανότητα ένα pixel να είναι καμένο.
Για να μετατρέψουμε την πιθανότητα σε κατηγορία χρησιμοποιούμε ένα κατώφλι (decision threshold).
| Πιθανότητα | Ταξινόμηση |
|---|---|
| P ≥ 0.5 | Καμένο pixel |
| P < 0.5 | Μη καμένο pixel |
Για να υπολογιστούν οι παράμετροι του μοντέλου χρησιμοποιούμε ένα σύνολο εκπαίδευσης (training set). Στο παράδειγμά μας τα training samples είναι pixels που επιλέχθηκαν χειροκίνητα από την εικόνα και έχουν γνωστή κατηγορία (καμμένο ή μη καμμένο).
Ο αλγόριθμος προσαρμόζει τις παραμέτρους έτσι ώστε να μεγιστοποιείται η πιθανότητα να προβλέπονται σωστά τα training pixels. Η διαδικασία αυτή είναι γνωστή ως maximum likelihood estimation.
Από την εικόνα επιλέξαμε ένα μικρό σύνολο pixels τα οποία χρησιμοποιούνται για την εκπαίδευση του αλγορίθμου. Τα pixels αυτά αποτελούν το training set.
Για κάθε pixel καταγράφονται οι τιμές των τριών καναλιών χρώματος (RGB) καθώς και η κατηγορία στην οποία ανήκει.
| R | G | B | Burned |
|---|---|---|---|
| 0.05 | 0.05 | 0.05 | 1 |
| 0.05 | 0.05 | 0.05 | 1 |
| 0.10 | 0.60 | 0.10 | 0 |
| 0.10 | 0.60 | 0.10 | 0 |
| 0.05 | 0.05 | 0.05 | 1 |
| 0.10 | 0.60 | 0.10 | 0 |
| 0.05 | 0.05 | 0.05 | 1 |
| 0.10 | 0.60 | 0.10 | 0 |
Κάθε γραμμή του πίνακα αντιστοιχεί σε ένα pixel της εικόνας και αποτελεί ένα παράδειγμα εκπαίδευσης για τον αλγόριθμο. Στο επόμενο βήμα θα χρησιμοποιήσουμε αυτά τα δεδομένα για να υπολογίσουμε το μοντέλο Logistic Regression που θα μπορεί να ταξινομεί αυτόματα όλα τα pixels της εικόνας.
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
size = 200
# εικόνα RGB
image = np.zeros((size, size, 3))
# χρώματα
water = [0.2, 0.4, 0.9]
forest = [0.1, 0.6, 0.1]
mountain = [0.4, 0.3, 0.1]
burned = [0.05, 0.05, 0.05]
# δημιουργία βασικού χάρτη
for i in range(size):
for j in range(size):
if i > 150:
image[i,j] = water
elif i < 50:
image[i,j] = mountain
else:
image[i,j] = forest
# burned patches
np.random.seed(1)
for _ in range(10):
cx = np.random.randint(60,140)
cy = np.random.randint(20,180)
radius = np.random.randint(5,12)
for i in range(size):
for j in range(size):
if (i-cx)**2 + (j-cy)**2 < radius**2:
image[i,j] = burned
# =========================
# TRAINING SAMPLES
# =========================
burned_samples = []
nonburned_samples = []
for i in range(size):
for j in range(size):
if np.allclose(image[i,j], burned):
burned_samples.append((i,j))
elif np.allclose(image[i,j], forest):
nonburned_samples.append((i,j))
# επιλογή samples
n_samples = 50
burned_train = np.array(burned_samples)[
np.random.choice(len(burned_samples), n_samples, replace=False)
]
nonburned_train = np.array(nonburned_samples)[
np.random.choice(len(nonburned_samples), n_samples, replace=False)
]
# =========================
# DATASET
# =========================
data = []
for i,j in burned_train:
R,G,B = image[i,j]
data.append([R,G,B,1])
for i,j in nonburned_train:
R,G,B = image[i,j]
data.append([R,G,B,0])
df = pd.DataFrame(data, columns=["R","G","B","burned"])
df.to_csv("training_pixels.csv", index=False)
print("Training data saved!")
# =========================
# PLOT TRAINING PIXELS
# =========================
plt.figure(figsize=(6,6))
plt.imshow(image)
plt.scatter(burned_train[:,1], burned_train[:,0],
color="red", s=20)
plt.scatter(nonburned_train[:,1], nonburned_train[:,0],
color="red", s=20)
plt.title("Synthetic Satellite Image with Training Samples-GeoAtticus")
plt.axis("off")
plt.show()
# =========================
# LOGISTIC REGRESSION
# =========================
from sklearn.linear_model import LogisticRegression
# features και labels
X = df[["R","G","B"]].values
y = df["burned"].values
# μοντέλο
model = LogisticRegression()
# εκπαίδευση
model.fit(X, y)
print("Model trained!")
# =========================
# CLASSIFICATION ΟΛΗΣ ΤΗΣ ΕΙΚΟΝΑΣ
# =========================
# μετατροπή εικόνας σε πίνακα pixels
pixels = image.reshape(-1,3)
# πιθανότητα burned
probabilities = model.predict_proba(pixels)[:,1]
# reshape σε εικόνα
burn_prob_map = probabilities.reshape(size,size)
# =========================
# FINAL CLASSIFICATION
# =========================
classification = burn_prob_map > 0.5
plt.figure(figsize=(6,6))
plt.imshow(classification, cmap="gray")
plt.title("Predicted Burned Areas")
plt.axis("off")
plt.show()
Η παραπάνω εντολή εισάγει την κλάση LogisticRegression από την βιβλιοθήκη scikit-learn. Η κλάση αυτή υλοποιεί τον αλγόριθμο logistic regression και μας επιτρέπει να δημιουργήσουμε ένα μοντέλο ταξινόμησης.
Η μεταβλητή X περιέχει τα χαρακτηριστικά (features) που θα χρησιμοποιήσει ο αλγόριθμος για να κάνει τις προβλέψεις του.
Στο παράδειγμά μας τα χαρακτηριστικά είναι οι τρεις τιμές χρώματος κάθε pixel:
Η εντολή .values μετατρέπει τα δεδομένα του πίνακα pandas σε
αριθμητικό πίνακα (NumPy array), μορφή που χρησιμοποιείται από τους
αλγορίθμους μηχανικής μάθησης.
Η μεταβλητή y περιέχει τις κατηγορίες (labels) των training pixels.
Στο πρόβλημά μας:
Ο αλγόριθμος θα προσπαθήσει να μάθει τη σχέση μεταξύ των χαρακτηριστικών (R, G, B) και της κατηγορίας burned.
Εδώ δημιουργούμε ένα αντικείμενο της κλάσης LogisticRegression. Το αντικείμενο αυτό αντιπροσωπεύει το μαθηματικό μοντέλο που θα εκπαιδευτεί στα δεδομένα.
Η μέθοδος fit() είναι το βασικό βήμα εκπαίδευσης.
Κατά την εκπαίδευση ο αλγόριθμος υπολογίζει τις παραμέτρους της logistic regression ώστε να προσεγγίζει όσο το δυνατόν καλύτερα τα training samples.
Μαθηματικά το μοντέλο που εκπαιδεύεται έχει τη μορφή:
Οι παράμετροι β0, β1, β2 και β3 υπολογίζονται αυτόματα κατά την εκπαίδευση.
Η εικόνα είναι ένας τρισδιάστατος πίνακας:
Για να εφαρμοστεί το μοντέλο σε όλα τα pixels πρέπει να μετατρέψουμε την εικόνα σε έναν απλό πίνακα όπου κάθε γραμμή είναι ένα pixel.
Η συνάρτηση reshape(-1,3) δημιουργεί έναν πίνακα με μορφή:
| Pixel | R | G | B |
|---|---|---|---|
| 1 | 0.10 | 0.60 | 0.10 |
| 2 | 0.05 | 0.05 | 0.05 |
Η μέθοδος predict_proba() υπολογίζει την πιθανότητα κάθε pixel να ανήκει σε κάθε κατηγορία.
Το αποτέλεσμα είναι δύο πιθανότητες:
Η εντολή [:,1] κρατά μόνο την πιθανότητα της κατηγορίας
burned = 1.
Τέλος μετατρέπουμε το διάνυσμα πιθανοτήτων πίσω σε μορφή εικόνας, ώστε κάθε pixel να έχει μια τιμή πιθανότητας ότι είναι καμένο.
Για να μετατρέψουμε τις πιθανότητες σε κατηγορίες χρησιμοποιούμε ένα κατώφλι (decision threshold).
Ο πιο συνηθισμένος κανόνας είναι:
| Πιθανότητα | Ταξινόμηση |
|---|---|
| P ≥ 0.5 | Καμμένο pixel |
| P < 0.5 | Μη καμμένο pixel |
Δηλαδή αν η πιθανότητα καμένου pixel είναι μεγαλύτερη από 0.5, το pixel ταξινομείται ως καμένο.
Η παραπάνω εντολή δημιουργεί έναν νέο πίνακα όπου:
Ουσιαστικά εφαρμόζεται ο κανόνας απόφασης σε κάθε pixel της εικόνας.
Dutt, S., Chandramouli, S., & Das, A. K. (2018). Machine learning. Pearson.
Montgomery, D. C., Peck, E. A., & Vining, G. G. (2021). Introduction to linear regression analysis (6th ed.). Wiley.
Stanford Online. Stanford CS229: Machine Learning - Locally Weighted & Logistic Regression | Lecture 3 (Autumn 2018) [Video]. YouTube. https://youtu.be/het9HFqo1TQ?list=PLoROMvodv4rMiGQp3WXShtMGgzqpfVfbU
St-Aubin, A. (n.d.). An introduction to supervised machine learning. McGill University.