Aller au contenu principal

EIA - Exigences detaillees

Exigences Document de reference Avance

Apercu des exigences

Votre EIA est evaluee selon six composantes. Chaque composante a des exigences specifiques qui doivent etre satisfaites. Cette page fournit la grille d'evaluation detaillee et les listes de verification pour chacune.


A. Entrainement du modele (20 %)

Objectifs

Demontrer votre capacite a selectionner, entrainer, evaluer et serialiser des modeles d'apprentissage automatique en utilisant une methodologie structuree.

Exigences

  • Selection du jeu de donnees : Choisir un jeu de donnees approprie (au moins 500 echantillons, ≥ 5 caracteristiques)
  • Analyse exploratoire des donnees : Realiser une EDA approfondie avec des visualisations (distributions, correlations, valeurs manquantes)
  • Pretraitement des donnees : Gerer les valeurs manquantes, encoder les variables categorielles, normaliser/standardiser les caracteristiques
  • Entrainer au moins 2 modeles : Algorithmes differents (ex. : Regression logistique vs Random Forest)
  • evaluer avec au moins 3 metriques : Choisir des metriques appropriees pour votre type de probleme
  • Ajustement des hyperparametres : Tenter au moins un ajustement de base (GridSearch ou RandomizedSearch)
  • Serialiser le meilleur modele : Sauvegarder avec joblib, pickle ou ONNX
  • Documenter votre methodologie : Justifier chaque decision dans votre notebook et votre rapport

Metriques recommandees par type de probleme

Type de problemeMetrique 1Metrique 2Metrique 3Metrique 4 (bonus)
Classification binaireAccuracyPrecision / RecallF1-ScoreAUC-ROC
Classification multiclasseAccuracyMacro F1-ScoreMatrice de confusionRapport de classification
RegressionMAERMSER² ScoreMAPE

Structure de code attendue

# notebooks/02_model_training.ipynb

# 1. Load and explore data
import pandas as pd
from sklearn.model_selection import train_test_split

df = pd.read_csv("data/dataset.csv")
X = df.drop(columns=["target"])
y = df["target"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 2. Train Model A
from sklearn.linear_model import LogisticRegression
model_a = LogisticRegression(max_iter=1000)
model_a.fit(X_train, y_train)

# 3. Train Model B
from sklearn.ensemble import RandomForestClassifier
model_b = RandomForestClassifier(n_estimators=100, random_state=42)
model_b.fit(X_train, y_train)

# 4. Evaluate both models
from sklearn.metrics import accuracy_score, f1_score, roc_auc_score

results = {
"Model": ["Logistic Regression", "Random Forest"],
"Accuracy": [accuracy_score(y_test, model_a.predict(X_test)),
accuracy_score(y_test, model_b.predict(X_test))],
"F1-Score": [f1_score(y_test, model_a.predict(X_test)),
f1_score(y_test, model_b.predict(X_test))],
"AUC-ROC": [roc_auc_score(y_test, model_a.predict_proba(X_test)[:, 1]),
roc_auc_score(y_test, model_b.predict_proba(X_test)[:, 1])]
}
pd.DataFrame(results)

# 5. Serialize best model
import joblib
joblib.dump(model_b, "models/best_model.pkl")

Grille d'evaluation — Entrainement du modele

CritereExcellent (18-20)Bon (16-17)Satisfaisant (14-15)Insuffisant (< 14)
Jeu de donneesBien choisi, pertinent, correctement justifieJeu de donnees approprieLe jeu de donnees convient mais est mal justifieJeu de donnees inapproprie ou trop petit
EDAAnalyse approfondie avec ≥ 5 visualisations, observations documenteesBonne EDA avec 3-4 visualisationsEDA de base, peu de visualisationsPas d'EDA ou exploration minimale
PretraitementToutes les etapes justifiees, pipeline documenteLa plupart des etapes presentesPretraitement de base uniquementetapes de pretraitement critiques manquantes
Modeles≥ 3 modeles compares, ajustement des hyperparametres effectue2 modeles compares avec ajustement de base2 modeles entraines, pas d'ajustement1 seul modele, pas de comparaison
Metriques≥ 4 metriques, interpretation correcte, tableau comparatif3 metriques avec interpretation3 metriques rapportees, interpretation minimale< 3 metriques ou metriques incorrectes
SerialisationModele sauvegarde avec metadonnees (version, metriques, caracteristiques)Modele sauvegarde correctementModele sauvegarde mais sans metadonneesModele non serialise
MethodologieNarration claire, chaque decision justifieeLa plupart des decisions expliqueesQuelques explications fourniesAucune documentation de la methodologie

B. Service API (25 %)

Objectifs

Construire une API REST prete pour la production qui sert des predictions a partir de votre modele entraine, avec une validation des entrees, une gestion des erreurs et une documentation auto-generee appropriees.

Exigences

  • Framework : Utiliser FastAPI (recommande) ou Flask
  • Endpoint /predict (POST) : Accepter les caracteristiques en entree, retourner la prediction et la confiance
  • Endpoint /health (GET) : Retourner l'etat de sante du service
  • Endpoint /model-info (GET) : Retourner les metadonnees du modele (nom, version, caracteristiques, metriques)
  • Validation des entrees : Utiliser des modeles Pydantic (FastAPI) ou une validation manuelle (Flask)
  • Gestion des erreurs : Retourner les codes de statut HTTP appropries (400, 404, 422, 500) avec des messages descriptifs
  • Documentation Swagger : Auto-generee et accessible a /docs
  • Code propre : Fonctions documentees, nommage coherent, pas de valeurs en dur

Specifications des endpoints API

EndpointMethodeEntreeSortieCodes de statut
/predictPOSTJSON avec les valeurs des caracteristiques[ prediction, confidence, model_version ]200, 400, 422, 500
/healthGETAucune[ status: "healthy", timestamp ]200
/model-infoGETAucune[ model_name, version, features, metrics ]200
/predict/batchPOSTTableau d'entreesTableau de predictions200, 400, 422
Endpoint bonus

Implementer un endpoint /predict/batch pour les predictions par lot rapporte des points bonus. Cela demontre une comprehension des modeles d'API du monde reel.

Code attendu — FastAPI

# src/app.py
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel, Field
from datetime import datetime
import joblib
import numpy as np

app = FastAPI(
title="My ML Prediction API",
description="LIA Project — AI Model Deployment",
version="1.0.0"
)

model = joblib.load("models/best_model.pkl")

class PredictionInput(BaseModel):
feature_1: float = Field(..., description="Description of feature 1")
feature_2: float = Field(..., description="Description of feature 2")
feature_3: float = Field(..., ge=0, description="Must be non-negative")

class Config:
json_schema_extra = {
"example": {
"feature_1": 5.1,
"feature_2": 3.5,
"feature_3": 1.4
}
}

class PredictionOutput(BaseModel):
prediction: int
confidence: float
model_version: str

@app.get("/health")
def health_check():
return {
"status": "healthy",
"timestamp": datetime.now().isoformat(),
"model_loaded": model is not None
}

@app.get("/model-info")
def model_info():
return {
"model_name": "RandomForestClassifier",
"version": "1.0.0",
"features": ["feature_1", "feature_2", "feature_3"],
"training_metrics": {
"accuracy": 0.95,
"f1_score": 0.93,
"auc_roc": 0.97
}
}

@app.post("/predict", response_model=PredictionOutput)
def predict(data: PredictionInput):
try:
features = np.array([[data.feature_1, data.feature_2, data.feature_3]])
prediction = model.predict(features)[0]
confidence = float(model.predict_proba(features).max())
return PredictionOutput(
prediction=int(prediction),
confidence=round(confidence, 4),
model_version="1.0.0"
)
except Exception as e:
raise HTTPException(status_code=500, detail=f"Prediction failed: {str(e)}")

Code attendu — Alternative Flask

# src/app.py
from flask import Flask, request, jsonify
from datetime import datetime
import joblib
import numpy as np

app = Flask(__name__)
model = joblib.load("models/best_model.pkl")

@app.route("/health", methods=["GET"])
def health_check():
return jsonify({
"status": "healthy",
"timestamp": datetime.now().isoformat(),
"model_loaded": model is not None
})

@app.route("/predict", methods=["POST"])
def predict():
data = request.get_json()
if not data:
return jsonify({"error": "No input data provided"}), 400

required_fields = ["feature_1", "feature_2", "feature_3"]
for field in required_fields:
if field not in data:
return jsonify({"error": f"Missing field: {field}"}), 400

try:
features = np.array([[data["feature_1"], data["feature_2"], data["feature_3"]]])
prediction = model.predict(features)[0]
confidence = float(model.predict_proba(features).max())
return jsonify({
"prediction": int(prediction),
"confidence": round(confidence, 4),
"model_version": "1.0.0"
})
except Exception as e:
return jsonify({"error": f"Prediction failed: {str(e)}"}), 500

Grille d'evaluation — Service API

CritereExcellent (22-25)Bon (20-21)Satisfaisant (18-19)Insuffisant (< 18)
EndpointsLes 3 requis + endpoints bonusLes 3 endpoints requis fonctionnent2 des 3 endpoints fonctionnent< 2 endpoints fonctionnels
ValidationModeles Pydantic avec contraintes, verification de types, exemplesValidation Pydantic de baseValidation minimalePas de validation des entrees
Gestion des erreursTous les codes d'erreur corrects, messages descriptifs, cas limites geresLa plupart des erreurs gerees correctementGestion des erreurs de basePas de gestion des erreurs
DocumentationSwagger complet avec exemples, descriptions pour tous les champsSwagger accessible et utileSwagger auto-genere, personnalisation minimalePas de documentation API
Qualite du codeArchitecture propre, separation des responsabilites, docstringsCode bien organiseLe code fonctionne mais est desordonneCode spaghetti, valeurs en dur
Format de reponseStructure JSON coherente, codes de statut appropries, horodatagesReponses coherentesFormats de reponse incoherentsReponses cassees ou manquantes

C. Tests (15 %)

Objectifs

Demontrer votre capacite a ecrire des tests automatises qui valident votre modele et votre API, et a utiliser Postman pour les tests d'API.

Exigences

  • Minimum 10 tests en utilisant pytest
  • Tests unitaires : Tester le chargement du modele, la logique de prediction, la validation des entrees
  • Tests d'integration : Tester les endpoints de l'API de bout en bout
  • Tests de cas limites : Tester avec des entrees invalides, des donnees vides, des valeurs extremes
  • Couverture de code > 70 % : Mesuree avec pytest-cov
  • Collection Postman : Export .json avec des tests pour tous les endpoints
  • Documentation des tests : Expliquer ce que chaque test valide

Categories de tests

Code de test attendu

# tests/test_api.py
import pytest
from fastapi.testclient import TestClient
from src.app import app

client = TestClient(app)

# --- Health Check Tests ---

def test_health_returns_200():
response = client.get("/health")
assert response.status_code == 200
assert response.json()["status"] == "healthy"

def test_health_has_timestamp():
response = client.get("/health")
assert "timestamp" in response.json()

# --- Model Info Tests ---

def test_model_info_returns_200():
response = client.get("/model-info")
assert response.status_code == 200

def test_model_info_contains_version():
response = client.get("/model-info")
data = response.json()
assert "version" in data
assert "model_name" in data
assert "features" in data

# --- Prediction Tests ---

def test_predict_valid_input():
payload = {"feature_1": 5.1, "feature_2": 3.5, "feature_3": 1.4}
response = client.post("/predict", json=payload)
assert response.status_code == 200
data = response.json()
assert "prediction" in data
assert "confidence" in data

def test_predict_confidence_range():
payload = {"feature_1": 5.1, "feature_2": 3.5, "feature_3": 1.4}
response = client.post("/predict", json=payload)
confidence = response.json()["confidence"]
assert 0.0 <= confidence <= 1.0

def test_predict_missing_field_returns_422():
payload = {"feature_1": 5.1} # Missing features
response = client.post("/predict", json=payload)
assert response.status_code == 422

def test_predict_wrong_type_returns_422():
payload = {"feature_1": "not_a_number", "feature_2": 3.5, "feature_3": 1.4}
response = client.post("/predict", json=payload)
assert response.status_code == 422

def test_predict_empty_body_returns_422():
response = client.post("/predict", json={})
assert response.status_code == 422

# --- Edge Case Tests ---

def test_predict_extreme_values():
payload = {"feature_1": 99999.0, "feature_2": -99999.0, "feature_3": 0.0}
response = client.post("/predict", json=payload)
assert response.status_code in [200, 400]

Execution des tests avec couverture

# Run all tests
pytest tests/ -v

# Run with coverage report
pytest tests/ --cov=src --cov-report=term-missing

# Generate HTML coverage report
pytest tests/ --cov=src --cov-report=html

Exigences de la collection Postman

Votre collection Postman doit inclure :

RequeteMethodeTests
Verification de santeGET /healthLe statut est 200, le corps contient « healthy »
Info du modeleGET /model-infoLe statut est 200, le corps contient le nom du modele
Prediction validePOST /predictLe statut est 200, la reponse contient prediction et confidence
Champs manquantsPOST /predictLe statut est 422, message d'erreur present
Mauvais typesPOST /predictLe statut est 422, erreur de validation
Corps videPOST /predictLe statut est 422
Scripts de test Postman

Chaque requete Postman devrait inclure des scripts de test. Exemple :

pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});

pm.test("Response has prediction", function () {
var jsonData = pm.response.json();
pm.expect(jsonData).to.have.property("prediction");
pm.expect(jsonData).to.have.property("confidence");
});

Grille d'evaluation — Tests

CritereExcellent (14-15)Bon (12-13)Satisfaisant (11)Insuffisant (< 11)
Nombre de tests≥ 15 tests, couverture complete10-14 tests, bonne variete10 tests, couverture de base< 10 tests
Tests unitairesModele + validation + fonctions utilitaires testesModele et validation testesTest de base du modele uniquementPas de tests unitaires
Tests d'integrationTous les endpoints testes avec plusieurs scenariosTous les endpoints testes une foisLa plupart des endpoints testesPeu de tests d'endpoints
Cas limitesEntrees invalides, valeurs extremes, donnees vides, mauvais typesQuelques cas limites couverts1-2 cas limitesPas de cas limites
Couverture> 80 %> 70 %> 60 %< 60 %
PostmanCollection complete avec scripts de test pour toutes les requetesCollection avec tests de baseLa collection existe, peu de testsPas de collection Postman

D. Explicabilite (15 %)

Objectifs

Appliquer des techniques d'interpretabilite des modeles pour expliquer les predictions de votre modele et renforcer la confiance dans votre systeme IA.

Exigences

  • Appliquer LIME et/ou SHAP a votre modele entraine
  • Generer au moins 3 visualisations : Importance des caracteristiques, explications individuelles, graphiques de synthese
  • Interpreter les resultats : Expliquer en langage simple ce que le modele apprend
  • Identifier les biais potentiels : Verifier si certaines caracteristiques ont une influence inattendue
  • Documenter les resultats : Inclure l'analyse dans votre rapport et notebook

Exigences de visualisation

#VisualisationOutilDescription
1Importance globale des caracteristiquesSHAP summary_plot ou bar_plotQuelles caracteristiques comptent le plus globalement ?
2Explication d'une prediction individuelleLIME explain_instancePourquoi le modele a-t-il fait cette prediction specifique ?
3Interaction entre caracteristiquesSHAP dependence_plotComment les caracteristiques interagissent-elles ?
4Frontiere de decision (si applicable)LIME ou personnaliseComment le modele separe-t-il les classes ?
5Graphique en cascade (bonus)SHAP waterfall_plotContribution etape par etape de chaque caracteristique

Code attendu — SHAP

# notebooks/03_explainability.ipynb
import shap
import matplotlib.pyplot as plt

explainer = shap.TreeExplainer(model) # For tree-based models
shap_values = explainer.shap_values(X_test)

# 1. Global feature importance (summary plot)
shap.summary_plot(shap_values, X_test, show=False)
plt.title("SHAP Feature Importance — Global View")
plt.tight_layout()
plt.savefig("docs/shap_summary.png", dpi=150)
plt.show()

# 2. Single prediction explanation (waterfall)
shap.plots.waterfall(shap.Explanation(
values=shap_values[0],
base_values=explainer.expected_value,
data=X_test.iloc[0],
feature_names=X_test.columns.tolist()
))

# 3. Feature dependence plot
shap.dependence_plot("feature_1", shap_values, X_test)

Code attendu — LIME

# notebooks/03_explainability.ipynb
from lime.lime_tabular import LimeTabularExplainer

explainer = LimeTabularExplainer(
training_data=X_train.values,
feature_names=X_train.columns.tolist(),
class_names=["Class 0", "Class 1"],
mode="classification"
)

# Explain a single prediction
instance = X_test.iloc[0].values
explanation = explainer.explain_instance(
instance,
model.predict_proba,
num_features=10
)

# Show explanation
explanation.show_in_notebook()

# Save as HTML
explanation.save_to_file("docs/lime_explanation.html")

Guide d'interpretation

Lorsque vous interpretez vos resultats, repondez a ces questions :

QuestionCe qu'il faut rechercher
Quelles caracteristiques sont les plus importantes ?Caracteristiques principales dans le resume SHAP ou LIME global
Les caracteristiques importantes sont-elles logiques ?Ont-elles un sens metier ?
Y a-t-il des surprises ?Une importance inattendue peut indiquer une fuite de donnees
Le modele est-il biaise ?S'appuie-t-il fortement sur des attributs sensibles ?
Quelle est la confiance du modele ?Les predictions sont-elles de haute confiance ou incertaines ?
Fuite de donnees

Si une caracteristique a une importance disproportionnee (par ex., une seule caracteristique a une valeur SHAP 10x superieure a toutes les autres), cela peut indiquer une fuite de donnees — une variable qui ne serait pas disponible au moment de la prediction. Enquetez avant de finaliser votre modele.

Grille d'evaluation — Explicabilite

CritereExcellent (14-15)Bon (12-13)Satisfaisant (11)Insuffisant (< 11)
MethodesLIME et SHAP appliquesUne methode appliquee en profondeurUne methode, utilisation de basePas d'analyse d'explicabilite
Visualisations≥ 5 visualisations claires et bien etiquetees3-4 visualisations2-3 visualisations de base< 2 ou mal formatees
InterpretationAnalyse approfondie, implications metier, verification des biaisBonne interpretation, quelques perspectivesInterpretation superficiellePas d'interpretation, juste des graphiques
DocumentationResultats integres dans le rapport avec recommandationsResultats mentionnes dans le rapportBreve mention dans le rapportNon documente

E. Documentation et rapport (10 %)

Objectifs

Produire une documentation professionnelle qui permettrait a un autre developpeur de comprendre, executer et etendre votre projet.

Exigences

  • README.md : Description du projet, instructions d'installation, exemples d'utilisation, reference API
  • Rapport technique (5-8 pages) : Suit le gabarit fourni
  • Documentation API : Swagger/OpenAPI accessible a /docs
  • Documentation du code : Docstrings pour toutes les fonctions publiques
  • Redaction claire : Pas de fautes d'orthographe, mise en forme coherente, structure logique

Exigences du README.md

Votre README doit inclure :

SectionContenu
Titre du projetNom clair et descriptif
Description2-3 phrases expliquant le projet
InstallationInstructions d'installation etape par etape
UtilisationComment demarrer l'API, exemples de requetes
Endpoints APITableau avec tous les endpoints
TestsComment executer les tests
Structure du projetArborescence des repertoires
Informations sur le modeleAlgorithme, metriques, jeu de donnees
AuteurVotre nom et numero d'etudiant

Structure du rapport technique

Votre rapport doit suivre le gabarit fourni dans la section Gabarit de rapport :

SectionPagesContenu cle
Resume executif0,5Vue d'ensemble de l'ensemble du projet
Definition du probleme1Contexte metier, jeu de donnees, objectifs
Methodologie1-1,5Pretraitement, selection du modele, strategie d'evaluation
Resultats1-1,5Metriques, comparaisons, matrices de confusion
Conception de l'API1Architecture, endpoints, formats de reponse
Strategie de tests0,5Plan de tests, couverture, resultats Postman
Explicabilite1Resultats LIME/SHAP, interpretation
Deploiement0,5Comment executer, Docker, environnement
Conclusion0,5Resume, lecons apprises, travaux futurs

Grille d'evaluation — Documentation et rapport

CritereExcellent (9-10)Bon (8)Satisfaisant (7)Insuffisant (< 7)
READMEComplet, clair, n'importe qui peut installer le projetLa plupart des sections presentes, lacunes mineuresREADME de base, sections manquantesPas de README ou inutilisable
Structure du rapportToutes les sections presentes, enchainement logiqueLa plupart des sections, lacunes mineures1-2 sections manquantesPlusieurs sections manquantes
Qualite de redactionProfessionnelle, claire, concise, sans erreursBonne redaction, quelques erreurs mineuresComprehensible, quelques erreursRedaction mediocre, nombreuses erreurs
Profondeur techniqueAnalyse approfondie, decisions justifieesBonne profondeur, la plupart des decisions expliqueesAnalyse superficiellePas de profondeur, juste des descriptions
Mise en formeCoherente, tableaux, figures avec legendesGlobalement coherenteMise en forme incoherenteAucun effort de mise en forme

F. Presentation orale (15 %)

Objectifs

Presenter votre projet de maniere professionnelle, demontrer un systeme fonctionnel et defendre vos decisions techniques pendant la periode de questions.

Exigences

  • Duree : 15 minutes de presentation + 5 minutes de questions
  • Diaporama : 10-15 diapositives, design epure
  • Demo en direct : Montrer l'API fonctionnant en temps reel
  • Profondeur technique : Expliquer le choix du modele, les metriques, les decisions d'architecture
  • Preparation aux questions : etre capable de repondre a des questions sur tout aspect de votre projet

Allocation du temps de presentation

SectionDureeContenu
Introduction et contexte2 minenonce du probleme, jeu de donnees, objectifs
Entrainement du modele et resultats3 minPoints saillants de l'EDA, comparaison des modeles, meilleur modele
Architecture de l'API2 minEndpoints, validation, gestion des erreurs
Demo en direct3 minMontrer l'API fonctionnant : health, predict, model-info
Tests et explicabilite3 minResultats des tests, couverture, analyses LIME/SHAP
Conclusion et lecons2 minCe que vous avez appris, ce que vous feriez differemment
Questions5 minRepondre aux questions de l'enseignant

Grille d'evaluation — Presentation orale

CritereExcellent (14-15)Bon (12-13)Satisfaisant (11)Insuffisant (< 11)
ContenuComplet, bien structure, couvre toutes les composantesBonne couverture, lacunes mineuresCouverture adequate, details manquantsComposantes majeures manquantes
DemoL'API fonctionne parfaitement, plusieurs requetes montreesLa demo fonctionne, problemes mineursLa demo fonctionne partiellementLa demo echoue ou n'est pas tentee
CommunicationConfiant(e), clair(e), professionnel(le), bon rythmeBonne livraison, nervosite mineureLivraison adequatePeu clair, lecture des diapositives
DiapositivesDesign epure, visuels informatifs, pas de murs de texteBonnes diapositives, problemes mineursAcceptables mais trop de texteMauvais design, trop de texte
QuestionsRepond a toutes les questions avec confiance, montre une comprehension approfondieRepond bien a la plupart des questionsRepond a certaines questionsNe peut pas repondre aux questions de base
Gestion du temps14-16 minutes, bien rythme12-18 minutes, rythme globalement bonMoins de 10 ou plus de 20 minutesSignificativement au-dessus/en dessous du temps
Voir le guide de presentation

Pour des conseils detailles de presentation, des recommandations d'allocation du temps et des questions frequentes, consultez le Guide de presentation.


Liste de verification complete de soumission

Utilisez cette liste de verification avant de soumettre votre EIA :

Code et modele

  • Le depot Git est propre et organise
  • .gitignore exclut __pycache__, .env, les fichiers volumineux
  • requirements.txt avec toutes les dependances (versions epinglees)
  • Le fichier du modele entraine est dans le repertoire models/
  • Le notebook d'EDA est complet et s'execute sans erreurs
  • Le notebook d'entrainement est complet et s'execute sans erreurs

API

  • L'API demarre sans erreurs (uvicorn src.app:app --reload)
  • /health retourne 200 avec statut et horodatage
  • /predict accepte une entree valide et retourne prediction + confiance
  • /predict retourne 422 pour une entree invalide
  • /model-info retourne les metadonnees du modele
  • La documentation Swagger est accessible a /docs

Tests

  • Au moins 10 tests pytest passent
  • Couverture de code > 70 %
  • Collection Postman exportee dans postman/collection.json
  • Les cas limites sont testes (types invalides, champs manquants, valeurs extremes)

Explicabilite

  • Analyse LIME et/ou SHAP completee
  • Au moins 3 visualisations sauvegardees
  • Interpretations redigees dans le notebook et le rapport

Documentation

  • README.md complet avec instructions d'installation
  • Rapport technique de 5-8 pages, suit le gabarit
  • Tout le code a des docstrings

Presentation

  • Diaporama de 10-15 diapositives
  • Demo en direct preparee et testee
  • Pratique dans la limite de 15 minutes
  • Prepare(e) pour les questions potentielles
Verification finale

Avant de soumettre, clonez votre depot dans un repertoire neuf et suivez vos propres instructions du README pour configurer le projet a partir de zero. Si vous ne pouvez pas l'executer, votre enseignant ne pourra pas non plus.