Spaces:
Sleeping
Sleeping
File size: 6,252 Bytes
c1d7c3a 8d14b42 05cb691 8d14b42 c1d7c3a 8d14b42 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
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**.")
|