Spaces:
Sleeping
Sleeping
| import pickle | |
| import numpy as np | |
| import pandas as pd | |
| from sqlalchemy import create_engine | |
| from src.config.config import DATABASE_URL | |
| MODEL_PATH = "models/model.pkl" | |
| DATA_PATH = "data/preprocessing/preprocessed_data.csv" | |
| TABLE_NAME = "predictions" | |
| def load_model(path: str): | |
| with open(path, "rb") as f: | |
| return pickle.load(f) | |
| def predict(model, df: pd.DataFrame) -> pd.DataFrame: | |
| sk_id = df["SK_ID_CURR"].astype(int) | |
| target = df["TARGET"] if "TARGET" in df.columns else None | |
| drop_cols = [c for c in ["SK_ID_CURR", "TARGET"] if c in df.columns] | |
| X = df.drop(columns=drop_cols) | |
| probas = model.predict_proba(X) | |
| classes = model.predict(X) | |
| result = pd.DataFrame({ | |
| "sk_id_curr": sk_id.values, | |
| "predicted_class": classes, | |
| "proba_class_0": probas[:, 0], | |
| "proba_class_1": probas[:, 1], | |
| }) | |
| if target is not None: | |
| result["true_class"] = target.values | |
| return result | |
| def predict_onnx(onnx_path: str, df: pd.DataFrame) -> pd.DataFrame: | |
| import onnxruntime as ort | |
| sk_id = df["SK_ID_CURR"].astype(int) | |
| target = df["TARGET"] if "TARGET" in df.columns else None | |
| drop_cols = [c for c in ["SK_ID_CURR", "TARGET"] if c in df.columns] | |
| X = df.drop(columns=drop_cols).values.astype(np.float32) | |
| sess = ort.InferenceSession(onnx_path) | |
| input_name = sess.get_inputs()[0].name | |
| outputs = sess.run(None, {input_name: X}) | |
| labels = outputs[0] | |
| prob_maps = outputs[1] | |
| proba_0 = np.array([m[0] for m in prob_maps]) | |
| proba_1 = np.array([m[1] for m in prob_maps]) | |
| result = pd.DataFrame({ | |
| "sk_id_curr": sk_id.values, | |
| "predicted_class": labels, | |
| "proba_class_0": proba_0, | |
| "proba_class_1": proba_1, | |
| }) | |
| if target is not None: | |
| result["true_class"] = target.values | |
| return result | |
| def save_to_database(df: pd.DataFrame, table: str = TABLE_NAME) -> None: | |
| engine = create_engine(DATABASE_URL) | |
| df.to_sql(table, engine, if_exists="replace", index=False) | |
| print(f"{len(df)} prédictions insérées dans la table '{table}'.") | |
| if __name__ == "__main__": # pragma: no cover | |
| import argparse | |
| parser = argparse.ArgumentParser(description="Calcul des prédictions de crédit") | |
| parser.add_argument( | |
| "--engine", | |
| choices=["catboost", "onnx"], | |
| default="catboost", | |
| help="Moteur d'inférence à utiliser (défaut : catboost)", | |
| ) | |
| args = parser.parse_args() | |
| print("Chargement des données préprocessées...") | |
| df = pd.read_csv(DATA_PATH) | |
| if args.engine == "onnx": | |
| ONNX_PATH = "models/model.onnx" | |
| print(f"Calcul des prédictions avec ONNX Runtime ({ONNX_PATH})...") | |
| predictions = predict_onnx(ONNX_PATH, df) | |
| else: | |
| print("Chargement du modèle CatBoost...") | |
| model = load_model(MODEL_PATH) | |
| print("Calcul des prédictions avec CatBoost...") | |
| predictions = predict(model, df) | |
| print(predictions.head()) | |
| print("Sauvegarde dans Supabase...") | |
| save_to_database(predictions) | |