Rule Fit.el

Rule Fit.el

Ενημέρωση 2026-02-24 Ανάγνωση 3 λεπτά
Σύνοψη
  • Το RuleFit εξάγει κανόνες απόφασης από σύνολα δέντρων και τους συνδυάζει με τα αρχικά χαρακτηριστικά σε ένα αραιό γραμμικό μοντέλο.
  • Η κανονικοποίηση L1 επιλέγει ενημερωτικούς κανόνες και χαρακτηριστικά, βελτιώνοντας την ερμηνευσιμότητα χωρίς να θυσιάζει τη μη γραμμική δομή.
  • Το βάθος κανόνων, ο αριθμός παραγόμενων κανόνων και η ένταση κανονικοποίησης επηρεάζουν σημαντικά τη γενίκευση και την αραιότητα.

Εισαγωγή #

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

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

1. Ιδέα (με τύπους) #

  1. Εξαγωγή κανόνων: κάθε μονοπάτι προς ένα φύλλο γίνεται ένα δυαδικό χαρακτηριστικό (r_j(x) \in {0,1}).
  2. Προσθήκη κλιμακωμένων γραμμικών όρων (z_k(x)) για συνεχή χαρακτηριστικά.
  3. Γραμμική προσαρμογή με κανονικοποίηση L1:
$$ \hat{y}(x) = \beta_0 + \sum_j \beta_j r_j(x) + \sum_k \gamma_k z_k(x) $$

Η L1 προάγει αραιότητα, ώστε μόνο οι σημαντικοί κανόνες/όροι να παραμένουν.

2. Σύνολο δεδομένων (OpenML: house_sales) #

Τιμές κατοικιών στο King County (OpenML data_id=42092). Μόνο αριθμητικές στήλες για σαφήνεια.

import japanize_matplotlib
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.datasets import fetch_openml
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score

dataset = fetch_openml(data_id=42092, as_frame=True)
X = dataset.data.select_dtypes("number").copy()
y = dataset.target.astype(float)

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

3. Εκπαίδευση RuleFit #

Υλοποίηση σε Python: christophM/rulefit

from rulefit import RuleFit
import warnings
warnings.simplefilter("ignore")

rf = RuleFit(max_rules=200, tree_random_state=27)
rf.fit(X_train.values, y_train.values, feature_names=list(X_train.columns))

pred_tr = rf.predict(X_train.values)
pred_te = rf.predict(X_test.values)

def report(y_true, y_pred, name):
    rmse = mean_squared_error(y_true, y_pred, squared=False)
    mae  = mean_absolute_error(y_true, y_pred)
    r2   = r2_score(y_true, y_pred)
    print(f"{name:8s}  RMSE={rmse:,.0f}  MAE={mae:,.0f}  R2={r2:.3f}")

report(y_train, pred_tr, "Train")
report(y_test,  pred_te, "Test")

4. Επιθεώρηση κορυφαίων κανόνων #

rules = rf.get_rules()
rules = rules[rules.coef != 0].sort_values(by="importance", ascending=False)
rules.head(10)
  • rule: συνθήκη αν-τότε (type=linear υποδηλώνει γραμμικό όρο)
  • coef: συντελεστής παλινδρόμησης (μονάδες στόχου)
  • support: κλάσμα δειγμάτων που ικανοποιούν τον κανόνα
  • importance: κλιμακωμένο σκορ που συνδυάζει μέγεθος συντελεστή και υποστήριξη

5. Επικύρωση μέσω οπτικοποίησης #

plt.figure(figsize=(6, 5))
plt.scatter(X_train["sqft_above"], y_train, s=10, alpha=0.5)
plt.xlabel("sqft_above")
plt.ylabel("price")
plt.title("Relationship between sqft_above and price")
plt.grid(alpha=0.3)
plt.show()
rule_mask = X["sqft_living"].le(3935.0) & X["lat"].le(47.5315)

applicable_data = np.log(y[rule_mask])
not_applicable  = np.log(y[~rule_mask])

plt.figure(figsize=(8, 5))
plt.boxplot([applicable_data, not_applicable],
            labels=["Rule satisfied", "Rule not satisfied"])
plt.ylabel("log(price)")
plt.title("Price distribution by rule satisfaction")
plt.grid(alpha=0.3)
plt.show()

6. Πρακτικές συμβουλές #

  • Χειριστείτε τις ακραίες τιμές (Winsorization, αποκοπή) για σταθερούς κανόνες.
  • Καθαρίστε τα επίπεδα κατηγορικών μεταβλητών και κωδικοποιήστε μόνο μετά την ομαδοποίηση σπάνιων κατηγοριών.
  • Μετασχηματίστε ασύμμετρους στόχους (log(y) ή Box-Cox) αν χρειάζεται.
  • Επιλέξτε αριθμούς κανόνων/βάθη που οι ενδιαφερόμενοι μπορούν να διαβάσουν· χρησιμοποιήστε διασταυρούμενη επικύρωση για να επιλέξετε όρια.
  • Συνοψίστε τους κορυφαίους κανόνες σε απλή γλώσσα για επιχειρηματικές αναφορές.

7. Αναφορές #

  • Friedman, J. H., & Popescu, B. E. (2008). Predictive Learning via Rule Ensembles. The Annals of Applied Statistics, 2(3), 916–954.
  • Christoph Molnar. (2020). Interpretable Machine Learning. https://christophm.github.io/interpretable-ml-book/rulefit.html