Spaces:
Sleeping
Sleeping
import streamlit as st | |
import pandas as pd | |
import numpy as np | |
import matplotlib.pyplot as plt | |
from sklearn.tree import plot_tree, export_text | |
import seaborn as sns | |
from sklearn.preprocessing import LabelEncoder | |
def load_model_and_data(): | |
# Ici vous chargeriez votre modèle et données | |
# Pour l'exemple, on suppose qu'ils sont disponibles comme: | |
# model = loaded_model | |
# X = loaded_X | |
# y = loaded_y | |
# feature_names = X.columns | |
pass | |
def app(): | |
st.title("Interpréteur d'Arbre de Décision") | |
# Sidebar pour les contrôles | |
st.sidebar.header("Paramètres d'analyse") | |
# Section 1: Vue globale du modèle | |
st.header("1. Vue globale du modèle") | |
col1, col2 = st.columns(2) | |
with col1: | |
st.subheader("Importance des caractéristiques") | |
importance_plot = plt.figure(figsize=(10, 6)) | |
# Remplacer par vos features et leurs importances | |
feature_importance = pd.DataFrame({ | |
'feature': feature_names, | |
'importance': model.feature_importances_ | |
}).sort_values('importance', ascending=True) | |
plt.barh(feature_importance['feature'], feature_importance['importance']) | |
st.pyplot(importance_plot) | |
with col2: | |
st.subheader("Statistiques du modèle") | |
st.write(f"Profondeur de l'arbre: {model.get_depth()}") | |
st.write(f"Nombre de feuilles: {model.get_n_leaves()}") | |
# Section 2: Explorateur de règles | |
st.header("2. Explorateur de règles de décision") | |
max_depth = st.slider("Profondeur maximale à afficher", 1, model.get_depth(), 3) | |
tree_text = export_text(model, feature_names=list(feature_names), max_depth=max_depth) | |
st.text(tree_text) | |
# Section 3: Analyse de cohortes | |
st.header("3. Analyse de cohortes") | |
# Sélection des caractéristiques pour définir les cohortes | |
selected_features = st.multiselect( | |
"Sélectionnez les caractéristiques pour définir les cohortes", | |
feature_names, | |
max_selections=2 | |
) | |
if len(selected_features) > 0: | |
# Création des cohortes basées sur les caractéristiques sélectionnées | |
def create_cohorts(X, features): | |
cohort_def = X[features].copy() | |
for feat in features: | |
if X[feat].dtype == 'object' or len(X[feat].unique()) < 10: | |
cohort_def[feat] = X[feat] | |
else: | |
cohort_def[feat] = pd.qcut(X[feat], q=4, labels=['Q1', 'Q2', 'Q3', 'Q4']) | |
return cohort_def.apply(lambda x: ' & '.join(x.astype(str)), axis=1) | |
cohorts = create_cohorts(X, selected_features) | |
# Analyse des prédictions par cohorte | |
cohort_analysis = pd.DataFrame({ | |
'Cohorte': cohorts, | |
'Prédiction': model.predict(X) | |
}) | |
cohort_stats = cohort_analysis.groupby('Cohorte')['Prédiction'].agg(['count', 'mean']) | |
cohort_stats.columns = ['Nombre d\'observations', 'Taux de prédiction positive'] | |
st.write("Statistiques par cohorte:") | |
st.dataframe(cohort_stats) | |
# Visualisation des cohortes | |
cohort_viz = plt.figure(figsize=(10, 6)) | |
sns.barplot(data=cohort_analysis, x='Cohorte', y='Prédiction') | |
plt.xticks(rotation=45) | |
st.pyplot(cohort_viz) | |
# Section 4: Simulateur de prédictions | |
st.header("4. Simulateur de prédictions") | |
# Interface pour entrer des valeurs | |
input_values = {} | |
for feature in feature_names: | |
if X[feature].dtype == 'object': | |
input_values[feature] = st.selectbox( | |
f"Sélectionnez {feature}", | |
options=X[feature].unique() | |
) | |
else: | |
input_values[feature] = st.slider( | |
f"Valeur pour {feature}", | |
float(X[feature].min()), | |
float(X[feature].max()), | |
float(X[feature].mean()) | |
) | |
if st.button("Prédire"): | |
# Création du DataFrame pour la prédiction | |
input_df = pd.DataFrame([input_values]) | |
# Prédiction | |
prediction = model.predict_proba(input_df) | |
# Affichage du résultat | |
st.write("Probabilités prédites:") | |
st.write({f"Classe {i}": f"{prob:.2%}" for i, prob in enumerate(prediction[0])}) | |
# Chemin de décision pour cette prédiction | |
st.subheader("Chemin de décision") | |
node_indicator = model.decision_path(input_df) | |
leaf_id = model.apply(input_df) | |
feature_names = list(feature_names) | |
node_index = node_indicator.indices[node_indicator.indptr[0]:node_indicator.indptr[1]] | |
rules = [] | |
for node_id in node_index: | |
if node_id != leaf_id[0]: | |
threshold = model.tree_.threshold[node_id] | |
feature = feature_names[model.tree_.feature[node_id]] | |
if input_df.iloc[0][feature] <= threshold: | |
rules.append(f"{feature} ≤ {threshold:.2f}") | |
else: | |
rules.append(f"{feature} > {threshold:.2f}") | |
for rule in rules: | |
st.write(rule) | |
if __name__ == "__main__": | |
app() |