Δέντρο Απόφασης (Παλινδρομητής)

2.3.2

Δέντρο Απόφασης (Παλινδρομητής)

Ενημέρωση 2025-11-05 Ανάγνωση 3 λεπτά
Σύνοψη
  • Τα δέντρα παλινδρόμησης προσεγγίζουν μη γραμμικές σχέσεις διαχωρίζοντας αναδρομικά τον χώρο χαρακτηριστικών μέχρι κάθε φύλλο να μπορεί να αναπαρασταθεί από μία μόνο σταθερά.
  • Οι διαχωρισμοί ελαχιστοποιούν το μέσο τετραγωνικό σφάλμα (MSE) των αριστερών και δεξιών παιδιών· η μείωση του MSE καθορίζει αν μια ερώτηση είναι χρήσιμη.
  • Υπερπαράμετροι όπως max_depth, min_samples_leaf και ccp_alpha εξισορροπούν την ακρίβεια με την ερμηνευσιμότητα και βοηθούν στην αποφυγή υπερπροσαρμογής.
  • Οπτικά διαγνωστικά εργαλεία–διαγράμματα διασποράς, χάρτες ισοϋψών και αποδοθέντα δέντρα–διευκολύνουν την εξήγηση ποιες περιοχές μοιράζονται την ίδια πρόβλεψη.

Εισαγωγή #

Αυτή η μέθοδος θα πρέπει να ερμηνεύεται μέσω των υποθέσεών της, των συνθηκών δεδομένων και του τρόπου με τον οποίο οι επιλογές παραμέτρων επηρεάζουν τη γενίκευση.

Αναλυτική Επεξήγηση #

1. Επισκόπηση #

Όπως οι ταξινομητές, τα δέντρα παλινδρόμησης θέτουν απλές ερωτήσεις σχετικά με τα χαρακτηριστικά εισόδου, αλλά ο στόχος είναι συνεχής. Κάθε φύλλο προβλέπει μια σταθερά (τον μέσο όρο των δειγμάτων εκπαίδευσης που κατέληξαν εκεί). Επειδή η συνάρτηση είναι τμηματικά σταθερή, η αύξηση του βάθους αποτυπώνει ολοένα και πιο λεπτομερή δομή, ενώ τα ρηχά δέντρα δίνουν έμφαση σε ομαλές τάσεις.

2. Κριτήριο διαχωρισμού (μείωση διασποράς) #

Για έναν κόμβο (t) που περιέχει (n_t) δείγματα και μέσο στόχο (\bar{y}_t), η ακαθαρσία είναι το MSE του κόμβου:

$$ \mathrm{MSE}(t) = \frac{1}{n_t} \sum_{i \in t} (y_i - \bar{y}_t)^2. $$

Ο διαχωρισμός στο (x_j) στο κατώφλι (s) δίνει παιδιά (t_L) και (t_R). Η ποιότητα του διαχωρισμού μετράται από

$$ \Delta = \mathrm{MSE}(t) - \frac{n_L}{n_t} \mathrm{MSE}(t_L) - \frac{n_R}{n_t} \mathrm{MSE}(t_R). $$

Επιλέγουμε τον διαχωρισμό με το μεγαλύτερο (\Delta)· όταν κανένας διαχωρισμός δεν δίνει θετικό κέρδος, ο κόμβος γίνεται φύλλο.

3. Παράδειγμα σε Python #

Το πρώτο απόσπασμα κώδικα εκπαιδεύει ένα ρηχό δέντρο σε θορυβώδη δείγματα από μια ημιτονοειδή καμπύλη, ώστε να δούμε την τμηματικά σταθερή φύση της πρόβλεψης. Ένα δεύτερο πείραμα εκπαιδεύει έναν παλινδρομητή δύο χαρακτηριστικών, αξιολογεί τα (R^2), RMSE και MAE, και οπτικοποιεί την εκμαθημένη επιφάνεια καθώς και το τελικό δέντρο.

import numpy as np
import matplotlib.pyplot as plt
from sklearn.tree import DecisionTreeRegressor, plot_tree
from sklearn.datasets import make_regression
from sklearn.metrics import r2_score, mean_squared_error, mean_absolute_error

rng = np.random.default_rng(42)
X1 = np.sort(5 * rng.random((120, 1)), axis=0)
y1_true = np.sin(X1).ravel()
y1 = y1_true + rng.normal(scale=0.2, size=X1.shape[0])

reg1 = DecisionTreeRegressor(max_depth=3, random_state=0).fit(X1, y1)
y1_pred = reg1.predict(X1)

plt.figure(figsize=(8, 4))
plt.scatter(X1, y1, s=15, c="gray", label="observations")
plt.plot(X1, y1_true, lw=2, label="true signal")
plt.step(X1.ravel(), y1_pred, where="mid", lw=2, label="tree prediction")
plt.xlabel("x")
plt.ylabel("y")
plt.title("Piecewise-constant fit by a regression tree")
plt.legend()
plt.grid(alpha=0.3)
plt.show()

Προσαρμογή δέντρου σε μονοδιάστατη ημιτονοειδή καμπύλη

X, y = make_regression(n_samples=400, n_features=2, noise=15.0, random_state=777)
reg = DecisionTreeRegressor(max_depth=4, random_state=0).fit(X, y)

r2 = r2_score(y, reg.predict(X))
rmse = mean_squared_error(y, reg.predict(X), squared=False)
mae = mean_absolute_error(y, reg.predict(X))
print(f"R2={r2:.3f}  RMSE={rmse:.2f}  MAE={mae:.2f}")

x_min, x_max = X[:, 0].min()-1, X[:, 0].max()+1
y_min, y_max = X[:, 1].min()-1, X[:, 1].max()+1
xx, yy = np.meshgrid(
    np.linspace(x_min, x_max, 150),
    np.linspace(y_min, y_max, 150),
)
zz = reg.predict(np.c_[xx.ravel(), yy.ravel()]).reshape(xx.shape)

plt.figure(figsize=(7, 6))
cs = plt.contourf(xx, yy, zz, levels=15, cmap="viridis", alpha=0.8)
plt.colorbar(cs, label="prediction")
plt.scatter(X[:, 0], X[:, 1], c=y, cmap="viridis", s=20, edgecolor="k", alpha=0.7)
plt.xlabel("x1")
plt.ylabel("x2")
plt.title("Prediction surface of the regression tree")
plt.show()

Επιφάνεια πρόβλεψης του δέντρου παλινδρόμησης

plt.figure(figsize=(12, 10))
plot_tree(
    reg,
    filled=True,
    feature_names=["x1", "x2"],
    rounded=True,
)
plt.title("Structure of the fitted regression tree")
plt.show()

Αποδοθείσα δομή δέντρου

4. Αναφορές #

  • Breiman, L., Friedman, J. H., Olshen, R. A., & Stone, C. J. (1984). Classification and Regression Trees. Wadsworth.
  • scikit-learn developers. (2024). Decision Trees. https://scikit-learn.org/stable/modules/tree.html