SN_ML_CLOUD / src /streamlit_app.py
ColinceTatsa's picture
Update src/streamlit_app.py
05cb691 verified
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
@st.cache_resource
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**.")