import pandas as pd import gradio as gr import numpy as np import plotly.express as px import pickle from sklearn.preprocessing import StandardScaler # Charger les modèles sauvegardés with open("scaler.pkl", "rb") as f: scaler = pickle.load(f) with open("pca_model.pkl", "rb") as f: pca_model = pickle.load(f) with open("kmeans_model.pkl", "rb") as f: model_cluster = pickle.load(f) # Vérifie si le fichier existe et charge-le try: with open("lg.pkl", "rb") as f: model_diabetes = pickle.load(f) print("Model loaded successfully!") except FileNotFoundError: print("File 'lg.pkl' not found.") except EOFError: print("File 'lg.pkl' is empty or corrupted.") # Charger le dataframe (assurez-vous de mettre le bon chemin vers votre fichier) df_scaled = pd.read_csv("data.csv") # Remplacez par le chemin réel du fichier # Appliquer PCA pour transformer les données en 2D et prédire les clusters pca_result = pca_model.transform(df_scaled) pca_df = pd.DataFrame(pca_result, columns=['PC1', 'PC2']) pca_df['Cluster'] = model_cluster.predict(df_scaled) # Fonction de prédiction du diabète def predict_diabetes(pregnancies, glucose, blood_pressure, skin_thickness, insulin, bmi, dpf, age): input_data = np.array([[pregnancies, glucose, blood_pressure, skin_thickness, insulin, bmi, dpf, age]]) prediction = model_diabetes.predict(input_data)[0] # Utilise le modèle de régression logistique pour prédire return "Diabétique" if prediction == 1 else "Non diabétique" # Fonction pour afficher les clusters def plot_clusters(selected_cluster): # Filtrer par le cluster sélectionné (si "Tous" n'est pas choisi) if selected_cluster != "Tous": selected_data = pca_df[pca_df['Cluster'] == int(selected_cluster)] else: selected_data = pca_df if selected_data.empty: return px.scatter(title="Aucun point à afficher") # Créer le graphique avec Plotly fig = px.scatter(selected_data, x='PC1', y='PC2', color=selected_data['Cluster'].astype(str), title=f"Visualisation du Cluster {selected_cluster}", labels={'color': 'Cluster'}) return fig # Fonction pour télécharger les clusters en CSV def download_clusters(): return df.to_csv(index=False), "clusters.csv" # Interface utilisateur Gradio with gr.Blocks() as app: gr.Markdown("## Application Machine Learning : Classification et Clustering") # **Section Classification** gr.Markdown("### Prédiction du Diabète") with gr.Row(): pregnancies = gr.Number(label="Grossesses") glucose = gr.Number(label="Glucose") blood_pressure = gr.Number(label="Pression artérielle") with gr.Row(): skin_thickness = gr.Number(label="Épaisseur de peau") insulin = gr.Number(label="Insuline") bmi = gr.Number(label="IMC") with gr.Row(): dpf = gr.Number(label="DPF") age = gr.Number(label="Âge") predict_button = gr.Button("Prédire") output_label = gr.Textbox(label="Résultat") predict_button.click(fn=predict_diabetes, inputs=[pregnancies, glucose, blood_pressure, skin_thickness, insulin, bmi, dpf, age], outputs=output_label) # **Section Clustering** gr.Markdown("### Visualisation des Clusters des Réactions en Ligne") # Calculate unique clusters after PCA and prediction unique_clusters = pca_df['Cluster'].unique() cluster_selector = gr.Dropdown(["Tous"] + [str(i) for i in unique_clusters], label="Sélectionner un cluster") cluster_plot = gr.Plot() cluster_selector.change(fn=plot_clusters, inputs=[cluster_selector], outputs=[cluster_plot]) # Téléchargement des clusters download_button = gr.Button("Télécharger les clusters") download_button.click(fn=download_clusters, outputs=gr.File()) app.launch()