# Makefile pour la génération et gestion du modèle ML .PHONY: help model train validate clean info backup restore test # Variables PYTHON = python MODEL_FILE = model.pkl MODEL_INFO = model_info.json BACKUP_DIR = backup TIMESTAMP = $(shell date +%Y%m%d_%H%M%S) # Couleurs pour l'affichage GREEN = \033[0;32m YELLOW = \033[0;33m RED = \033[0;31m NC = \033[0m # Help - Affiche l'aide help: ## Affiche cette aide @echo "$(GREEN)Makefile pour la gestion du modele ML$(NC)" @echo "" @echo "$(YELLOW)Generation du modele:$(NC)" @echo " $(YELLOW)model $(NC) Alias pour train" @echo " $(YELLOW)train $(NC) Genere le modele ML via model.py" @echo " $(YELLOW)retrain $(NC) Force la regeneration du modele" @echo " $(YELLOW)setup $(NC) Configuration et generation complete" @echo "" @echo "$(YELLOW)Validation et tests:$(NC)" @echo " $(YELLOW)validate $(NC) Valide l'existence et l'integrite du modele" @echo " $(YELLOW)test $(NC) Lance les tests de validation du modele" @echo " $(YELLOW)test-prediction $(NC) Test une prediction simple" @echo "" @echo "$(YELLOW)Gestion et maintenance:$(NC)" @echo " $(YELLOW)info $(NC) Affiche les informations detaillees du modele" @echo " $(YELLOW)model-size $(NC) Affiche la taille des fichiers du modele" @echo " $(YELLOW)backup $(NC) Sauvegarde le modele actuel" @echo " $(YELLOW)restore $(NC) Restaure le dernier modele sauvegarde" @echo " $(YELLOW)list-backups $(NC) Liste toutes les sauvegardes disponibles" @echo " $(YELLOW)clean $(NC) Supprime les fichiers du modele actuel" @echo " $(YELLOW)clean-all $(NC) Supprime tout (modele + sauvegardes)" @echo "" @echo "$(YELLOW)Environnement et verifications:$(NC)" @echo " $(YELLOW)check-deps $(NC) Verifie les dependances Python" @echo " $(YELLOW)check-db $(NC) Verifie la connexion a la base de donnees" # Génération du modèle model: train ## Alias pour train train: ## Génère le modèle ML via model.py @echo "$(GREEN)Generation du modele de Machine Learning...$(NC)" @if [ ! -f "$(MODEL_FILE)" ]; then \ echo "$(YELLOW)Aucun modele existant trouve. Generation d'un nouveau modele...$(NC)"; \ else \ echo "$(YELLOW)Un modele existant a ete trouve. Sauvegarde avant regeneration...$(NC)"; \ $(MAKE) backup; \ fi $(PYTHON) model.py @echo "$(GREEN)✅ Modele genere avec succes!$(NC)" @if [ -f "$(MODEL_INFO)" ]; then \ echo "$(YELLOW)Informations du modele:$(NC)"; \ cat $(MODEL_INFO) | head -10; \ fi retrain: clean train ## Force la régénération du modèle # Validation et tests validate: ## Valide l'existence et l'intégrité du modèle @echo "$(GREEN)Validation du modele...$(NC)" @if [ ! -f "$(MODEL_FILE)" ]; then \ echo "$(RED)❌ Fichier modele manquant: $(MODEL_FILE)$(NC)"; \ exit 1; \ else \ echo "$(GREEN)✅ Fichier modele trouve: $(MODEL_FILE)$(NC)"; \ fi @if [ ! -f "$(MODEL_INFO)" ]; then \ echo "$(RED)❌ Fichier d'information manquant: $(MODEL_INFO)$(NC)"; \ exit 1; \ else \ echo "$(GREEN)✅ Fichier d'information trouve: $(MODEL_INFO)$(NC)"; \ fi @echo "$(GREEN)✅ Modele valide avec succes!$(NC)" test: validate ## Lance les tests de validation du modèle @echo "$(GREEN)Test de chargement du modele...$(NC)" @$(PYTHON) -c "import joblib; model = joblib.load('$(MODEL_FILE)'); print('✅ Modele charge avec succes'); print(f'Type: {type(model).__name__}'); import json; info = json.load(open('$(MODEL_INFO)')); print(f'Accuracy: {info.get(\"accuracy\", \"N/A\")}'); print(f'Features: {len(info.get(\"features\", []))} variables')" test-prediction: validate ## Test une prédiction simple @echo "$(GREEN)Test de prediction...$(NC)" @$(PYTHON) -c "import joblib; import json; import numpy as np; model = joblib.load('$(MODEL_FILE)'); info = json.load(open('$(MODEL_INFO)')); features = info['features']; test_data = np.random.random((1, len(features))); pred = model.predict(test_data); print(f'✅ Prediction test reussie: {pred[0]:.4f}')" # Gestion et maintenance info: ## Affiche les informations détaillées du modèle @echo "$(GREEN)Informations du modele:$(NC)" @if [ -f "$(MODEL_INFO)" ]; then \ cat $(MODEL_INFO); \ else \ echo "$(RED)❌ Fichier d'information non trouve$(NC)"; \ exit 1; \ fi model-size: ## Affiche la taille des fichiers du modèle @echo "$(GREEN)Taille des fichiers:$(NC)" @if [ -f "$(MODEL_FILE)" ]; then \ ls -lh $(MODEL_FILE) | awk '{print "Modele: " $$5 " (" $$9 ")"}'; \ fi @if [ -f "$(MODEL_INFO)" ]; then \ ls -lh $(MODEL_INFO) | awk '{print "Info: " $$5 " (" $$9 ")"}'; \ fi backup: ## Sauvegarde le modèle actuel @echo "$(GREEN)Sauvegarde du modele...$(NC)" @mkdir -p $(BACKUP_DIR) @if [ -f "$(MODEL_FILE)" ]; then \ cp $(MODEL_FILE) $(BACKUP_DIR)/model_$(TIMESTAMP).pkl; \ echo "$(GREEN)✅ Modele sauvegarde: $(BACKUP_DIR)/model_$(TIMESTAMP).pkl$(NC)"; \ fi @if [ -f "$(MODEL_INFO)" ]; then \ cp $(MODEL_INFO) $(BACKUP_DIR)/model_info_$(TIMESTAMP).json; \ echo "$(GREEN)✅ Info sauvegardee: $(BACKUP_DIR)/model_info_$(TIMESTAMP).json$(NC)"; \ fi restore: ## Restaure le dernier modèle sauvegardé @echo "$(GREEN)Restauration du dernier modele...$(NC)" @if [ ! -d "$(BACKUP_DIR)" ]; then \ echo "$(RED)❌ Aucune sauvegarde trouvee$(NC)"; \ exit 1; \ fi @LATEST_MODEL=$$(ls -t $(BACKUP_DIR)/model_*.pkl 2>/dev/null | head -1); \ LATEST_INFO=$$(ls -t $(BACKUP_DIR)/model_info_*.json 2>/dev/null | head -1); \ if [ -n "$$LATEST_MODEL" ]; then \ cp "$$LATEST_MODEL" $(MODEL_FILE); \ echo "$(GREEN)✅ Modele restaure: $$LATEST_MODEL$(NC)"; \ fi; \ if [ -n "$$LATEST_INFO" ]; then \ cp "$$LATEST_INFO" $(MODEL_INFO); \ echo "$(GREEN)✅ Info restauree: $$LATEST_INFO$(NC)"; \ fi list-backups: ## Liste toutes les sauvegardes disponibles @echo "$(GREEN)Sauvegardes disponibles:$(NC)" @if [ -d "$(BACKUP_DIR)" ]; then \ ls -la $(BACKUP_DIR)/ | grep -E '\.(pkl|json)$$' | awk '{print $$9 " (" $$5 " bytes, " $$6 " " $$7 " " $$8 ")"}' || echo "$(YELLOW)Aucune sauvegarde trouvee$(NC)"; \ else \ echo "$(YELLOW)Aucun dossier de sauvegarde$(NC)"; \ fi clean: ## Supprime les fichiers du modèle actuel @echo "$(GREEN)Nettoyage des fichiers du modele...$(NC)" @if [ -f "$(MODEL_FILE)" ]; then \ rm $(MODEL_FILE); \ echo "$(GREEN)✅ $(MODEL_FILE) supprime$(NC)"; \ fi @if [ -f "$(MODEL_INFO)" ]; then \ rm $(MODEL_INFO); \ echo "$(GREEN)✅ $(MODEL_INFO) supprime$(NC)"; \ fi clean-all: clean ## Supprime tout (modèle + sauvegardes) @echo "$(GREEN)Nettoyage complet...$(NC)" @if [ -d "$(BACKUP_DIR)" ]; then \ rm -rf $(BACKUP_DIR); \ echo "$(GREEN)✅ Dossier de sauvegarde supprime$(NC)"; \ fi # Environnement et dépendances check-deps: ## Vérifie les dépendances Python @echo "$(GREEN)Verification des dependances...$(NC)" @$(PYTHON) -c "import sklearn, pandas, numpy, joblib; print('✅ Toutes les dependances sont disponibles')" || (echo "$(RED)❌ Dependances manquantes$(NC)" && exit 1) check-db: ## Vérifie la connexion à la base de données @echo "$(GREEN)Verification de la connexion DB...$(NC)" @$(PYTHON) -c "from sqlalchemy import create_engine; import os; engine = create_engine(os.getenv('DATABASE_URL', 'postgresql://user:password@localhost/dbname')); engine.connect(); print('✅ Connexion DB reussie')" || (echo "$(RED)❌ Erreur de connexion DB$(NC)" && exit 1) # Workflow complet setup: check-deps check-db train ## Configuration et génération complète @echo "$(GREEN)✅ Setup complet termine!$(NC)" # Commande par défaut .DEFAULT_GOAL := help