File size: 7,691 Bytes
66a0674
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
# 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