Dama12's picture
Ajout du fichier de données nécessaire
c2712f2
import joblib
import pandas as pd
import numpy as np
from flask import Flask, request, jsonify
from flask_cors import CORS
import os
import logging
import threading
import time
from tqdm import tqdm
from tenacity import retry, wait_fixed, stop_after_attempt
from sklearn.preprocessing import StandardScaler, LabelEncoder
from sklearn.impute import SimpleImputer
from sklearn.model_selection import StratifiedKFold
from sklearn.metrics import f1_score, recall_score
from imblearn.over_sampling import SMOTE
from imblearn.under_sampling import RandomUnderSampler
from imblearn.pipeline import Pipeline
from xgboost import XGBClassifier
from lightgbm import LGBMClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
# Initialiser l'application Flask
app = Flask(__name__)
CORS(app)
# Chemins vers les fichiers de modèle
PRIORITY_MODEL_PATH = 'priority_model.pkl'
SERVICE_MODEL_PATH = 'service_model.pkl'
DATASET_PATH = "my_datasheet_80000.csv"
NEW_DATA_FILE = 'new_data.csv'
MIN_NEW_SAMPLES_FOR_RETRAIN = 100
# Variables globales pour les modèles
priority_model = None
service_model = None
priority_scaler = None
service_scaler = None
priority_imputer = None
service_imputer = None
label_encoder_service = LabelEncoder()
model_lock = threading.Lock()
# Initialiser le logger
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
# Fonction pour charger les modèles
def load_models():
global priority_model, service_model, priority_scaler, service_scaler, priority_imputer, service_imputer, label_encoder_service
if os.path.exists(PRIORITY_MODEL_PATH):
priority_model = joblib.load(PRIORITY_MODEL_PATH)
if os.path.exists(SERVICE_MODEL_PATH):
service_model = joblib.load(SERVICE_MODEL_PATH)
priority_scaler = joblib.load('priority_scaler.pkl')
service_scaler = joblib.load('service_scaler.pkl')
priority_imputer = joblib.load('priority_imputer.pkl')
service_imputer = joblib.load('service_imputer.pkl')
label_encoder_service = joblib.load('label_encoder_service.pkl')
# Charger les modèles au démarrage
load_models()
# Fonctions et routes Flask
@app.route('/predict', methods=['POST'])
def predict():
global priority_model, service_model
if priority_model is None or service_model is None:
load_models()
try:
data = request.get_json()
required_fields = ['age', 'sexe', 'enceinte', 'spo2', 'freq_resp', 'pouls', 'ecg', 'pa', 'temperature', 'imc']
missing_fields = [field for field in required_fields if field not in data]
if missing_fields:
return jsonify({'error': f'Missing fields: {", ".join(missing_fields)}'}), 400
input_data = {
'Age': float(data['age']),
'Sexe': 0 if data['sexe'].lower() == 'masculin' else 1,
'Enceinte': 1 if bool(data['enceinte']) else 0,
'SpO2': float(data['spo2']),
'Frquce_Rprtr(rpm)': float(data['freq_resp']),
'Pouls': float(data['pouls']),
'ECG': 0 if data['ecg'].lower() == 'normal' else 1,
'PA': float(data['pa']),
'Temperature': float(data['temperature']),
'IMC': float(data['imc']),
}
input_df = pd.DataFrame([input_data])
input_df = enhanced_features(input_df)
suggested_service, suggested_priority = compute_service_and_priority(input_df.iloc[0])
input_df['Suggested_Priority'] = suggested_priority
with model_lock:
# Priority prediction
priority_input = input_df[PRIORITY_FEATURES]
priority_imputed = priority_imputer.transform(priority_input)
priority_scaled = priority_scaler.transform(priority_imputed)
priority_probs = priority_model.predict_proba(priority_scaled)[0]
priority_pred = np.argmax(priority_probs) + 1
priority_conf = float(max(priority_probs))
# Service prediction
service_input = input_df[SERVICE_FEATURES]
service_imputed = service_imputer.transform(service_input)
service_scaled = service_scaler.transform(service_imputed)
service_probs = service_model.predict_proba(service_scaled)[0]
service_pred_idx = np.argmax(service_probs)
service_pred = label_encoder_service.inverse_transform([service_pred_idx])[0]
service_conf = float(max(service_probs))
# Fallback to rule-based logic if confidence is low or critical conditions apply
if priority_conf < 0.7 or input_df['Critical_Signs'][0] == 1:
priority_pred = suggested_priority
if service_conf < 0.7 or input_df['Enceinte'][0] == 1:
service_pred = suggested_service if input_df['Enceinte'][0] == 0 else 'Gynécologie/Obstétrique'
input_df['Priorite'] = priority_pred
input_df['Service_Suivant'] = service_pred
if not os.path.exists(NEW_DATA_FILE):
input_df.to_csv(NEW_DATA_FILE, index=False)
else:
input_df.to_csv(NEW_DATA_FILE, mode='a', header=False, index=False)
logger.info(f"Predicted: service={service_pred}, priority={priority_pred}, service_conf={service_conf}, priority_conf={priority_conf}")
return jsonify({
'priority': int(priority_pred),
'service_suivant': service_pred,
'priority_confidence': priority_conf,
'service_confidence': service_conf
})
except Exception as e:
logger.error(f"Prediction error: {str(e)}")
return jsonify({'error': str(e)}), 500
if __name__ == '__main__':
app.run(debug=False, host='0.0.0.0', port=5000)