File size: 10,060 Bytes
f9a8132 25a63b5 f9a8132 25a63b5 f9a8132 25a63b5 f9a8132 25a63b5 f9a8132 |
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 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 |
import gradio as gr
import pickle
import numpy as np
import pandas as pd
class ModelPredictor:
def __init__(self, model_path, model_filenames):
self.model_path = model_path
self.model_filenames = model_filenames
self.models = self.load_models()
self.prediction_map = {
'YOWRDISC': ["Did not feel discouraged about life every day", "Felt discouraged about life every day"],
'YO_MDEA3': ["Does not have changes in appetite or weight", "Has changes in appetite or weight"],
'YOPB2WK': ["Did not feel this way for 2 weeks or more with other problems during the past 12 months", "Felt this way for 2 weeks or more with other problems during the past 12 months"],
'YOWRDCSN': ["Able to make decisions when problems were worst", "Unable to make decisions when problems were worst"],
'YODPDISC': ["Did not feel discouraged about life when sad/empty/depressed", "Felt discouraged about life when sad/empty/depressed"],
'YOWRELES': ["Did not eat less than usual every day when problems were worst", "Ate less than usual every day when problems were worst"],
'YORX12MO': ["Not currently receiving treatment/counseling for mood", "Currently receiving treatment/counseling for mood"],
'YODPLSIN': ["Did not lose interest in things when sad/empty/depressed", "Lost interest in things when sad/empty/depressed"],
'YODSCEV': ["Never had a period of time where felt discouraged or hopeless", "Ever had a period of time where felt discouraged or hopeless"],
'YO_MDEA8': ["Ability to concentrate or make decisions", "Inability to concentrate or make decisions"],
'YOWRHRS': ["Time that most severe/frequent mood lasted less than 1 hour", "Time that most severe/frequent mood lasted at least 1 hour but no more than 3 hours", "Time that most severe/frequent mood lasted at least 3 hours but no more than 5 hours"],
'YOWRIMP': ["Mood so severe couldn't do daily activities not very often", "Mood so severe couldn't do daily activities sometimes", "Mood so severe couldn't do daily activities often"],
'YO_MDEA2': ["Did not lose interest or pleasure in most things", "Lost interest or pleasure in most things"],
'YODPPROB': ["Never had other problems during 2 weeks or longer", "Ever had other problems during 2 weeks or longer"],
'YOWRPROB': ["No particular time that is the worst one ever", "One particular time that is the worst one ever"],
'YOLOSEV': ["Never had a period of time lost interest in enjoyable things", "Ever had a period of time lost interest in enjoyable things"],
'YO_MDEA5': ["Others did not notice that was restless or lethargic", "Others noticed that was restless or lethargic"],
'YODSMMDE': ["Has less than 5 symptoms", "Has 5 or more symptoms"],
'YODPR2WK': ["No time when feelings lasted every day for 2 weeks or longer", "Time when feelings lasted every day for 2 weeks or longer"]
}
def load_models(self):
models = []
for filename in self.model_filenames:
filepath = self.model_path + filename
with open(filepath, 'rb') as file:
model = pickle.load(file)
models.append(model)
return models
def make_predictions(self, user_input):
predictions = []
for model in self.models:
pred = model.predict(user_input)
pred = np.array(pred).flatten()
predictions.append(pred)
return predictions
def get_majority_vote(self, predictions):
combined_predictions = np.concatenate(predictions)
majority_vote = np.bincount(combined_predictions).argmax()
return majority_vote
def evaluate_severity(self, majority_vote_count):
if majority_vote_count > 10:
return "Mental health severity: Severe"
elif majority_vote_count > 7:
return "Mental health severity: Moderate"
elif majority_vote_count > 4:
return "Mental health severity: Low"
else:
return "Mental health severity: Very Low"
model_filenames = [
"YOWRDISC.pkl", "YO_MDEA3.pkl", "YOPB2WK.pkl", "YOWRDCSN.pkl", "YODPDISC.pkl",
"YOWRELES.pkl", "YORX12MO.pkl", "YODPLSIN.pkl", "YOWRIMP.pkl", "YODPPROB.pkl",
"YOWRPROB.pkl", "YOLOSEV.pkl", "YO_MDEA5.pkl", "YODSMMDE.pkl", "YODPR2WK.pkl"
]
model_path = "models/"
predictor = ModelPredictor(model_path, model_filenames)
def predict(YNURSMDE, YMDEYR, YSOCMDE, YUCOSUITHK, YMDESUD5ANYO, YMSUD5YANY, YUSUITHK, YMDETXRX, YUSUITHKYR, YMDERSUD5ANY, YUSUIPLNYR, YCOUNMDE, YPSY1MDE, YHLTMDE, YDOCMDE, YPSY2MDE, YMDEHARX, LVLDIFMEM2, MDEIMPY, YMDEHPO, CONEGMH, COCLNEGMH, YMIMS5YANY, YMDEIMAD5YR, YMIUD5YANY, YUCOSUIPLN, YMDEHPRX, YMIMI5YANY, YUSUIPLN, YTXMDEYR, YMDEAUD5YR, YRXMDEYR, YMDELT):
user_input_data = {
'YNURSMDE': [int(YNURSMDE)],
'YMDEYR': [int(YMDEYR)],
'YSOCMDE': [int(YSOCMDE)],
'YUCOSUITHK': [int(YUCOSUITHK)],
'YMDESUD5ANYO': [int(YMDESUD5ANYO)],
'YMSUD5YANY': [int(YMSUD5YANY)],
'YUSUITHK': [int(YUSUITHK)],
'YMDETXRX': [int(YMDETXRX)],
'YUSUITHKYR': [int(YUSUITHKYR)],
'YMDERSUD5ANY': [int(YMDERSUD5ANY)],
'YUSUIPLNYR': [int(YUSUIPLNYR)],
'YCOUNMDE': [int(YCOUNMDE)],
'YPSY1MDE': [int(YPSY1MDE)],
'YHLTMDE': [int(YHLTMDE)],
'YDOCMDE': [int(YDOCMDE)],
'YPSY2MDE': [int(YPSY2MDE)],
'YMDEHARX': [int(YMDEHARX)],
'LVLDIFMEM2': [int(LVLDIFMEM2)],
'MDEIMPY': [int(MDEIMPY)],
'YMDEHPO': [int(YMDEHPO)],
'CONEGMH': [int(CONEGMH)],
'COCLNEGMH': [int(COCLNEGMH)],
'YMIMS5YANY': [int(YMIMS5YANY)],
'YMDEIMAD5YR': [int(YMDEIMAD5YR)],
'YMIUD5YANY': [int(YMIUD5YANY)],
'YUCOSUIPLN': [int(YUCOSUIPLN)],
'YMDEHPRX': [int(YMDEHPRX)],
'YMIMI5YANY': [int(YMIMI5YANY)],
'YUSUIPLN': [int(YUSUIPLN)],
'YTXMDEYR': [int(YTXMDEYR)],
'YMDEAUD5YR': [int(YMDEAUD5YR)],
'YRXMDEYR': [int(YRXMDEYR)],
'YMDELT': [int(YMDELT)]
}
user_input = pd.DataFrame(user_input_data)
predictions = predictor.make_predictions(user_input)
majority_vote = predictor.get_majority_vote(predictions)
majority_vote_count = sum([1 for pred in np.concatenate(predictions) if pred == 1])
severity = predictor.evaluate_severity(majority_vote_count)
results = []
for i, pred in enumerate(predictions):
model_name = model_filenames[i].split('.')[0]
pred_value = pred[0]
if model_name in predictor.prediction_map:
if pred_value < len(predictor.prediction_map[model_name]):
results.append(f"Prediction from model {model_name}: {predictor.prediction_map[model_name][pred_value]}")
else:
results.append(f"Prediction from model {model_name}: Unknown prediction value {pred_value}")
else:
results.append(f"Prediction from model {model_name}: Unknown model")
return results, severity
inputs = [
gr.Dropdown(["1", "0"], label="YNURSMDE (1 = Yes, 0 = No)"),
gr.Dropdown(["1", "2"], label="YMDEYR (1 = Yes, 2 = No)"),
gr.Dropdown(["1", "0"], label="YSOCMDE (1 = Yes, 0 = No)"),
gr.Dropdown(["1", "2"], label="YUCOSUITHK (1 = Yes, 2 = No)"),
gr.Dropdown(["1", "2", "3", "4"], label="YMDESUD5ANYO (1 = SUD only, no MDE, 2 = MDE only, no SUD, 3 = SUD and MDE, 4 = Neither SUD or MDE)"),
gr.Dropdown(["1", "0"], label="YMSUD5YANY (1 = Yes, 0 = No)"),
gr.Dropdown(["1", "2", "3", "4"], label="YUSUITHK (1 = Yes, 2 = No, 3 = I'm not sure, 4 = I don't want to answer)"),
gr.Dropdown(["1", "0"], label="YMDETXRX (1 = Yes, 0 = No)"),
gr.Dropdown(["1", "2", "3", "4"], label="YUSUITHKYR (1 = Yes, 2 = No, 3 = I'm not sure, 4 = I don't want to answer)"),
gr.Dropdown(["1", "0"], label="YMDERSUD5ANY (1 = Yes, 0 = No)"),
gr.Dropdown(["1", "2", "3", "4"], label="YUSUIPLNYR (1 = Yes, 2 = No, 3 = I'm not sure, 4 = I don't want to answer)"),
gr.Dropdown(["1", "0"], label="YCOUNMDE (1 = Yes, 0 = No)"),
gr.Dropdown(["1", "0"], label="YPSY1MDE (1 = Yes, 0 = No)"),
gr.Dropdown(["1", "0"], label="YHLTMDE (1 = Yes, 0 = No)"),
gr.Dropdown(["1", "0"], label="YDOCMDE (1 = Yes, 0 = No)"),
gr.Dropdown(["1", "0"], label="YPSY2MDE (1 = Yes, 0 = No)"),
gr.Dropdown(["1", "0"], label="YMDEHARX (1 = Yes, 0 = No)"),
gr.Dropdown(["1", "2", "3"], label="LVLDIFMEM2 (1 = No Difficulty, 2 = Some difficulty, 3 = A lot of difficulty or cannot do at all)"),
gr.Dropdown(["1", "2"], label="MDEIMPY (1 = Yes, 2 = No)"),
gr.Dropdown(["1", "0"], label="YMDEHPO (1 = Yes, 0 = No)"),
gr.Dropdown(["1", "2", "3", "4", "5"], label="CONEGMH (1 = Not at all, 2 = A little, 3 = Some, 4 = Quite a bit, 5 = A lot)"),
gr.Dropdown(["1", "2", "3"], label="COCLNEGMH (1 = Not at all, 2 = A little or some, 3 = Quite a bit or a lot)"),
gr.Dropdown(["1", "0"], label="YMIMS5YANY (1 = Yes, 0 = No)"),
gr.Dropdown(["1", "0"], label="YMDEIMAD5YR (1 = Yes, 0 = No)"),
gr.Dropdown(["1", "0"], label="YMIUD5YANY (1 = Yes, 0 = No)"),
gr.Dropdown(["1", "2"], label="YUCOSUIPLN (1 = Yes, 2 = No)"),
gr.Dropdown(["1", "0"], label="YMDEHPRX (1 = Yes, 0 = No)"),
gr.Dropdown(["1", "0"], label="YMIMI5YANY (1 = Yes, 0 = No)"),
gr.Dropdown(["1", "2", "3", "4"], label="YUSUIPLN (1 = Yes, 2 = No, 3 = I'm not sure, 4 = I don't want to answer)"),
gr.Dropdown(["1", "0"], label="YTXMDEYR (1 = Yes, 0 = No)"),
gr.Dropdown(["1", "0"], label="YMDEAUD5YR (1 = Yes, 0 = No)"),
gr.Dropdown(["1", "0"], label="YRXMDEYR (1 = Yes, 0 = No)"),
gr.Dropdown(["1", "2"], label="YMDELT (1 = Yes, 2 = No)")
]
outputs = [
gr.Textbox(label="Prediction Results"),
gr.Textbox(label="Mental Health Severity")
]
gr.Interface(fn=predict, inputs=inputs, outputs=outputs, title="Adolescent Mental Health Prediction").launch()
|