Spaces:
Build error
Build error
| import gradio as gr | |
| import pandas as pd | |
| from xgboost import XGBClassifier | |
| import joblib | |
| # Define the prediction function | |
| def predict_fertility(Age, HO, HH, HM, USG=None, FBS=None, CA125=None, HE4=None): | |
| # Accuracy, sensitivity, specificity, and AUC data for different model patterns | |
| accuracy_data = { | |
| "F0U0C0H0": {"accuracy": 0.538, "sensitivity": 0.355, "specificity": 0.660, "auc": 0.615}, | |
| "F1U0C0H0": {"accuracy": 0.692, "sensitivity": 0.677, "specificity": 0.702, "auc": 0.736}, | |
| "F0U1C0H0": {"accuracy": 0.872, "sensitivity": 0.871, "specificity": 0.872, "auc": 0.949}, | |
| "F1U1C0H0": {"accuracy": 0.885, "sensitivity": 0.903, "specificity": 0.872, "auc": 0.957}, | |
| "F0U0C1H0": {"accuracy": 0.962, "sensitivity": 0.935, "specificity": 0.979, "auc": 0.989}, | |
| "F1U0C1H0": {"accuracy": 0.974, "sensitivity": 0.935, "specificity": 1.000, "auc": 0.994}, | |
| "F0U1C1H0": {"accuracy": 0.974, "sensitivity": 0.968, "specificity": 0.979, "auc": 0.999}, | |
| "F1U1C1H0": {"accuracy": 0.987, "sensitivity": 1.000, "specificity": 0.979, "auc": 0.999}, | |
| "F0U0C0H1": {"accuracy": 0.936, "sensitivity": 0.935, "specificity": 0.936, "auc": 0.984}, | |
| "F1U0C0H1": {"accuracy": 0.949, "sensitivity": 0.935, "specificity": 0.957, "auc": 0.984}, | |
| "F0U1C0H1": {"accuracy": 0.974, "sensitivity": 1.000, "specificity": 0.957, "auc": 0.995}, | |
| "F1U1C0H1": {"accuracy": 0.974, "sensitivity": 1.000, "specificity": 0.957, "auc": 0.996}, | |
| "F0U0C1H1": {"accuracy": 0.987, "sensitivity": 0.968, "specificity": 1.000, "auc": 0.973}, | |
| "F1U0C1H1": {"accuracy": 0.974, "sensitivity": 0.968, "specificity": 0.979, "auc": 0.982}, | |
| "F0U1C1H1": {"accuracy": 0.987, "sensitivity": 1.000, "specificity": 0.979, "auc": 0.994}, | |
| "F1U1C1H1": {"accuracy": 0.987, "sensitivity": 1.000, "specificity": 0.979, "auc": 0.996}, | |
| } | |
| # Convert "Yes" to 1 and "No" to 0 | |
| HO = 1 if HO == "Yes" else 0 | |
| HH = 1 if HH == "Yes" else 0 | |
| HM = 1 if HM == "Yes" else 0 | |
| USG = 1 if USG == "More than 2 findings" else (0 if USG == "No or Singular finding" else -1) | |
| # Create the filename pattern based on provided inputs | |
| fbs_code = "F0" if FBS == -1 else "F1" | |
| usg_code = "U0" if USG == -1 else "U1" | |
| ca125_code = "C0" if CA125 == -1 else "C1" | |
| he4_code = "H0" if HE4 == -1 else "H1" | |
| filename_pattern = f"{fbs_code}{usg_code}{ca125_code}{he4_code}" | |
| print(f"Model Filename Pattern: {filename_pattern}") # Debug line | |
| # Load the corresponding model | |
| model_path = f"model_caova_{filename_pattern}_.joblib" | |
| print(f"Full Model Filename: {model_path}") # Debug line | |
| try: | |
| loaded_model = joblib.load(model_path) | |
| except FileNotFoundError: | |
| return "Model not found" | |
| # Prepare input data based on the available features in the filename pattern | |
| input_data = { | |
| 'Age': [Age], | |
| 'HO': [HO], | |
| 'HH': [HH], | |
| 'HM': [HM] | |
| } | |
| if FBS != -1: | |
| input_data['FBS'] = [FBS] | |
| if USG != -1: | |
| input_data['USG'] = [USG] | |
| if CA125 != -1: | |
| input_data['CA125'] = [CA125] | |
| if HE4 != -1: | |
| input_data['HE4'] = [HE4] | |
| input_df = pd.DataFrame(input_data) | |
| prediction = loaded_model.predict_proba(input_df)[0][1] # Probability of being malignant | |
| risk_score = (prediction - 0.5) * 2 # Scaled risk score from -1 (benign) to +1 (malignant) | |
| result_text = f"Based on the ({filename_pattern}) sub-model estimated risk score ({risk_score:.2f}), the probability of the mass is inclined towards " | |
| if risk_score < 0: | |
| result_text += "benign." | |
| else: | |
| result_text += "malignant." | |
| result_text += ( | |
| f"\n\nThe sub-model ({filename_pattern}) has an accuracy of {accuracy_data[filename_pattern]['accuracy']:.2f}, " | |
| f"a sensitivity of {accuracy_data[filename_pattern]['sensitivity']:.2f}, a specificity of {accuracy_data[filename_pattern]['specificity']:.2f}, " | |
| f"and an AUC of {accuracy_data[filename_pattern]['auc']:.2f}.") | |
| return result_text | |
| # Create the Gradio interface | |
| iface = gr.Interface( | |
| fn=predict_fertility, | |
| title="Ovarian Cancer Prediction FUCH Model", | |
| inputs=[ | |
| gr.inputs.Number(label="Age (in years)"), | |
| gr.inputs.Radio(label="History of OCP use", choices=[("Yes"), ("No")]), | |
| gr.inputs.Radio(label="History of HRT use", choices=[("Yes"), ("No")]), | |
| gr.inputs.Radio(label="History of Miscarriage", choices=[("Yes"), ("No")]), | |
| gr.inputs.Radio(label="USG findings", choices=[("No or Singular finding"), ("More than 2 findings"),("Exclude")]), | |
| gr.inputs.Number(label="FBS", default=-1), | |
| gr.inputs.Number(label="CA125", default=-1), | |
| gr.inputs.Number(label="HE4", default=-1) | |
| ], | |
| outputs=gr.outputs.Textbox(label="Prediction") | |
| ) | |
| # Launch the interface | |
| iface.launch(inbrowser=True) | |