avraux
commited on
Commit
•
0f6bede
1
Parent(s):
56b2ff1
import project
Browse files- README.md +84 -12
- __pycache__/app.cpython-313.pyc +0 -0
- __pycache__/inference.cpython-313.pyc +0 -0
- app.py +25 -0
- inference.py +70 -0
- model.joblib +3 -0
- requirements.txt +6 -0
README.md
CHANGED
@@ -1,12 +1,84 @@
|
|
1 |
-
|
2 |
-
|
3 |
-
|
4 |
-
|
5 |
-
|
6 |
-
|
7 |
-
|
8 |
-
|
9 |
-
|
10 |
-
|
11 |
-
|
12 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Mon Modèle Scikit-learn
|
2 |
+
Ce modèle a été entraîné avec scikit-learn pour prédire les émissions en CO2 d'une voiture.
|
3 |
+
|
4 |
+
L'entrainement du modèle a été fait avec Google Collab : https://colab.research.google.com/drive/1n1Vtx6873e06c0WYG9JKIJ_ZLTMkptcX#scrollTo=_eLI1udbyDT3
|
5 |
+
|
6 |
+
La documentation sur l'entraînement du modèle est la suivante : https://docs.google.com/spreadsheets/d/1oBshoNy2NJZQreOEbBfcWCCg2wo0PQDo/edit?gid=1220399676#gid=1220399676
|
7 |
+
|
8 |
+
# Input Data
|
9 |
+
Les données d'entrée du modèle sont les suivantes :
|
10 |
+
- puiss_admin_98
|
11 |
+
- conso_urb
|
12 |
+
- conso_exurb
|
13 |
+
- masse_ordma_max
|
14 |
+
- lib_mrq_BMW
|
15 |
+
- lib_mrq_MERCEDES
|
16 |
+
- lib_mrq_VOLKSWAGEN
|
17 |
+
- typ_boite_nb_rapp_A 5
|
18 |
+
- typ_boite_nb_rapp_A 6
|
19 |
+
- champ_v9_"715/2007*195/2013EURO5
|
20 |
+
- champ_v9_"715/2007*195/2013EURO6
|
21 |
+
- champ_v9_"715/2007*566/2011EURO5
|
22 |
+
- champ_v9_"715/2007*630/2012EURO5
|
23 |
+
- champ_v9_715/2007*195/2013EURO5
|
24 |
+
- Carrosserie_BREAK
|
25 |
+
- Carrosserie_COUPE
|
26 |
+
- Carrosserie_MINIBUS
|
27 |
+
- Carrosserie_TS TERRAINS/CHEMINS
|
28 |
+
- gamme_INFERIEURE
|
29 |
+
- gamme_LUXE
|
30 |
+
- gamme_MOY-INFERIEURE
|
31 |
+
- gamme_MOY-SUPER
|
32 |
+
- gamme_SUPERIEURE
|
33 |
+
|
34 |
+
Pour faciliter la réception d'information, on va demander des informations plus concises puis on va recréer l'ensemble de ses champs. On s'attends à un JSON de la forme :
|
35 |
+
|
36 |
+
{
|
37 |
+
"puiss_admin_98": 7,
|
38 |
+
"conso_urb": 5.6,
|
39 |
+
"conso_exurb": 4.3,
|
40 |
+
"masse_ordma_max": 1500,
|
41 |
+
"marque": "BMW",
|
42 |
+
"typ_boite": "A 5",
|
43 |
+
"champ_v9": "715/2007*195/2013EURO5",
|
44 |
+
"carrosserie": "COUPE",
|
45 |
+
"gamme": "LUXE"
|
46 |
+
}
|
47 |
+
|
48 |
+
puiss_admin_98 : Puissance administrative de la voiture (Entier)
|
49 |
+
conso_urb : Consommation d'essence en ville L/1OOkm (Entier à 1 décimale)
|
50 |
+
conso_exurb : Consommation d'essence en campagne L/1OOkm (Entier à 1 décimale)
|
51 |
+
masse_ordma_max : Masse du véhicule
|
52 |
+
marque : Marque du véhicule parmi
|
53 |
+
["BMW", "MERCEDES", "VOLKSWAGEN"]
|
54 |
+
typ_boite : Type de boite de vitesse parmi
|
55 |
+
["A 5", "A 6", "A 7", "A 8", "M 5", "M 6"]
|
56 |
+
champ_v9 : type de norme parmi
|
57 |
+
["715/2007*195/2013EURO5", "715/2007*630/2012EURO5", "715/2007*692/2008EURO5"]
|
58 |
+
carrosserie : type de carrosserie parmi
|
59 |
+
["BREAK", "COUPE", "MINIBUS", "TS TERRAINS/CHEMINS"]
|
60 |
+
gamme : gamme du véhicule parmi
|
61 |
+
["INFERIEURE", "LUXE", "MOY-INFERIEURE", "MOY-SUPER", "SUPERIEURE"]
|
62 |
+
|
63 |
+
## Exemple d'utilisation
|
64 |
+
```python
|
65 |
+
import joblib
|
66 |
+
import numpy as np
|
67 |
+
|
68 |
+
# Charger le modèle
|
69 |
+
model = joblib.load("model.joblib")
|
70 |
+
|
71 |
+
# Effectuer une prédiction
|
72 |
+
input_data = {
|
73 |
+
"puiss_admin_98": 7,
|
74 |
+
"conso_urb": 5.6,
|
75 |
+
"conso_exurb": 4.3,
|
76 |
+
"masse_ordma_max": 1500,
|
77 |
+
"marque": "BMW",
|
78 |
+
"typ_boite": "A 5",
|
79 |
+
"champ_v9": "715/2007*195/2013EURO5"
|
80 |
+
"carrosserie": "COUPE",
|
81 |
+
"gamme": "LUXE"
|
82 |
+
}
|
83 |
+
prediction = model.predict([input_data])
|
84 |
+
print(f"Prédiction : {prediction}")
|
__pycache__/app.cpython-313.pyc
ADDED
Binary file (1.17 kB). View file
|
|
__pycache__/inference.cpython-313.pyc
ADDED
Binary file (2.85 kB). View file
|
|
app.py
ADDED
@@ -0,0 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from fastapi import FastAPI
|
2 |
+
from pydantic import BaseModel
|
3 |
+
from inference import preprocess_and_predict
|
4 |
+
|
5 |
+
# Définir l'API
|
6 |
+
app = FastAPI()
|
7 |
+
|
8 |
+
# Définir un modèle d'entrée
|
9 |
+
class InputData(BaseModel):
|
10 |
+
puiss_admin_98: int
|
11 |
+
conso_urb: float
|
12 |
+
conso_exurb: float
|
13 |
+
masse_ordma_max: float
|
14 |
+
marque: str
|
15 |
+
typ_boite: str
|
16 |
+
champ_v9 : str
|
17 |
+
carrosserie: str
|
18 |
+
gamme: str
|
19 |
+
|
20 |
+
# Endpoint pour prédiction
|
21 |
+
@app.post("/predict")
|
22 |
+
def predict(data: InputData):
|
23 |
+
input_json = data.dict()
|
24 |
+
result = preprocess_and_predict(input_json)
|
25 |
+
return result
|
inference.py
ADDED
@@ -0,0 +1,70 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import pandas as pd
|
2 |
+
import joblib
|
3 |
+
|
4 |
+
# Charger le modèle scikit-learn
|
5 |
+
model = joblib.load("model.joblib")
|
6 |
+
|
7 |
+
def preprocess_and_predict(input_json):
|
8 |
+
"""
|
9 |
+
Fonction pour traiter les données JSON entrantes, calculer les champs dérivés,
|
10 |
+
et prédire à l'aide d'un modèle scikit-learn.
|
11 |
+
|
12 |
+
Args:
|
13 |
+
input_json (dict): Données simplifiées fournies par l'utilisateur. Exemple :
|
14 |
+
{
|
15 |
+
"puiss_admin_98": 7,
|
16 |
+
"conso_urb": 5.6,
|
17 |
+
"conso_exurb": 4.3,
|
18 |
+
"masse_ordma_max": 1500,
|
19 |
+
"marque": "BMW",
|
20 |
+
"typ_boite": "A 5",
|
21 |
+
"champ_v9": 715/2007*195/2013EURO5,
|
22 |
+
"carrosserie": "COUPE",
|
23 |
+
"gamme": "LUXE"
|
24 |
+
}
|
25 |
+
|
26 |
+
Returns:
|
27 |
+
dict: Prédiction du modèle.
|
28 |
+
"""
|
29 |
+
|
30 |
+
# Mapper les catégories aux colonnes du modèle
|
31 |
+
marque_mapping = ["BMW", "MERCEDES", "VOLKSWAGEN"]
|
32 |
+
typ_boite_mapping = ["A 5", "A 6", "A 7", "A 8", "M 5", "M 6"]
|
33 |
+
carrosserie_mapping = ["BREAK", "COUPE", "MINIBUS", "TS TERRAINS/CHEMINS"]
|
34 |
+
gamme_mapping = ["INFERIEURE", "LUXE", "MOY-INFERIEURE", "MOY-SUPER", "SUPERIEURE"]
|
35 |
+
champ_v9_mapping = ["\"715/2007*195/2013EURO5", "\"715/2007*195/2013EURO6", "\"715/2007*566/2011EURO5", "\"715/2007*630/2012EURO5", "715/2007*195/2013EURO5", "715/2007*630/2012EURO5", "715/2007*692/2008EURO5"]
|
36 |
+
|
37 |
+
# Initialiser un dictionnaire pour construire les colonnes nécessaires
|
38 |
+
processed_data = {
|
39 |
+
"puiss_admin_98": input_json.get("puiss_admin_98", 0),
|
40 |
+
"conso_urb": input_json.get("conso_urb", 0.0),
|
41 |
+
"conso_exurb": input_json.get("conso_exurb", 0.0),
|
42 |
+
"masse_ordma_max": input_json.get("masse_ordma_max", 0.0)
|
43 |
+
}
|
44 |
+
|
45 |
+
# Variables indicatrices pour la marque
|
46 |
+
for marque in marque_mapping:
|
47 |
+
processed_data[f"lib_mrq_{marque}"] = 1 if input_json.get("marque") == marque else 0
|
48 |
+
|
49 |
+
# Variables indicatrices pour le type de boîte
|
50 |
+
for typ_boite in typ_boite_mapping:
|
51 |
+
processed_data[f"typ_boite_nb_rapp_{typ_boite}"] = 1 if input_json.get("typ_boite") == typ_boite else 0
|
52 |
+
|
53 |
+
# Variables indicatrices pour la norme champ
|
54 |
+
for champ_v9 in champ_v9_mapping:
|
55 |
+
processed_data[f"champ_v9_{champ_v9}"] = 1 if input_json.get("champ_v9") == champ_v9 else 0
|
56 |
+
|
57 |
+
# Variables indicatrices pour la carrosserie
|
58 |
+
for carrosserie in carrosserie_mapping:
|
59 |
+
processed_data[f"Carrosserie_{carrosserie}"] = 1 if input_json.get("carrosserie") == carrosserie else 0
|
60 |
+
|
61 |
+
# Variables indicatrices pour la gamme
|
62 |
+
for gamme in gamme_mapping:
|
63 |
+
processed_data[f"gamme_{gamme}"] = 1 if input_json.get("gamme") == gamme else 0
|
64 |
+
|
65 |
+
# Convertir en DataFrame pour correspondre au format attendu par le modèle
|
66 |
+
input_dataframe = pd.DataFrame([processed_data])
|
67 |
+
|
68 |
+
# Faire une prédiction
|
69 |
+
prediction = model.predict(input_dataframe)
|
70 |
+
return {"prediction": prediction.tolist()}
|
model.joblib
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:67758c44ac783c45468857aec2cc3fb1b58309d2aa0b2a5cf211f91053c4d73d
|
3 |
+
size 236318305
|
requirements.txt
ADDED
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
fastapi
|
2 |
+
uvicorn
|
3 |
+
pandas
|
4 |
+
numpy
|
5 |
+
scikit-learn
|
6 |
+
joblib
|