rdsarjito commited on
Commit
39e7123
Β·
1 Parent(s): 2bb0484
Files changed (1) hide show
  1. app.py +40 -19
app.py CHANGED
@@ -171,19 +171,37 @@ def load_model():
171
  def predict_allergen(model, vectorizer, input_text):
172
  X_input = vectorizer.transform([input_text])
173
  prediction = model.predict(X_input)
 
174
  try:
 
175
  probabilities = model.predict_proba(X_input)
176
- return prediction[0], probabilities[0]
177
- except:
178
- # Fallback jika predict_proba tidak tersedia atau error
179
- # Buat dummy probabilities berdasarkan prediction
180
- dummy_probs = []
181
- for pred in prediction[0]:
182
- if pred == 1:
183
- dummy_probs.append([0.1, 0.9]) # [prob_negative, prob_positive]
184
- else:
185
- dummy_probs.append([0.9, 0.1])
186
- return prediction[0], dummy_probs
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
187
 
188
  # === Scraping bahan dari Cookpad ===
189
  def get_ingredients_from_cookpad(url):
@@ -229,17 +247,18 @@ def display_results(results, probabilities, labels):
229
  for i, (allergen, status) in enumerate(results.items()):
230
  emoji = allergen_emojis.get(allergen, 'πŸ“‹')
231
 
232
- # Handle different probability formats
233
  try:
234
- if isinstance(probabilities[i], (list, tuple)) and len(probabilities[i]) >= 2:
235
- confidence = probabilities[i][1] * 100 # Get probability for positive class
236
- elif isinstance(probabilities[i], (int, float)):
237
  confidence = probabilities[i] * 100
238
  else:
239
- confidence = 50.0 # Default fallback
 
240
  except (IndexError, TypeError):
241
- # Fallback confidence based on prediction
242
- confidence = 85.0 if status == 1 else 15.0
243
 
244
  if status == 1: # Detected
245
  detected_allergens.append(allergen)
@@ -249,9 +268,11 @@ def display_results(results, probabilities, labels):
249
  </div>
250
  ''', unsafe_allow_html=True)
251
  else: # Not detected
 
 
252
  st.markdown(f'''
253
  <div class="allergen-result allergen-safe">
254
- {emoji} {allergen}: Tidak Terdeteksi βœ“ ({confidence:.2f}%)
255
  </div>
256
  ''', unsafe_allow_html=True)
257
 
 
171
  def predict_allergen(model, vectorizer, input_text):
172
  X_input = vectorizer.transform([input_text])
173
  prediction = model.predict(X_input)
174
+
175
  try:
176
+ # Untuk multi-label classification, predict_proba mengembalikan list probabilitas
177
  probabilities = model.predict_proba(X_input)
178
+
179
+ # Jika probabilities adalah list of arrays (multi-label)
180
+ if isinstance(probabilities, list):
181
+ # Ambil probabilitas untuk kelas positif dari setiap classifier
182
+ positive_probs = []
183
+ for i, prob_array in enumerate(probabilities):
184
+ if prob_array.shape[1] == 2: # Binary classification
185
+ positive_probs.append(prob_array[0][1]) # Probabilitas kelas positif
186
+ else:
187
+ positive_probs.append(prob_array[0][0]) # Jika hanya 1 kelas
188
+ return prediction[0], positive_probs
189
+ else:
190
+ # Single output
191
+ return prediction[0], probabilities[0]
192
+
193
+ except Exception as e:
194
+ # Jika predict_proba gagal, gunakan decision_function jika tersedia
195
+ try:
196
+ decision_scores = model.decision_function(X_input)
197
+ # Convert decision scores to probabilities using sigmoid
198
+ import numpy as np
199
+ probabilities = 1 / (1 + np.exp(-decision_scores[0]))
200
+ return prediction[0], probabilities
201
+ except:
202
+ # Last fallback - return predictions as confidence (0 or 1 -> 0% or 100%)
203
+ confidence_scores = [float(pred) for pred in prediction[0]]
204
+ return prediction[0], confidence_scores
205
 
206
  # === Scraping bahan dari Cookpad ===
207
  def get_ingredients_from_cookpad(url):
 
247
  for i, (allergen, status) in enumerate(results.items()):
248
  emoji = allergen_emojis.get(allergen, 'πŸ“‹')
249
 
250
+ # Get actual probability from model
251
  try:
252
+ if isinstance(probabilities, list) and i < len(probabilities):
253
+ confidence = probabilities[i] * 100
254
+ elif hasattr(probabilities, '__getitem__') and i < len(probabilities):
255
  confidence = probabilities[i] * 100
256
  else:
257
+ # If no probability available, show based on prediction
258
+ confidence = 100.0 if status == 1 else 0.0
259
  except (IndexError, TypeError):
260
+ # Fallback to prediction-based confidence
261
+ confidence = 100.0 if status == 1 else 0.0
262
 
263
  if status == 1: # Detected
264
  detected_allergens.append(allergen)
 
268
  </div>
269
  ''', unsafe_allow_html=True)
270
  else: # Not detected
271
+ # For negative cases, show (100 - confidence) to represent "not detected" confidence
272
+ negative_confidence = 100 - confidence if confidence > 50 else confidence
273
  st.markdown(f'''
274
  <div class="allergen-result allergen-safe">
275
+ {emoji} {allergen}: Tidak Terdeteksi βœ“ ({negative_confidence:.2f}%)
276
  </div>
277
  ''', unsafe_allow_html=True)
278