Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| import pandas as pd | |
| import joblib | |
| from PIL import Image | |
| import requests | |
| from pathlib import Path | |
| # --- CONFIGURATION DE LA PAGE --- | |
| st.set_page_config( | |
| page_title="Prédiction des Dépenses", | |
| page_icon="💳", | |
| layout="wide" | |
| ) | |
| script = Path(__file__) | |
| script_dir = script.parent | |
| # --- CHARGEMENT DES RESSOURCES --- | |
| # Utiliser le cache de Streamlit pour ne charger le modèle et les images qu'une seule fois | |
| def load_model(): | |
| """Charge le modèle de prédiction depuis le fichier joblib.""" | |
| try: | |
| model = joblib.load(script_dir/'xgboost_expenditure_predictor.joblib') | |
| return model | |
| except FileNotFoundError: | |
| return None | |
| # Charger le modèle et les images | |
| model = load_model() | |
| # --- BARRE LATÉRALE DE NAVIGATION --- | |
| logo_school_url = script_dir/"Keyce_Logo.jpg" | |
| st.sidebar.image(logo_school_url, width=200, caption="Etablissement") | |
| st.sidebar.header("Navigation") | |
| pages = ["Accueil", "Prédiction"] | |
| choice = st.sidebar.selectbox("Choisissez une page", pages) | |
| # --- PAGE D'ACCUEIL --- | |
| if choice == "Accueil": | |
| st.title("Projet de Machine Learning : Prédiction des Dépenses par Carte de Crédit") | |
| logo_theme_url = script_dir/"Credit-Card.png" # Un logo générique de carte de crédit | |
| if logo_theme_url: | |
| col1, col2 = st.columns(2) | |
| with col1: | |
| st.image(logo_theme_url, width=200, caption="Carte de credit") | |
| st.markdown("---") | |
| st.header("Présentation") | |
| st.markdown(""" | |
| Cette application web est le résultat d'un projet de fin de module visant à appliquer une procédure complète de Data Science. | |
| - **Objectif :** Prédire le montant des dépenses mensuelles d'un client détenteur d'une carte de crédit. | |
| - **Modèle utilisé :** `XGBoost Regressor`, un algorithme de type "gradient boosting" réputé pour sa performance. | |
| - **Démarche :** Le projet a suivi les étapes rigoureuses de la science des données, incluant le chargement, l'exploration, le nettoyage, le prétraitement, la modélisation et l'optimisation d'hyperparamètres. | |
| """) | |
| st.markdown("---") | |
| st.subheader("Informations") | |
| st.info(""" | |
| - **Étudiant :** TATSA TCHINDA Colince | |
| - **Établissement :** KEYCE INFORMATIQUE & IA | |
| - **Module :** Machine Learning dans le Cloud | |
| """) | |
| # --- PAGE DE PRÉDICTION --- | |
| elif choice == "Prédiction": | |
| st.header("Prédiction des Dépenses Mensuelles 💳") | |
| st.markdown("Veuillez renseigner les informations du client pour obtenir une estimation de ses dépenses.") | |
| if model is None: | |
| st.error("ERREUR : Le fichier du modèle `xgboost_expenditure_predictor.joblib` n'a pas été trouvé. Assurez-vous qu'il se trouve dans le même dossier que l'application.") | |
| else: | |
| # Création des volets pour les inputs | |
| col1, col2 = st.columns(2) | |
| with col1: | |
| st.subheader("Informations Personnelles") | |
| age = st.slider("Âge", 18, 85, 35) | |
| income = st.number_input("Revenu annuel (en dizaines de milliers de $)", min_value=0.5, max_value=20.0, value=4.5, step=0.1, format="%.2f") | |
| dependents = st.slider("Nombre de dépendants", 0, 10, 2) | |
| owner = st.radio("Propriétaire de son logement ?", ('Oui', 'Non'), horizontal=True) | |
| selfemp = st.radio("Travailleur indépendant (auto-entrepreneur) ?", ('Oui', 'Non'), horizontal=True) | |
| with col2: | |
| st.subheader("Informations Bancaires") | |
| reports = st.slider("Nombre de rapports de crédit négatifs", 0, 20, 0) | |
| months = st.number_input("Ancienneté à la banque (en mois)", min_value=0, max_value=600, value=54) | |
| majorcards = st.radio("Possède une carte de crédit majeure ?", ('Oui', 'Non'), horizontal=True) | |
| active = st.slider("Nombre d'autres cartes de crédit actives", 0, 50, 12) | |
| st.markdown("---") | |
| if st.button("Lancer la Prédiction", type="primary"): | |
| # --- Prétraitement des données d'entrée --- | |
| st.write("#### 1. Préparation des données pour le modèle...") | |
| # Mapper les réponses textuelles en valeurs attendues par le modèle | |
| owner_mapped = 'yes' if owner == 'Oui' else 'no' | |
| selfemp_mapped = 'yes' if selfemp == 'Oui' else 'no' | |
| majorcards_mapped = 1 if majorcards == 'Oui' else 0 | |
| input_data = pd.DataFrame({ | |
| # Colonnes fournies par l'utilisateur | |
| 'reports': [reports], | |
| 'age': [age], | |
| 'income': [income], | |
| 'owner': [owner_mapped], | |
| 'selfemp': [selfemp_mapped], | |
| 'dependents': [dependents], | |
| 'months': [months], | |
| 'majorcards': [majorcards_mapped], | |
| 'active': [active], | |
| # Colonnes manquantes ajoutées avec des valeurs factices | |
| 'card': ['yes'], | |
| 'share': [0.0] | |
| }) | |
| st.write("Données formatées (avec colonnes factices pour le modèle) :") | |
| st.dataframe(input_data) | |
| # --- Exécution de la prédiction --- | |
| st.write("#### 2. Exécution du modèle XGBoost...") | |
| prediction = model.predict(input_data) | |
| predicted_value = prediction[0] | |
| # Assurer que la dépense prédite ne soit pas négative | |
| if predicted_value < 0: | |
| predicted_value = 0 | |
| # --- Affichage du résultat --- | |
| st.write("#### 3. Résultat de la Prédiction") | |
| st.metric( | |
| label="Dépense Mensuelle Estimée", | |
| value=f"${predicted_value:,.2f} USD", | |
| help="Cette prédiction est basée sur le modèle XGBoost entraîné." | |
| ) | |
| if predicted_value > 750: | |
| st.success("Le profil de ce client suggère une **dépense élevée**. C'est un client à fort potentiel.") | |
| elif predicted_value > 200: | |
| st.info("Le profil de ce client suggère une **dépense moyenne**.") | |
| else: | |
| st.warning("Le profil de ce client suggère une **dépense faible**.") | |