Update src/streamlit_app.py
Browse files- src/streamlit_app.py +31 -6
src/streamlit_app.py
CHANGED
|
@@ -617,17 +617,42 @@ with tabs[4]:
|
|
| 617 |
selector = SelectKBest(f_regression, k=min(40, X_scaled.shape[1]))
|
| 618 |
X_sel = pd.DataFrame(selector.fit_transform(X_scaled, y), columns=[X.columns[i] for i in selector.get_support(indices=True)])
|
| 619 |
|
|
|
|
| 620 |
kf = KFold(n_splits=5, shuffle=True, random_state=42)
|
| 621 |
-
oof_preds
|
| 622 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 623 |
model = entry["model_obj"]
|
| 624 |
preds = np.zeros(X_sel.shape[0])
|
| 625 |
for tr, va in kf.split(X_sel):
|
| 626 |
-
|
| 627 |
-
|
|
|
|
|
|
|
|
|
|
| 628 |
oof_preds[f"{fam}_oof"] = preds
|
| 629 |
-
|
| 630 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 631 |
|
| 632 |
meta = LinearRegression(positive=True)
|
| 633 |
meta.fit(oof_preds, y)
|
|
|
|
| 617 |
selector = SelectKBest(f_regression, k=min(40, X_scaled.shape[1]))
|
| 618 |
X_sel = pd.DataFrame(selector.fit_transform(X_scaled, y), columns=[X.columns[i] for i in selector.get_support(indices=True)])
|
| 619 |
|
| 620 |
+
# --- Safe stacking ensemble build ---
|
| 621 |
kf = KFold(n_splits=5, shuffle=True, random_state=42)
|
| 622 |
+
oof_preds = pd.DataFrame(index=X_sel.index)
|
| 623 |
+
base_models = []
|
| 624 |
+
|
| 625 |
+
# Explicitly filter valid models (no truthiness eval)
|
| 626 |
+
valid_results = []
|
| 627 |
+
for r in tuned_results:
|
| 628 |
+
m = r.get("model_obj", None)
|
| 629 |
+
if isinstance(m, object) and hasattr(m, "fit") and callable(getattr(m, "fit", None)):
|
| 630 |
+
valid_results.append((r["family"], r))
|
| 631 |
+
|
| 632 |
+
# Train each base model safely
|
| 633 |
+
for fam, entry in valid_results:
|
| 634 |
model = entry["model_obj"]
|
| 635 |
preds = np.zeros(X_sel.shape[0])
|
| 636 |
for tr, va in kf.split(X_sel):
|
| 637 |
+
try:
|
| 638 |
+
model.fit(X_sel.iloc[tr], y.iloc[tr])
|
| 639 |
+
preds[va] = model.predict(X_sel.iloc[va])
|
| 640 |
+
except Exception as e:
|
| 641 |
+
st.warning(f"⚠️ {fam} failed in fold: {e}")
|
| 642 |
oof_preds[f"{fam}_oof"] = preds
|
| 643 |
+
try:
|
| 644 |
+
model.fit(X_sel, y)
|
| 645 |
+
base_models.append({"family": fam, "model": model})
|
| 646 |
+
except Exception as e:
|
| 647 |
+
st.warning(f"⚠️ {fam} full-fit failed: {e}")
|
| 648 |
+
|
| 649 |
+
# Meta model on OOF predictions
|
| 650 |
+
meta = LinearRegression(positive=True)
|
| 651 |
+
meta.fit(oof_preds, y)
|
| 652 |
+
y_pred = meta.predict(oof_preds)
|
| 653 |
+
final_r2 = r2_score(y, y_pred)
|
| 654 |
+
st.success(f"Stacked Ensemble R² = {final_r2:.4f}")
|
| 655 |
+
|
| 656 |
|
| 657 |
meta = LinearRegression(positive=True)
|
| 658 |
meta.fit(oof_preds, y)
|