From bef54d17b2f92f344a24b7044b3df94e59787d31 Mon Sep 17 00:00:00 2001 From: Ladebeze66 Date: Sat, 22 Feb 2025 16:16:01 +0100 Subject: [PATCH] Docker --- .dockerignore | 19 +++++++++++++++++++ .gitignore | 4 ++++ Dokerfile | 14 ++++++++++++++ data/data_normalized.csv | 25 ------------------------- main.py | 6 +++--- model.npy | Bin 144 -> 0 bytes notes.txt | 34 ++++++++++++++++++++++++++++++++++ requirements.txt | 5 +++++ src/evaluate_model.py | 23 +++++++++++++++++++++++ src/training_model.py | 4 +++- 10 files changed, 105 insertions(+), 29 deletions(-) create mode 100644 .dockerignore create mode 100644 Dokerfile delete mode 100644 data/data_normalized.csv delete mode 100644 model.npy create mode 100644 requirements.txt create mode 100644 src/evaluate_model.py diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..d05b2f7 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,19 @@ +# Ignorer le dossier Git et les fichiers de versioning +.git/ +.gitignore + +# Ignorer les fichiers Python temporaires +__pycache__/ +*.pyc +*.pyo +*.pyd + +# Ignorer l’environnement virtuel (si jamais recréé) +venv/ +ftline/ + +# Ignorer les fichiers générés +model.npy +data/data.normalized.csv + +ft_linear_subject.pdf \ No newline at end of file diff --git a/.gitignore b/.gitignore index 694b01d..b52bb8d 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,7 @@ Thumbs.db *.tar.gz dist/ build/ + +# Ignorer les fichiers générés +model.npy +data/data.normalized.csv diff --git a/Dokerfile b/Dokerfile new file mode 100644 index 0000000..50d8fee --- /dev/null +++ b/Dokerfile @@ -0,0 +1,14 @@ +# Utilisation d'une image Python officielle +FROM python:3.12 + +# Définition du répertoire de travail +WORKDIR /app + +# Copier tous les fichiers du projet dans le conteneur +COPY . /app + +# Installer les dépendances du projet +RUN pip install --no-cache-dir -r requirements.txt + +# COMMANDE PAR défaut : Exécuter "main.py" +CMD ["python", "main.py"] \ No newline at end of file diff --git a/data/data_normalized.csv b/data/data_normalized.csv deleted file mode 100644 index 5bb9070..0000000 --- a/data/data_normalized.csv +++ /dev/null @@ -1,25 +0,0 @@ -km,price,km_norm,price_norm -240000,3650,1.0,0.0 -139800,3800,0.5384636643774096,0.032327586206896554 -150500,4400,0.5877494806564687,0.16163793103448276 -185530,4450,0.7491029520822106,0.1724137931034483 -176000,5250,0.7052063325364692,0.3448275862068966 -114800,5350,0.4233098880244679,0.36637931034482757 -166800,5800,0.6628297428385866,0.46336206896551724 -89000,5990,0.30447119082823204,0.5043103448275862 -144500,5999,0.5601125743317626,0.50625 -84000,6200,0.2814404355576437,0.5495689655172413 -82029,6390,0.27236171182997776,0.5905172413793104 -63060,6390,0.18498763248441968,0.5905172413793104 -74000,6600,0.23537892501646698,0.6357758620689655 -97500,6800,0.3436234747882322,0.6788793103448276 -67000,6800,0.2031358676376433,0.6788793103448276 -76025,6900,0.24470638090105526,0.7004310344827587 -48235,6900,0.11670144310712526,0.7004310344827587 -93000,6990,0.32289579504470267,0.7198275862068966 -60949,7490,0.1752640476091773,0.8275862068965517 -65674,7555,0.1970281113398833,0.8415948275862069 -54000,7990,0.1432559039341136,0.9353448275862069 -68500,7990,0.2100450942188198,0.9353448275862069 -22899,7990,0.0,0.9353448275862069 -61789,8290,0.17913321449463615,1.0 diff --git a/main.py b/main.py index 1f995c4..b43d3d9 100644 --- a/main.py +++ b/main.py @@ -9,15 +9,15 @@ from src.prediction import predict_price # ✅ Peut maintenant être importé d from src.gui import show_gui # ✅ Import propre et structuré def main(): - print("📌 Bienvenue dans le modèle de prédiction de prix de voiture !") + print("Bienvenue dans le modèle de prédiction de prix de voiture !") print("🔄 Le modèle va être entraîné...") # Entraîner le modèle train_model() - print("✅ Modèle entraîné avec succès !") + print("Modèle entraîné avec succès !") # Lancer l'interface graphique après l'entraînement - print("🖥️ Lancement de l'interface graphique...") + print("Lancement de l'interface graphique...") show_gui(predict_price) if __name__ == "__main__": diff --git a/model.npy b/model.npy deleted file mode 100644 index 9fc0936917fdcebe4fdd4ab917a8a7a712ef9664..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144 zcmbR27wQ`j$;eQ~P_3SlTAW;@Zl$1ZlV+i=qoAIaUsO_*m=~X4l#&V(cT3DEP6dh= mXCxM+0{I$7I+{8PwF(pfuEvgg8+Si?YoD?u-D2B{_xk~0J|%$w diff --git a/notes.txt b/notes.txt index a61d631..070bd93 100644 --- a/notes.txt +++ b/notes.txt @@ -548,6 +548,40 @@ Implémentation de la fonction coût tmpθ₁ = learningRate × (1 / m) ∑ᵐ⁻¹ᵢ=₀ (estimatePrice(mileage[i]) − price[i]) x mileage[i] En mathématique ces valeurs temporaires sont sous forme de dérivées +- Calcul de l'évaluation du modèle + . Calcul de deux métriques de performance: + 1. L'erreur quadratique moyenne (MSE - Mean Squared Error) + 2. Le coefficient de détermination (R² _ R square score) + Ces deux valeurs évaluent à quel point notre modèle de régression linéaire est précision + + 1. Erruer quadratique Moyenne (MSE) + Formule: + MSE = (1/m)∑ᵐᵢ=1(yi - ^yi)² + . yi = valeur réelle du prix normalisé + . ^yi = Valeur prédite par notre modèle + . m = Nombre total de points de données + + interprétation: + . MSE proche de 0 fait très peu d'erreur + . MSE élevé -> Le modèle prédit mal le prix + mse = np.mean((y - y_pred) ** 2) + + 2. Coefficient de détermination (R² Score) + Formule: + R² = 1 - (SSrsesidual / SStotal) + Avec: + . SStotal = Somme des carrés des différences entre les valeurs réelles et leur moyenne + SStotal = ∑(yi - -y)² + où -y est la moyenne de toutes les valeurs réelle + . SSresidual = Somme des carrés des erreurs entre les valeurs réelles et les perédictions + SSresidual = ∑(yi - ^yi)² + + interprétation de R²: + . R² = 1 -> Le modèle est parfait et explique 100% des variations de price_norm. + . R² = 0 -> Le modèle est inutile et ne fait pas mieux qu'une poyenne + . R² < 0 -> Le modèle est pire que de deviner la moyenne (cata!) + + diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..03db77d --- /dev/null +++ b/requirements.txt @@ -0,0 +1,5 @@ +numpy +pandas +matplotlib +seaborn +tk \ No newline at end of file diff --git a/src/evaluate_model.py b/src/evaluate_model.py new file mode 100644 index 0000000..8c70dbb --- /dev/null +++ b/src/evaluate_model.py @@ -0,0 +1,23 @@ +import numpy as np + +def evaluate_model(df, theta_0, theta_1): + """Calcule la précision du modèle en utilisant l'erreur quadratique moyenne (MSE) et R².""" + X = df["km_norm"].values + y = df["price_norm"].values + + # Prédictions du modèle + y_pred = theta_0 + theta_1 * X + + # Erreur quadratique moyenne (MSE) + mse = np.mean((y - y_pred) ** 2) + + # Coefficient de détermination (R²) + ss_total = np.sum((y - np.mean(y)) ** 2) + ss_residual = np.sum((y - y_pred) ** 2) + r2_score = 1 - (ss_residual / ss_total) + + print(f"\nPrécision du modèle :") + print(f"🔹 Erreur quadratique moyenne (MSE) : {mse:.4f}") + print(f"🔹 Coefficient de détermination (R²) : {r2_score:.4f} (plus proche de 1 = meilleur)") + + return mse, r2_score diff --git a/src/training_model.py b/src/training_model.py index 8cf4d0b..9088ad6 100644 --- a/src/training_model.py +++ b/src/training_model.py @@ -3,6 +3,7 @@ import pandas as pd from data_process import load_and_process_data from gradient_descent import gradient_descent from visualization import plot_cost_history, plot_regression_line +from evaluate_model import evaluate_model def train_model(): """ @@ -16,7 +17,7 @@ def train_model(): theta_0_init = 0 theta_1_init = 1 learning_rate = 0.1 # Taux d'apprentissage - iterations = 1000 + iterations = 10000 # Exécuter la descente de gradient theta_0_opt, theta_1_opt, cost_history = gradient_descent(X, y, theta_0_init, theta_1_init, learning_rate, iterations) @@ -31,6 +32,7 @@ def train_model(): plot_cost_history(cost_history) # Affichage de l'historique du coût # Affichage de la régression linéaire plot_regression_line(df, theta_0_opt, theta_1_opt) + evaluate_model(df, theta_0_opt, theta_1_opt) return theta_0_opt, theta_1_opt