DocSrvNyk's picture
Update app.py
27202f8
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)