Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -43,15 +43,38 @@ for model_name, pickle_file in model_paths.items():
|
|
43 |
print(f"Model file for {model_name} not found.")
|
44 |
|
45 |
def predict_cancer(age, gender, T, N, Focality, Response):
|
46 |
-
|
47 |
-
|
48 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
49 |
gender_val = 0 if gender == "Female" else 1
|
50 |
response_val = int(Response)
|
51 |
T_val = int(T)
|
52 |
N_val = int(N)
|
53 |
Focality_val = int(Focality)
|
54 |
|
|
|
55 |
features = pd.DataFrame({
|
56 |
'Age': [age],
|
57 |
'Gender': [gender_val],
|
@@ -61,6 +84,7 @@ def predict_cancer(age, gender, T, N, Focality, Response):
|
|
61 |
'Response': [response_val]
|
62 |
})
|
63 |
|
|
|
64 |
scaler_file = "model/pjas-thyroid-Scaler.pkl"
|
65 |
if not os.path.exists(scaler_file):
|
66 |
return "π΄ **Error:** Scaler file not found. Please contact the administrator."
|
@@ -68,13 +92,14 @@ def predict_cancer(age, gender, T, N, Focality, Response):
|
|
68 |
scaler = joblib.load(scaler_file)
|
69 |
features[['Age']] = scaler.transform(features[['Age']])
|
70 |
|
|
|
71 |
sorted_model_names = sorted(
|
72 |
model_performance.keys(),
|
73 |
key=lambda m: model_performance[m]['Model Sensitivity'],
|
74 |
reverse=True
|
75 |
)
|
76 |
|
77 |
-
# HTML table
|
78 |
table_header = """
|
79 |
<table>
|
80 |
<thead>
|
@@ -88,9 +113,8 @@ def predict_cancer(age, gender, T, N, Focality, Response):
|
|
88 |
<tbody>
|
89 |
"""
|
90 |
table_rows = []
|
91 |
-
|
92 |
-
|
93 |
-
cannot_recur_emoji = "π’" # "cannot-recur"
|
94 |
|
95 |
for model_name in sorted_model_names:
|
96 |
model = loaded_models.get(model_name)
|
@@ -102,11 +126,7 @@ def predict_cancer(age, gender, T, N, Focality, Response):
|
|
102 |
try:
|
103 |
prediction = model.predict(features)
|
104 |
pred_value = prediction[0]
|
105 |
-
|
106 |
-
if pred_value == 1:
|
107 |
-
pred_text = f"{can_recur_emoji} Can recur"
|
108 |
-
else:
|
109 |
-
pred_text = f"{cannot_recur_emoji} Cannot-recur"
|
110 |
|
111 |
sensitivity = model_performance[model_name]['Model Sensitivity']
|
112 |
specificity = model_performance[model_name]['Model Specificity']
|
|
|
43 |
print(f"Model file for {model_name} not found.")
|
44 |
|
45 |
def predict_cancer(age, gender, T, N, Focality, Response):
|
46 |
+
# Validate age
|
47 |
+
if age is None or not (1 <= age <= 100):
|
48 |
+
return "π΄ **Error:** Age must be a number between 1 and 100."
|
49 |
+
|
50 |
+
# Validate gender
|
51 |
+
if gender not in ["Female", "Male"]:
|
52 |
+
return "π΄ **Error:** Please select a valid gender."
|
53 |
+
|
54 |
+
# Validate T (Tumor Size)
|
55 |
+
if T is None:
|
56 |
+
return "π΄ **Error:** Please select a valid T (Tumor Size) option."
|
57 |
+
|
58 |
+
# Validate N (Lymph Node Spread)
|
59 |
+
if N is None:
|
60 |
+
return "π΄ **Error:** Please select a valid N (Lymph Node Spread) option."
|
61 |
+
|
62 |
+
# Validate Focality
|
63 |
+
if Focality is None:
|
64 |
+
return "π΄ **Error:** Please select a valid Focality option."
|
65 |
+
|
66 |
+
# Validate Response
|
67 |
+
if Response is None:
|
68 |
+
return "π΄ **Error:** Please select a valid Response option."
|
69 |
+
|
70 |
+
# Process gender and other fields
|
71 |
gender_val = 0 if gender == "Female" else 1
|
72 |
response_val = int(Response)
|
73 |
T_val = int(T)
|
74 |
N_val = int(N)
|
75 |
Focality_val = int(Focality)
|
76 |
|
77 |
+
# Prepare features
|
78 |
features = pd.DataFrame({
|
79 |
'Age': [age],
|
80 |
'Gender': [gender_val],
|
|
|
84 |
'Response': [response_val]
|
85 |
})
|
86 |
|
87 |
+
# Validate scaler file
|
88 |
scaler_file = "model/pjas-thyroid-Scaler.pkl"
|
89 |
if not os.path.exists(scaler_file):
|
90 |
return "π΄ **Error:** Scaler file not found. Please contact the administrator."
|
|
|
92 |
scaler = joblib.load(scaler_file)
|
93 |
features[['Age']] = scaler.transform(features[['Age']])
|
94 |
|
95 |
+
# Sort models based on sensitivity
|
96 |
sorted_model_names = sorted(
|
97 |
model_performance.keys(),
|
98 |
key=lambda m: model_performance[m]['Model Sensitivity'],
|
99 |
reverse=True
|
100 |
)
|
101 |
|
102 |
+
# Generate HTML table
|
103 |
table_header = """
|
104 |
<table>
|
105 |
<thead>
|
|
|
113 |
<tbody>
|
114 |
"""
|
115 |
table_rows = []
|
116 |
+
can_recur_emoji = "π΄"
|
117 |
+
cannot_recur_emoji = "π’"
|
|
|
118 |
|
119 |
for model_name in sorted_model_names:
|
120 |
model = loaded_models.get(model_name)
|
|
|
126 |
try:
|
127 |
prediction = model.predict(features)
|
128 |
pred_value = prediction[0]
|
129 |
+
pred_text = f"{can_recur_emoji} Can recur" if pred_value == 1 else f"{cannot_recur_emoji} Cannot-recur"
|
|
|
|
|
|
|
|
|
130 |
|
131 |
sensitivity = model_performance[model_name]['Model Sensitivity']
|
132 |
specificity = model_performance[model_name]['Model Specificity']
|