Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import numpy as np | |
| from joblib import load | |
| from tensorflow.keras.models import load_model | |
| import tensorflow as tf | |
| import pickle | |
| import pandas as pd # Ensure pandas is imported for DataFrame operations | |
| from sklearn.preprocessing import OneHotEncoder | |
| from sklearn.compose import ColumnTransformer | |
| # Load dataset | |
| df = pd.read_csv('processed_data.csv') # Replace with the correct path to your dataset | |
| # Load the LabelEncoder and ColumnTransformer before prediction | |
| with open('label_encoder.pkl', 'rb') as f: | |
| label_encoder = pickle.load(f) | |
| categorical_features = [0, 1, 9, 10] # Update if column positions change | |
| ct = ColumnTransformer( | |
| transformers=[('encoder', OneHotEncoder(sparse_output=False, drop="first"), categorical_features)], | |
| remainder="passthrough" | |
| ) | |
| # Fit it using your training data | |
| ct.fit(df[['Gender', 'Race (Reported)', 'Age', 'Height (cm)', 'Weight (kg)', | |
| 'Diabetes', 'Simvastatin (Zocor)', 'Amiodarone (Cordarone)', | |
| 'INR on Reported Therapeutic Dose of Warfarin', 'Cyp2C9 genotypes', | |
| 'VKORC1 genotype: -1639 G>A (3673); chr16:31015190; rs9923231; C/T']]) | |
| # Assuming 'ct' is your ColumnTransformer (replace this with the actual loading code for your preprocessor) | |
| # Make sure that 'ct' is properly loaded, or use the same transformation logic here. | |
| # UI Components for user input | |
| input_Gender = gr.Radio(["male", "female"], label="Gender") | |
| input_Race = gr.Dropdown(list(dict(df['Race (Reported)'].value_counts()).keys()), label="Race") | |
| input_Age = gr.Dropdown(list(dict(df['Age'].value_counts())), label='Age') | |
| input_Height = gr.Number(label='Height (cm)') | |
| input_Weight = gr.Number(label='Weight (kg)') | |
| input_Diabetes = gr.Radio([0.0, 1.0], label='Diabetes') | |
| input_Simvastatin = gr.Radio([0.0, 1.0], label='Simvastatin (Zocor)') | |
| input_Amiodarone = gr.Radio([0.0, 1.0], label='Amiodarone (Cordarone)') | |
| input_INR_reported = gr.Number(label='INR on Reported Therapeutic Dose of Warfarin') | |
| input_Cyp2C9_genotypes = gr.Dropdown(list(dict(df['Cyp2C9 genotypes'].value_counts())), label='Cyp2C9 genotypes') | |
| input_VKORC1_genotypes = gr.Radio(list(dict(df['VKORC1 genotype: -1639 G>A (3673); chr16:31015190; rs9923231; C/T'].value_counts())), label='VKORC1 genotypes') | |
| input_model = gr.Dropdown(['Decision Tree Regression', 'Support Vector Regression', 'Random Forest Regression', 'Deep Learning'], label='Model Selection') | |
| # Output textbox to display predicted dose | |
| output_warfarin_dosage = gr.Textbox(label='Therapeutic Dose of Warfarin') | |
| # Prediction function with renamed input variables | |
| def predict_dosage(gender, race, age, height, weight, diabetes, simvastatin, amiodarone, inr, cyp2c9, vkorc1, selected_model): | |
| import numpy as np | |
| from joblib import load | |
| from tensorflow.keras.models import load_model | |
| import tensorflow as tf | |
| # Optional debug function to inspect data before prediction | |
| def print_input_debug(transformed_input, final_array): | |
| print("Transformed input shape:", transformed_input.shape) | |
| print("Final input shape:", final_array.shape) | |
| print("Input data type:", final_array.dtype) | |
| try: | |
| # Load the selected model | |
| if selected_model == 'Deep Learning': | |
| model = load_model('best_DeepLearning_model (2).h5') | |
| elif selected_model == 'Support Vector Regression': | |
| model = load('SVR_optimized.joblib') | |
| elif selected_model == 'Random Forest Regression': | |
| model = load('RandomForestRegressor_optimized.joblib') | |
| else: | |
| model = load("DecisionTreeRegressor_optimized.joblib") | |
| # Handle unseen labels by attempting to map them to known labels | |
| def safe_transform_label(encoder, label, default=None): | |
| try: | |
| return encoder.transform([label])[0] | |
| except ValueError: | |
| # If label is unseen, return default (e.g., most frequent label or a fallback value) | |
| return default if default is not None else encoder.transform([encoder.classes_[0]])[0] | |
| # Encode Age using LabelEncoder (catching unseen labels) | |
| encoded_age = safe_transform_label(label_encoder, age, default=label_encoder.classes_[0]) | |
| # Ensure numerical inputs are valid floats | |
| height = float(height) if height is not None else 0.0 | |
| weight = float(weight) if weight is not None else 0.0 | |
| inr = float(inr) if inr is not None else 0.0 | |
| # Assemble input for transformation | |
| raw_inputs = [ | |
| str(gender), | |
| str(race), | |
| str(age), | |
| height, | |
| weight, | |
| float(diabetes), | |
| float(simvastatin), | |
| float(amiodarone), | |
| inr, | |
| str(cyp2c9), | |
| str(vkorc1) | |
| ] | |
| # Apply preprocessing pipeline (ct should be defined or loaded) | |
| transformed_input = ct.transform([raw_inputs]) | |
| transformed_input[0][-7] = encoded_age # Age is encoded, so replace it in the transformed input | |
| # Convert to NumPy array for model input | |
| input_array = np.array(transformed_input, dtype=np.float32) | |
| print_input_debug(transformed_input, input_array) | |
| # Predict using appropriate model type | |
| if selected_model == 'Deep Learning': | |
| tensor_input = tf.convert_to_tensor(input_array) | |
| prediction = model.predict(tensor_input, verbose=0) | |
| return float(prediction[0][0]) | |
| else: | |
| prediction = model.predict(input_array) | |
| return float(prediction[0]) | |
| except Exception as e: | |
| print(f"Error in prediction: {str(e)}") | |
| return f"Error in prediction: {str(e)}" | |
| # Launch Gradio app | |
| gr.Interface( | |
| fn=predict_dosage, | |
| inputs=[input_Gender, input_Race, input_Age, input_Height, input_Weight, | |
| input_Diabetes, input_Simvastatin, input_Amiodarone, | |
| input_INR_reported, input_Cyp2C9_genotypes, input_VKORC1_genotypes, input_model], | |
| outputs=[output_warfarin_dosage] | |
| ).launch(debug=True) | |