gdleds commited on
Commit
e07612a
·
1 Parent(s): 3c29171

first commit

Browse files
Files changed (3) hide show
  1. Dockerfile +24 -0
  2. app.py +95 -0
  3. requirements.txt +8 -0
Dockerfile ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Image de base
2
+ FROM python:3.10-slim
3
+
4
+ # Définir le répertoire de travail
5
+ WORKDIR /app
6
+
7
+ # Installer les dépendances système utiles (optionnel mais pratique pour scikit-learn, xgboost etc.)
8
+ RUN apt-get update && apt-get install -y \
9
+ build-essential \
10
+ libpq-dev \
11
+ && rm -rf /var/lib/apt/lists/*
12
+
13
+ # Copier requirements.txt et installer
14
+ COPY requirements.txt .
15
+ RUN pip install --no-cache-dir -r requirements.txt
16
+
17
+ # Copier ton code
18
+ COPY . .
19
+
20
+
21
+ EXPOSE 7860
22
+
23
+ # Lancer FastAPI avec Uvicorn
24
+ CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860"]
app.py ADDED
@@ -0,0 +1,95 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from fastapi import FastAPI, HTTPException
2
+ from pydantic import BaseModel
3
+ from typing import Literal
4
+ import pandas as pd
5
+ import boto3
6
+ import joblib
7
+ import os
8
+ import io
9
+
10
+ # === Initialisation FastAPI ===
11
+ app = FastAPI(
12
+ title="Fraude Détection API",
13
+ description="""
14
+ ### 🎯 Description
15
+ Cette API permet de détecter automatiquement les transactions potentiellement frauduleuses en se basant sur un modèle de machine learning entraîné avec des données historiques de paiements.
16
+
17
+ Elle reçoit en entrée les caractéristiques complètes d’une transaction bancaire (hors identifiants techniques comme Unnamed: 0 et trans_num), puis renvoie une prédiction :
18
+
19
+ 1 → transaction frauduleuse
20
+
21
+ 0 → transaction légitime
22
+
23
+ Le modèle est chargé dynamiquement depuis le registre de modèles MLflow (ou S3), garantissant une traçabilité complète et une mise à jour continue.
24
+
25
+ 🧾 Champs d’entrée attendus (JSON)
26
+ Champ Type Description
27
+ cc_num float Numéro de carte anonymisé
28
+ merchant string Nom du commerçant ou de l’établissement
29
+ category string Catégorie du commerçant (ex : "gas_transport", "shopping_net", "travel")
30
+ amt float Montant de la transaction
31
+ first string Prénom du client
32
+ last string Nom du client
33
+ gender string Sexe du client ("M" ou "F")
34
+ street string Adresse postale du client
35
+ city string Ville du client
36
+ state string Code État ou Région (ex : "TX", "CA")
37
+ zip int Code postal
38
+ lat float Latitude du domicile
39
+ long float Longitude du domicile
40
+ city_pop int Population de la ville
41
+ job string Profession du client
42
+ dob string (YYYY-MM-DD) Date de naissance du client
43
+ merch_lat float Latitude du commerçant
44
+ merch_long float Longitude du commerçant
45
+ current_time string (YYYY-MM-DD HH:MM:SS) Horodatage de la transaction
46
+ """,
47
+ version="1.0"
48
+ )
49
+
50
+ # === Schéma attendu pour l'entrée ===
51
+
52
+ # === Configuration S3 ===
53
+ S3_BUCKET = os.getenv("S3_BUCKET")
54
+ MODEL_KEY = os.getenv("MODEL_KEY")
55
+ s3 = boto3.client("s3")
56
+
57
+ # === Chargement du modèle depuis S3 au démarrage ===
58
+ model = None
59
+
60
+ @app.on_event("startup")
61
+ def load_model():
62
+ global model
63
+ try:
64
+ print(f"Téléchargement du modèle depuis s3://{S3_BUCKET}/{MODEL_KEY}")
65
+ response = s3.get_object(Bucket=S3_BUCKET, Key=MODEL_KEY)
66
+ model_bytes = io.BytesIO(response["Body"].read())
67
+ model = joblib.load(model_bytes)
68
+ print("✅ Modèle chargé avec succès")
69
+ except Exception as e:
70
+ print(f"❌ Erreur chargement modèle : {e}")
71
+ raise RuntimeError(f"Impossible de charger le modèle : {e}")
72
+
73
+ # === Routes ===
74
+ @app.get("/")
75
+ def home():
76
+ return {"message": "Bienvenue sur l'API Fraude détéction - Utilisez /predict pour faire une prédiction"}
77
+
78
+ @app.post("/predict")
79
+ def predict(data: BaseModel):
80
+ try:
81
+ # Convertir les données en DataFrame avec colonnes correctes
82
+ df = pd.DataFrame([data.dict()])
83
+ print("📥 Données reçues :", df.to_dict())
84
+
85
+ # Faire la prédiction
86
+ prediction = model.predict(df)
87
+ is_fraud = int(prediction[0])
88
+
89
+ return {"is_fraud": is_fraud}
90
+
91
+ except Exception as e:
92
+ print(f"❌ Erreur prédiction : {e}")
93
+ raise HTTPException(status_code=500, detail=str(e))
94
+
95
+
requirements.txt ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ fastapi
2
+ uvicorn
3
+ boto3
4
+ joblib
5
+ scikit-learn
6
+ xgboost
7
+ pandas
8
+ python-dotenv