arittrabag's picture
Update app.py
0459e6f verified
import gradio as gr
import pandas as pd
import joblib
# Load the trained models
xgb_model_depression = joblib.load('xgb_model_depression.pkl')
xgb_model_anxiety = joblib.load('xgb_model_anxiety.pkl')
# Depression and Anxiety Severity Class Mappings
depression_classes = {
0: "No Depression",
1: "Mild Depression",
2: "Moderate Depression",
3: "Severe Depression",
4: "Very Severe Depression",
5: "Extreme Depression"
}
anxiety_classes = {
0: "No Anxiety",
1: "Mild Anxiety",
2: "Moderate Anxiety",
3: "Severe Anxiety",
4: "Extreme Anxiety"
}
# Prediction functions
def predict_depression_severity(age, gender, bmi, who_bmi, phq_score, depressiveness, suicidal, depression_diagnosis, depression_treatment, gad_score, anxiousness, anxiety_diagnosis, anxiety_treatment, epworth_score, sleepiness):
# Convert categorical values to numeric
gender = 0 if gender == "Male" else 1
suicidal = int(suicidal) # Convert to int (0 or 1)
depression_diagnosis = int(depression_diagnosis) # Convert to int (0 or 1)
depression_treatment = int(depression_treatment) # Convert to int (0 or 1)
anxiety_diagnosis = int(anxiety_diagnosis) # Convert to int (0 or 1)
anxiety_treatment = int(anxiety_treatment) # Convert to int (0 or 1)
sleepiness = int(sleepiness) # Convert to int (0 or 1)
input_data = {
'age': age,
'gender': gender,
'bmi': bmi,
'who_bmi': who_bmi,
'phq_score': phq_score,
'depressiveness': depressiveness,
'suicidal': suicidal,
'depression_diagnosis': depression_diagnosis,
'depression_treatment': depression_treatment,
'gad_score': gad_score,
'anxiousness': anxiousness,
'anxiety_diagnosis': anxiety_diagnosis,
'anxiety_treatment': anxiety_treatment,
'epworth_score': epworth_score,
'sleepiness': sleepiness
}
# Ensure the input is a DataFrame
input_df = pd.DataFrame([input_data])
prediction = xgb_model_depression.predict(input_df)
# Map prediction to readable class
return depression_classes[prediction[0]]
def predict_anxiety_severity(age, gender, bmi, who_bmi, phq_score, depressiveness, suicidal, depression_diagnosis, depression_treatment, gad_score, anxiousness, anxiety_diagnosis, anxiety_treatment, epworth_score, sleepiness):
# Convert categorical values to numeric
gender = 0 if gender == "Male" else 1
suicidal = int(suicidal) # Convert to int (0 or 1)
depression_diagnosis = int(depression_diagnosis) # Convert to int (0 or 1)
depression_treatment = int(depression_treatment) # Convert to int (0 or 1)
anxiety_diagnosis = int(anxiety_diagnosis) # Convert to int (0 or 1)
anxiety_treatment = int(anxiety_treatment) # Convert to int (0 or 1)
sleepiness = int(sleepiness) # Convert to int (0 or 1)
input_data = {
'age': age,
'gender': gender,
'bmi': bmi,
'who_bmi': who_bmi,
'phq_score': phq_score,
'depressiveness': depressiveness,
'suicidal': suicidal,
'depression_diagnosis': depression_diagnosis,
'depression_treatment': depression_treatment,
'gad_score': gad_score,
'anxiousness': anxiousness,
'anxiety_diagnosis': anxiety_diagnosis,
'anxiety_treatment': anxiety_treatment,
'epworth_score': epworth_score,
'sleepiness': sleepiness
}
# Ensure the input is a DataFrame
input_df = pd.DataFrame([input_data])
prediction = xgb_model_anxiety.predict(input_df)
# Map prediction to readable class
return anxiety_classes[prediction[0]]
# Wrapper function to call both predictions
def predict_both(age, gender, bmi, who_bmi, phq_score, depressiveness, suicidal, depression_diagnosis, depression_treatment, gad_score, anxiousness, anxiety_diagnosis, anxiety_treatment, epworth_score, sleepiness):
depression_prediction = predict_depression_severity(age, gender, bmi, who_bmi, phq_score, depressiveness, suicidal, depression_diagnosis, depression_treatment, gad_score, anxiousness, anxiety_diagnosis, anxiety_treatment, epworth_score, sleepiness)
anxiety_prediction = predict_anxiety_severity(age, gender, bmi, who_bmi, phq_score, depressiveness, suicidal, depression_diagnosis, depression_treatment, gad_score, anxiousness, anxiety_diagnosis, anxiety_treatment, epworth_score, sleepiness)
return depression_prediction, anxiety_prediction
# Gradio interface setup
inputs = [
gr.Number(label="Age (in years)", info="Enter your age."),
gr.Radio(["Male", "Female"], label="Gender", info="Select your gender."),
gr.Number(label="BMI", info="Enter your BMI value."),
gr.Number(label="WHO BMI Classification", info="Enter your WHO BMI classification (0: Underweight, 1: Normal, 2: Overweight, 3: Obese)."),
gr.Number(label="PHQ Score", info="Enter your PHQ-9 score for depression (0-27)."),
gr.Number(label="Depressiveness", info="Enter your level of depressiveness (0-1)."),
gr.Radio([0, 1], label="Suicidal", info="Indicate if you've experienced suicidal thoughts (0: No, 1: Yes)."),
gr.Radio([0, 1], label="Depression Diagnosis", info="Indicate if you've been diagnosed with depression (0: No, 1: Yes)."),
gr.Radio([0, 1], label="Depression Treatment", info="Indicate if you're receiving treatment for depression (0: No, 1: Yes)."),
gr.Number(label="GAD Score", info="Enter your GAD-7 score for anxiety (0-21)."),
gr.Number(label="Anxiousness", info="Enter your level of anxiousness (0-1)."),
gr.Radio([0, 1], label="Anxiety Diagnosis", info="Indicate if you've been diagnosed with anxiety (0: No, 1: Yes)."),
gr.Radio([0, 1], label="Anxiety Treatment", info="Indicate if you're receiving treatment for anxiety (0: No, 1: Yes)."),
gr.Number(label="Epworth Score", info="Enter your Epworth Sleepiness Scale score (0-24)."),
gr.Number(label="Sleepiness", info="Enter your sleepiness score (0-1).")
]
outputs = [
gr.Textbox(label="Predicted Depression Severity", info="The predicted severity of your depression."),
gr.Textbox(label="Predicted Anxiety Severity", info="The predicted severity of your anxiety.")
]
# Creating the interface with a submit button
interface = gr.Interface(
fn=predict_both,
inputs=inputs,
outputs=outputs,
title="Mental Health Severity Prediction",
description="This app predicts the severity of depression and anxiety based on various inputs related to mental health. Please fill in the fields below and click submit to get predictions.",
live=False, # Set to False to ensure predictions are only made after submit
allow_flagging="never", # Prevent users from flagging the results
)
# Launch the app
interface.launch()