SPB Git forge

spb/wp14_uqo

Public
2commits 1branches 1releases
909.0 KBsize
maindefault branch
57 min agolast push
Python 57% TeX 42.9%
2.1 KB · 48 lines python
Raw Blame History
1#!/usr/bin/env python32# -*- coding: utf-8 -*-3"""Ablation CV complète (4 couches x OLS/GBM) pour cohérence du tableau ablation.tex."""4import json, warnings5import numpy as np, pandas as pd6from sklearn.linear_model import LinearRegression7from sklearn.ensemble import HistGradientBoostingRegressor8from sklearn.model_selection import KFold, cross_val_predict9from sklearn.metrics import r2_score10warnings.filterwarnings("ignore")1112exec(open("v5_ml.py").read().split("kf=KFold")[0])13kf = KFold(n_splits=5, shuffle=True, random_state=42)14amen_ = list(AMEN.keys())1516L1 = ["sqft_final","has_sqft","lot_sqft","beds","baths","parking","storeys","age","age2"] + amen_17L2 = L1 + ["n_images_c","virtual_tour"] + rv18L3 = L2 + gv19L4 = L3 + vv20print("feats:", len(L1), len(L2), len(L3), len(L4))2122Xcat = pd.get_dummies(df[cats], prefix=cats, dtype=float)23dfi = df.copy()24for c in ["sqft_final","lot_sqft","beds","baths","storeys","age","age2"]:25    dfi[c] = dfi.groupby("ptype")[c].transform(lambda s: s.fillna(s.median()))26    dfi[c] = dfi[c].fillna(dfi[c].median())27dfi["parking"] = dfi["parking"].fillna(0)2829def stats(pred):30    e = np.abs(np.exp(pred - y) - 1)31    return {"r2": float(r2_score(y, pred)), "mdae": float(np.median(e) * 100),32            "w15": float(np.mean(e <= .15) * 100), "w25": float(np.mean(e <= .25) * 100)}33def cv_ols(numcols):34    X = pd.concat([dfi[numcols].reset_index(drop=True), Xcat.reset_index(drop=True)], axis=1)35    X = X.fillna(X.median())36    return stats(cross_val_predict(LinearRegression(), X, y, cv=kf, n_jobs=-1))37def cv_gbm(numcols):38    X = pd.concat([df[numcols].reset_index(drop=True), Xcat.reset_index(drop=True)], axis=1)39    m = HistGradientBoostingRegressor(max_iter=600, learning_rate=0.05, max_leaf_nodes=63, l2_regularization=1.0, random_state=42)40    return stats(cross_val_predict(m, X, y, cv=kf, n_jobs=-1))4142out = {}43for name, cols in [("L1", L1), ("L2", L2), ("L3", L3), ("L4", L4)]:44    out[name] = {"nfeat": len(cols), "ols": cv_ols(cols), "gbm": cv_gbm(cols)}45    print(name, out[name])46json.dump(out, open("results/ablation_extras.json", "w"), indent=1)47print("-> ablation_extras.json")48