Commit ·
8aa976d
1
Parent(s): d569d9e
Create app.py
Browse files
app.py
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import gradio as gr
|
| 2 |
+
import joblib
|
| 3 |
+
import pandas as pd
|
| 4 |
+
import numpy as np
|
| 5 |
+
import pickle
|
| 6 |
+
import tensorflow as tf
|
| 7 |
+
|
| 8 |
+
# Load the saved models
|
| 9 |
+
best_models = [
|
| 10 |
+
("Linear Regression", joblib.load('best_Linear_Regression_model.pkl')),
|
| 11 |
+
("Random Forest", joblib.load('best_Random_Forest_model.pkl')),
|
| 12 |
+
("Ridge Regression", joblib.load('best_Ridge_Regression_model.pkl')),
|
| 13 |
+
("Decision Tree", joblib.load('best_Decision_Tree_model.pkl')),
|
| 14 |
+
("MLP", tf.keras.models.load_model('best_mlp_model.h5')),
|
| 15 |
+
]
|
| 16 |
+
|
| 17 |
+
# Load the saved scaler, PCA, and target scaler
|
| 18 |
+
scaler = joblib.load('scaler.pkl')
|
| 19 |
+
pca = joblib.load('pca.pkl')
|
| 20 |
+
#----------------------------------------
|
| 21 |
+
#with open("target_scaler.pkl", "rb") as f:
|
| 22 |
+
# target_scaler = pickle.load(f)
|
| 23 |
+
#--------------------------------------- uncomment this statement to get scaled predidcted values
|
| 24 |
+
|
| 25 |
+
|
| 26 |
+
attribute_names = [
|
| 27 |
+
'Age', 'Height', 'Weight', 'Diabetes', 'Simvastatin', 'Amiodarone',
|
| 28 |
+
'INR', 'Gender', 'Race', 'VKORC1_genotype'
|
| 29 |
+
]
|
| 30 |
+
|
| 31 |
+
race_columns = [
|
| 32 |
+
'Race_Asian', 'Race_Black', 'Race_Black African', 'Race_Black Caribbean',
|
| 33 |
+
'Race_Black or African American', 'Race_Black other', 'Race_Caucasian',
|
| 34 |
+
'Race_Chinese', 'Race_Han Chinese', 'Race_Hispanic', 'Race_Indian',
|
| 35 |
+
'Race_Intermediate', 'Race_Japanese', 'Race_Korean', 'Race_Malay',
|
| 36 |
+
'Race_Other', 'Race_Other (Black British)', 'Race_Other (Hungarian)',
|
| 37 |
+
'Race_Other Mixed Race', 'Race_White', 'Race_other'
|
| 38 |
+
]
|
| 39 |
+
|
| 40 |
+
def predict(*args):
|
| 41 |
+
user_features = list(args[:-1])
|
| 42 |
+
model_name = args[-1]
|
| 43 |
+
model = dict(best_models)[model_name]
|
| 44 |
+
|
| 45 |
+
# Mapping categorical inputs to numerical values
|
| 46 |
+
user_features[3] = 1 if user_features[3] == 'Yes' else 0 # Diabetes
|
| 47 |
+
user_features[4] = 1 if user_features[4] == 'Yes' else 0 # Simvastatin
|
| 48 |
+
user_features[5] = 1 if user_features[5] == 'Yes' else 0 # Amiodarone
|
| 49 |
+
user_features[7] = 1 if user_features[7] == 'Male' else 0 # Gender
|
| 50 |
+
|
| 51 |
+
# Handling one-hot encoding for 'Race'
|
| 52 |
+
race = user_features.pop(8)
|
| 53 |
+
race_encoded = [1 if col == race else 0 for col in race_columns]
|
| 54 |
+
user_features = user_features[:8] + race_encoded + user_features[8:]
|
| 55 |
+
|
| 56 |
+
# Handling one-hot encoding for 'VKORC1_genotype'
|
| 57 |
+
vkorc1_genotype = user_features.pop(-1)
|
| 58 |
+
vkorc1_genotype_encoded = [1 if vkorc1_genotype == 'A/G' else 0, 1 if vkorc1_genotype == 'G/G' else 0]
|
| 59 |
+
user_features += vkorc1_genotype_encoded
|
| 60 |
+
|
| 61 |
+
input_data = np.array(user_features).reshape(1, -1)
|
| 62 |
+
input_data_scaled = scaler.transform(input_data)
|
| 63 |
+
input_data_pca = pca.transform(input_data_scaled)
|
| 64 |
+
|
| 65 |
+
print("Input data PCA:", input_data_pca) # Add this print statement
|
| 66 |
+
|
| 67 |
+
|
| 68 |
+
if model_name == "MLP":
|
| 69 |
+
prediction = model.predict(input_data_pca).reshape(-1)
|
| 70 |
+
else:
|
| 71 |
+
prediction = model.predict(input_data_pca)
|
| 72 |
+
|
| 73 |
+
#print("Raw prediction:", prediction) # Add this print statement just check this line to debug whether it is giving correct prediction or not
|
| 74 |
+
#------------------------------------------------------------------------
|
| 75 |
+
# Inverse transform the prediction
|
| 76 |
+
#prediction_rescaled = target_scaler.inverse_transform(prediction.reshape(-1, 1))[0][0]
|
| 77 |
+
|
| 78 |
+
# return {"Predicted Value": (prediction)}
|
| 79 |
+
|
| 80 |
+
# prediction_rescaled = target_scaler.inverse_transform(prediction.reshape(-1, 1))[0][0]
|
| 81 |
+
# print("Prediction rescaled:", prediction_rescaled)
|
| 82 |
+
# return {"Therapeutic Dosage": f"{prediction_rescaled:.2f} mg"}
|
| 83 |
+
#----------------------------------------------------------------------------------------------- the above staments used for practice on how it will work on rescaled prediction values
|
| 84 |
+
return {"Therapeutic Dosage": f"{prediction[0]:.2f} mg"}
|
| 85 |
+
|
| 86 |
+
|
| 87 |
+
#previously it return function was not float I changed it because FastAPI can't serialize the NumPy float32 object to JSON
|
| 88 |
+
#I added float(prediction[0]) to convert the NumPy float32 value to a Python float.prediction_rescaled
|
| 89 |
+
|
| 90 |
+
|
| 91 |
+
# List of model names for the dropdown menu
|
| 92 |
+
model_names = [name for name, _ in best_models]
|
| 93 |
+
|
| 94 |
+
# Define inputs
|
| 95 |
+
age = gr.inputs.Slider(minimum=10, maximum=90, label='Age')
|
| 96 |
+
height = gr.inputs.Slider(minimum=124.968, maximum=202.0, label='Height')
|
| 97 |
+
weight = gr.inputs.Slider(minimum=30.0, maximum=237.7, label='Weight')
|
| 98 |
+
diabetes = gr.inputs.Dropdown(choices=['Yes', 'No'], label='Diabetes')
|
| 99 |
+
simvastatin = gr.inputs.Dropdown(choices=['Yes', 'No'], label='Simvastatin')
|
| 100 |
+
amiodarone = gr.inputs.Dropdown(choices=['Yes', 'No'], label='Amiodarone')
|
| 101 |
+
inr = gr.inputs.Slider(minimum=0.8, maximum=6.1, label='INR')
|
| 102 |
+
gender = gr.inputs.Dropdown(choices=['Male', 'Female'], label='Gender')
|
| 103 |
+
race = gr.inputs.Dropdown(choices=[
|
| 104 |
+
'Asian', 'Black', 'Black African',
|
| 105 |
+
'Black Caribbean', 'Black or African American',
|
| 106 |
+
'Black other', 'Caucasian', 'Chinese',
|
| 107 |
+
'Han Chinese', 'Hispanic', 'Indian', 'Intermediate',
|
| 108 |
+
'Japanese', 'Korean', 'Malay', 'Other',
|
| 109 |
+
'Other (Black British)', 'Other (Hungarian)',
|
| 110 |
+
'Other Mixed Race', 'White', 'other'
|
| 111 |
+
], label='Race')
|
| 112 |
+
vkorc1_genotype = gr.inputs.Dropdown(choices=['A/G', 'G/G'], label='VKORC1_genotype')
|
| 113 |
+
model_name = gr.inputs.Dropdown(choices=model_names, label="Model")
|
| 114 |
+
|
| 115 |
+
# Define output
|
| 116 |
+
output = gr.outputs.Textbox(label="Therapeutic Dosage")
|
| 117 |
+
|
| 118 |
+
# Create the Gradio interface
|
| 119 |
+
iface = gr.Interface(
|
| 120 |
+
fn=predict,
|
| 121 |
+
inputs=[
|
| 122 |
+
age, height, weight, diabetes, simvastatin, amiodarone,
|
| 123 |
+
inr, gender, race, vkorc1_genotype, model_name
|
| 124 |
+
],
|
| 125 |
+
outputs=output ,title="Machine Learning Model",
|
| 126 |
+
description="Select a model and enter user features to predict the therapeutic dose.",
|
| 127 |
+
).launch(debug=True)
|
| 128 |
+
|
| 129 |
+
|