Elastic Net חדש
שילוב של Ridge ו-Lasso. הפרמטר alpha קובע את עוצמת העונש, ו-l1_ratio את החלוקה בין L1 ל-L2 (1 = Lasso טהור, 0 = Ridge טהור). שימושי כשיש קבוצות של פיצ'רים מתואמים: Lasso בוחר אחד מהם באקראי, ו-Elastic Net שומר אותם יחד.
בדוגמה על diamonds.csv (23 עמודות אחרי dummies), Lasso עם alpha=50 מאפס 9 מקדמים ומאבד מעט R². Ridge כמעט לא משנה את התוצאה. לכן Lasso הוא גם כלי לבחירת פיצ'רים.
import pandas as pd
from sklearn.linear_model import LinearRegression, Ridge, Lasso, ElasticNet
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
df = pd.read_csv("diamonds.csv")
X = pd.get_dummies(df.drop(columns="price"), drop_first=True).astype(float)
y = df["price"]
X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.3, random_state=42)
for name, reg in [("Linear", LinearRegression()), ("Ridge a=10", Ridge(alpha=10)),
("Lasso a=50", Lasso(alpha=50, max_iter=5000)),
("ElasticNet a=0.1 r=0.5", ElasticNet(alpha=0.1, l1_ratio=0.5, max_iter=5000))]:
m = make_pipeline(StandardScaler(), reg).fit(X_tr, y_tr)
coefs = m[-1].coef_
print(f"{name:<21} R2={m.score(X_te, y_te):.4f} zero coefs={int((abs(coefs) < 1e-8).sum())}/{len(coefs)}")Linear R2=0.9202 zero coefs=0/23 Ridge a=10 R2=0.9202 zero coefs=0/23 Lasso a=50 R2=0.8998 zero coefs=9/23 ElasticNet a=0.1 r=0.5 R2=0.8939 zero coefs=0/23
