gdleds commited on
Commit
ff26f8b
·
1 Parent(s): a7c4e1c
Files changed (2) hide show
  1. Dockerfile +0 -2
  2. model.py +107 -0
Dockerfile CHANGED
@@ -13,8 +13,6 @@ RUN apt-get update && apt-get install -y \
13
  COPY requirements.txt requirements.txt
14
  RUN pip install -r requirements.txt
15
 
16
- RUN pip install mlflow==2.15.0 -r requirements.txt
17
-
18
 
19
 
20
  # Exposition du port MLflow
 
13
  COPY requirements.txt requirements.txt
14
  RUN pip install -r requirements.txt
15
 
 
 
16
 
17
 
18
  # Exposition du port MLflow
model.py ADDED
@@ -0,0 +1,107 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import mlflow
2
+ import pandas as pd
3
+ import os
4
+ import subprocess
5
+ import numpy as np
6
+ from dotenv import load_dotenv
7
+ from sklearn.compose import ColumnTransformer
8
+ from sklearn.pipeline import Pipeline
9
+ from sklearn.impute import SimpleImputer
10
+ from sklearn.preprocessing import StandardScaler, OneHotEncoder
11
+ from sklearn.model_selection import train_test_split
12
+ from sklearn.metrics import mean_absolute_error, r2_score, mean_squared_error
13
+ from xgboost import XGBRegressor
14
+ import boto3
15
+ import joblib
16
+ import io
17
+
18
+ load_dotenv(dotenv_path='.secrets')
19
+
20
+ mlflow.set_tracking_uri(os.getenv('BACKEND_STORE_URI'))
21
+ os.environ['AWS_ACCESS_KEY_ID'] = os.getenv('AWS_ACCESS_KEY_ID')
22
+ os.environ['AWS_SECRET_ACCESS_KEY'] = os.getenv('AWS_SECRET_ACCESS_KEY')
23
+ os.environ['MLFLOW_DEFAULT_ARTIFACT_ROOT'] = os.getenv('MLFLOW_DEFAULT_ARTIFACT_ROOT')
24
+ os.environ['S3_BUCKET'] = os.getenv('S3_BUCKET')
25
+
26
+ # Log configurations au démarrage
27
+ print("=== Configuration MLflow ===")
28
+ print(f"Tracking URI: {mlflow.get_tracking_uri()}")
29
+ print(f"Artifact Store: {os.getenv('MLFLOW_DEFAULT_ARTIFACT_ROOT')}")
30
+ print(f"AWS Access: {'Configuré' if os.getenv('AWS_ACCESS_KEY_ID') else 'Manquant'}")
31
+
32
+ s3 = boto3.client('s3')
33
+ try:
34
+ response = s3.list_objects_v2(Bucket=os.getenv('S3_BUCKET'))
35
+ print("S3 contents:", response.get('Contents', []))
36
+ except Exception as e:
37
+ print("S3 error:", e)
38
+
39
+ df = pd.read_csv('/mnt/c/Users/m_bar/dsfs_ft/GETAROUND/pricing_clean.csv')
40
+ feature_list = df.drop('rental_price_per_day', axis=1)
41
+ target = df['rental_price_per_day']
42
+ X = feature_list
43
+ Y = target
44
+ X_train, X_test, Y_train, Y_test = train_test_split(X,Y, test_size=0.2, random_state=42)
45
+
46
+ numeric_features = ['mileage', 'engine_power']
47
+ categorical_features = ['model_key','fuel', 'paint_color', 'car_type', 'private_parking_available', 'has_gps', 'has_air_conditioning','automatic_car','has_getaround_connect','has_speed_regulator','winter_tires']
48
+
49
+ numeric_transformer = Pipeline(steps=[('scaler', StandardScaler())])
50
+ categorical_transformer = Pipeline(steps=[('encoder', OneHotEncoder(drop='if_binary', handle_unknown='ignore'))])
51
+
52
+ preprocessor = ColumnTransformer(transformers =[
53
+ ('num', numeric_transformer, numeric_features),
54
+ ('cat', categorical_transformer, categorical_features)
55
+ ])
56
+
57
+ def train_evaluate_model_with_mlflow(model, X_train, X_test, Y_train, Y_test, model_name):
58
+ print(f"\n=== Démarrage entraînement {model_name} ===")
59
+ print(f"Tracking URI: {mlflow.get_tracking_uri()}")
60
+ print(f"Registry URI: {mlflow.get_registry_uri()}")
61
+
62
+ mlflow.set_experiment("price_prediction")
63
+ print(f"Experiment: price_prediction")
64
+ s3 = boto3.client('s3')
65
+
66
+ with mlflow.start_run() as run:
67
+ print(f"Run ID: {run.info.run_id}")
68
+
69
+ print("Entraînement du modèle...")
70
+ model.fit(X_train, Y_train)
71
+
72
+ #save model to S3
73
+ print("Enregistrement du modèle sur S3...")
74
+ model_path = f"mlflow/models/{model_name}_{run.info.run_id}.joblib"
75
+ buffer = io.BytesIO()
76
+ joblib.dump(model, buffer)
77
+ s3.put_object(
78
+ Bucket=os.getenv('S3_BUCKET'),
79
+ Key=model_path,
80
+ Body=buffer.getvalue()
81
+ )
82
+ print("Modèle enregistré")
83
+
84
+ y_pred = model.predict(X_test)
85
+ metrics = {
86
+ "RMSE": np.sqrt(mean_squared_error(Y_test, y_pred)),
87
+ "MAE": mean_absolute_error(Y_test, y_pred),
88
+ "R2": r2_score(Y_test, y_pred)
89
+ }
90
+
91
+ print("\nEnregistrement des métriques...")
92
+ for name, value in metrics.items():
93
+ mlflow.log_metric(name, value)
94
+ print(f"{name}: {value:.2f}")
95
+
96
+ return model, run.info.run_id
97
+
98
+ if __name__ == "__main__":
99
+ xgb_best_param = XGBRegressor(learning_rate = 0.1, max_depth = 5, n_estimators =200, n_jobs = 1)
100
+ xgb_final = Pipeline(steps=[
101
+ ('preprocessor', preprocessor),
102
+ ('xgboost_best', xgb_best_param)
103
+ ])
104
+ _, run_id = train_evaluate_model_with_mlflow(
105
+ xgb_final, X_train, X_test, Y_train, Y_test, "xgboost_model"
106
+ )
107
+ print(f"Run ID: {run_id}")