File size: 3,372 Bytes
6035bd4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import streamlit as st
import pandas as pd
import pickle
import lime
import lime.lime_tabular
import streamlit.components.v1 as components

# Load your trained model
with open('model.pkl', 'rb') as file:
    model = pickle.load(file)

obesity_mapping = {
    0: 'Normal',
    1: 'Surpoid/Obése'
}
# Define the input features for the user to input
def user_input_features():
    age = st.number_input('Age:',min_value=8, max_value=100, value=24, step=1, format="%d")    
    classe = st.radio('Classe_', ('Primaire','Secondaire'))
    Zone = st.radio('zone', ('Rurale', 'Urbaine'))
    Diversité  = st.radio('Consumption of food between meals (CAEC)', ('Mauvaise', 'Bonne'))
    Region = st.selectbox(
        'Region de  ', 
        ('Nord_ouest' ,'Sud_ouest', '1Ouest')
    )
    Sexe = st.radio('Genre', ('F', 'M'))


    Zone = 1 if Zone == 'Rurale' else 0
    classe = 1 if classe == 'Primaire' else 0
    Diversité = 1 if Diversité == 'Mauvaise' else 0
    Region = ['Nord_ouest' ,'Sud_ouest', '1Ouest'].index(Region)

    sex_f = 1 if Sexe == 'F' else 0
    sex_m = 1 if Sexe == 'M' else 0

    data = {
        'Region': Region,
        'Zone': Zone,
        'Classe': classe,
        'Age': age,
        'Diversité': Diversité,
        'Genre_F': sex_f,
        'Genre_M': sex_m
    }
    features = pd.DataFrame(data, index=[0])
    return features

st.title('Obesity  App')

# Display the input fields
input_df = user_input_features()

# Initialiser LIME
explainer = lime.lime_tabular.LimeTabularExplainer(
    training_data=input_df.values,  # Entraînement sur la base des données d'entrée
    feature_names=input_df.columns, 
    class_names=[obesity_mapping[0], obesity_mapping[1]], 
    mode='classification'
)

# Predict button
if st.button('Predict'):
    # Make a prediction
    prediction = model.predict(input_df)
    prediction_proba = model.predict_proba(input_df)[0]

    data = {
        'Obesity Type': [obesity_mapping[i] for i in range(len(prediction_proba))],
        'Probability': prediction_proba
    }

    # Create a dataframe to display the results
    result_df = pd.DataFrame(data)

    # Transpose the dataframe to have obesity types as columns and add a row header
    result_df = result_df.T
    result_df.columns = result_df.iloc[0]
    result_df = result_df.drop(result_df.index[0])
    result_df.index = ['Probability']

    # Display the results in a table with proper formatting
    st.table(result_df.style.format("{:.4f}"))
    # Générer l'explication LIME pour l'individu
    # exp = explainer.explain_instance(input_df.values[0], model.predict_proba, num_features=5)

    # # Afficher les explications dans Streamlit
    # st.subheader('Explication LIME')
    # exp.show_in_notebook(show_table=True, show_all=False)
    # st.write(exp.as_list())
     # Générer l'explication LIME pour l'individu
    exp = explainer.explain_instance(input_df.values[0], model.predict_proba, num_features=4)

    # Récupérer l'explication LIME sous forme HTML
    explanation_html = exp.as_html()

    # Afficher l'explication LIME dans Streamlit
    st.subheader('Explication LIME')
    
    # Utiliser Streamlit pour afficher du HTML
    components.html(explanation_html, height=800)  # Ajuster la hauteur selon le contenu