Spaces:
Sleeping
Sleeping
| # 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 | |
| "$(GREEN)Makefile pour la gestion du modele ML$(NC)" | |
| "" | |
| "$(YELLOW)Generation du modele:$(NC)" | |
| " $(YELLOW)model $(NC) Alias pour train" | |
| " $(YELLOW)train $(NC) Genere le modele ML via model.py" | |
| " $(YELLOW)retrain $(NC) Force la regeneration du modele" | |
| " $(YELLOW)setup $(NC) Configuration et generation complete" | |
| "" | |
| "$(YELLOW)Validation et tests:$(NC)" | |
| " $(YELLOW)validate $(NC) Valide l'existence et l'integrite du modele" | |
| " $(YELLOW)test $(NC) Lance les tests de validation du modele" | |
| " $(YELLOW)test-prediction $(NC) Test une prediction simple" | |
| "" | |
| "$(YELLOW)Gestion et maintenance:$(NC)" | |
| " $(YELLOW)info $(NC) Affiche les informations detaillees du modele" | |
| " $(YELLOW)model-size $(NC) Affiche la taille des fichiers du modele" | |
| " $(YELLOW)backup $(NC) Sauvegarde le modele actuel" | |
| " $(YELLOW)restore $(NC) Restaure le dernier modele sauvegarde" | |
| " $(YELLOW)list-backups $(NC) Liste toutes les sauvegardes disponibles" | |
| " $(YELLOW)clean $(NC) Supprime les fichiers du modele actuel" | |
| " $(YELLOW)clean-all $(NC) Supprime tout (modele + sauvegardes)" | |
| "" | |
| "$(YELLOW)Environnement et verifications:$(NC)" | |
| " $(YELLOW)check-deps $(NC) Verifie les dependances Python" | |
| " $(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 | |
| "$(GREEN)Generation du modele de Machine Learning...$(NC)" | |
| [ ! -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 | |
| "$(GREEN)✅ Modele genere avec succes!$(NC)" | |
| [ -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 | |
| "$(GREEN)Validation du modele...$(NC)" | |
| [ ! -f "$(MODEL_FILE)" ]; then \ | |
| echo "$(RED)❌ Fichier modele manquant: $(MODEL_FILE)$(NC)"; \ | |
| exit 1; \ | |
| else \ | |
| echo "$(GREEN)✅ Fichier modele trouve: $(MODEL_FILE)$(NC)"; \ | |
| fi | |
| [ ! -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 | |
| "$(GREEN)✅ Modele valide avec succes!$(NC)" | |
| test: validate ## Lance les tests de validation du modèle | |
| "$(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 | |
| "$(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 | |
| "$(GREEN)Informations du modele:$(NC)" | |
| [ -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 | |
| "$(GREEN)Taille des fichiers:$(NC)" | |
| [ -f "$(MODEL_FILE)" ]; then \ | |
| ls -lh $(MODEL_FILE) | awk '{print "Modele: " $$5 " (" $$9 ")"}'; \ | |
| fi | |
| [ -f "$(MODEL_INFO)" ]; then \ | |
| ls -lh $(MODEL_INFO) | awk '{print "Info: " $$5 " (" $$9 ")"}'; \ | |
| fi | |
| backup: ## Sauvegarde le modèle actuel | |
| "$(GREEN)Sauvegarde du modele...$(NC)" | |
| -p $(BACKUP_DIR) | |
| [ -f "$(MODEL_FILE)" ]; then \ | |
| cp $(MODEL_FILE) $(BACKUP_DIR)/model_$(TIMESTAMP).pkl; \ | |
| echo "$(GREEN)✅ Modele sauvegarde: $(BACKUP_DIR)/model_$(TIMESTAMP).pkl$(NC)"; \ | |
| fi | |
| [ -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é | |
| "$(GREEN)Restauration du dernier modele...$(NC)" | |
| [ ! -d "$(BACKUP_DIR)" ]; then \ | |
| echo "$(RED)❌ Aucune sauvegarde trouvee$(NC)"; \ | |
| exit 1; \ | |
| fi | |
| =$$(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 | |
| "$(GREEN)Sauvegardes disponibles:$(NC)" | |
| [ -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 | |
| "$(GREEN)Nettoyage des fichiers du modele...$(NC)" | |
| [ -f "$(MODEL_FILE)" ]; then \ | |
| rm $(MODEL_FILE); \ | |
| echo "$(GREEN)✅ $(MODEL_FILE) supprime$(NC)"; \ | |
| fi | |
| [ -f "$(MODEL_INFO)" ]; then \ | |
| rm $(MODEL_INFO); \ | |
| echo "$(GREEN)✅ $(MODEL_INFO) supprime$(NC)"; \ | |
| fi | |
| clean-all: clean ## Supprime tout (modèle + sauvegardes) | |
| "$(GREEN)Nettoyage complet...$(NC)" | |
| [ -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 | |
| "$(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 | |
| "$(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 | |
| "$(GREEN)✅ Setup complet termine!$(NC)" | |
| # Commande par défaut | |
| .DEFAULT_GOAL := help |