|
|
|
|
|
import gradio as gr |
|
import pandas as pd |
|
import os |
|
import re |
|
from datetime import datetime |
|
|
|
LEADERBOARD_FILE = "leaderboard.csv" |
|
LAST_UPDATED = datetime.now().strftime("%B %d, %Y") |
|
|
|
def initialize_leaderboard_file(): |
|
""" |
|
Ensure the leaderboard file exists and has the correct headers. |
|
""" |
|
if not os.path.exists(LEADERBOARD_FILE): |
|
|
|
pd.DataFrame(columns=[ |
|
"Model Name", "Overall Accuracy", "Valid Accuracy", |
|
"Correct Predictions", "Total Questions", "Timestamp" |
|
]).to_csv(LEADERBOARD_FILE, index=False) |
|
else: |
|
|
|
if os.stat(LEADERBOARD_FILE).st_size == 0: |
|
pd.DataFrame(columns=[ |
|
"Model Name", "Overall Accuracy", "Valid Accuracy", |
|
"Correct Predictions", "Total Questions", "Timestamp" |
|
]).to_csv(LEADERBOARD_FILE, index=False) |
|
|
|
def clean_answer(answer): |
|
""" |
|
Clean and normalize the predicted answers. |
|
""" |
|
if pd.isna(answer): |
|
return None |
|
answer = str(answer) |
|
clean = re.sub(r'[^A-Da-d]', '', answer) |
|
if clean: |
|
return clean[0].upper() |
|
return None |
|
|
|
def update_leaderboard(results): |
|
""" |
|
Append new submission results to the leaderboard file. |
|
""" |
|
new_entry = { |
|
"Model Name": results['model_name'], |
|
"Overall Accuracy": round(results['overall_accuracy'] * 100, 2), |
|
"Valid Accuracy": round(results['valid_accuracy'] * 100, 2), |
|
"Correct Predictions": results['correct_predictions'], |
|
"Total Questions": results['total_questions'], |
|
"Timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), |
|
} |
|
|
|
new_entry_df = pd.DataFrame([new_entry]) |
|
new_entry_df.to_csv(LEADERBOARD_FILE, mode='a', index=False, header=False) |
|
|
|
def load_leaderboard(): |
|
""" |
|
Load all submissions from the leaderboard file. |
|
""" |
|
if not os.path.exists(LEADERBOARD_FILE) or os.stat(LEADERBOARD_FILE).st_size == 0: |
|
return pd.DataFrame({ |
|
"Model Name": [], |
|
"Overall Accuracy": [], |
|
"Valid Accuracy": [], |
|
"Correct Predictions": [], |
|
"Total Questions": [], |
|
"Timestamp": [], |
|
}) |
|
return pd.read_csv(LEADERBOARD_FILE) |
|
|
|
def evaluate_predictions(prediction_file, model_name, add_to_leaderboard): |
|
""" |
|
Evaluate predictions and optionally add results to the leaderboard. |
|
""" |
|
ground_truth_file = "ground_truth.csv" |
|
if not os.path.exists(ground_truth_file): |
|
return "Ground truth file not found.", load_leaderboard() |
|
if not prediction_file: |
|
return "Prediction file not uploaded.", load_leaderboard() |
|
|
|
try: |
|
|
|
predictions_df = pd.read_csv(prediction_file.name) |
|
ground_truth_df = pd.read_csv(ground_truth_file) |
|
|
|
|
|
merged_df = pd.merge(predictions_df, ground_truth_df, on='question_id', how='inner') |
|
merged_df['pred_answer'] = merged_df['predicted_answer'].apply(clean_answer) |
|
|
|
|
|
valid_predictions = merged_df.dropna(subset=['pred_answer']) |
|
correct_predictions = (valid_predictions['pred_answer'] == valid_predictions['Answer']).sum() |
|
total_predictions = len(merged_df) |
|
total_valid_predictions = len(valid_predictions) |
|
|
|
|
|
overall_accuracy = correct_predictions / total_predictions if total_predictions > 0 else 0 |
|
valid_accuracy = correct_predictions / total_valid_predictions if total_valid_predictions > 0 else 0 |
|
|
|
results = { |
|
'model_name': model_name if model_name else "Unknown Model", |
|
'overall_accuracy': overall_accuracy, |
|
'valid_accuracy': valid_accuracy, |
|
'correct_predictions': correct_predictions, |
|
'total_questions': total_predictions, |
|
} |
|
|
|
|
|
if add_to_leaderboard: |
|
update_leaderboard(results) |
|
return "Evaluation completed and added to leaderboard.", load_leaderboard() |
|
else: |
|
return "Evaluation completed but not added to leaderboard.", load_leaderboard() |
|
except Exception as e: |
|
return f"Error during evaluation: {str(e)}", load_leaderboard() |
|
|
|
|
|
initialize_leaderboard_file() |
|
|
|
|
|
with gr.Blocks() as demo: |
|
gr.Markdown("# Prediction Evaluation Tool with Leaderboard") |
|
|
|
with gr.Tabs(): |
|
|
|
with gr.TabItem("π
Submission"): |
|
file_input = gr.File(label="Upload Prediction CSV") |
|
model_name_input = gr.Textbox(label="Model Name", placeholder="Enter your model name") |
|
add_to_leaderboard_checkbox = gr.Checkbox(label="Add to Leaderboard?", value=True) |
|
eval_status = gr.Textbox(label="Evaluation Status", interactive=False) |
|
leaderboard_table_preview = gr.Dataframe( |
|
value=load_leaderboard(), |
|
label="Leaderboard (Preview)", |
|
interactive=False, |
|
wrap=True, |
|
) |
|
eval_button = gr.Button("Evaluate and Update Leaderboard") |
|
eval_button.click( |
|
evaluate_predictions, |
|
inputs=[file_input, model_name_input, add_to_leaderboard_checkbox], |
|
outputs=[eval_status, leaderboard_table_preview], |
|
) |
|
|
|
|
|
with gr.TabItem("π
Leaderboard"): |
|
leaderboard_table = gr.Dataframe( |
|
value=load_leaderboard(), |
|
label="Leaderboard", |
|
interactive=False, |
|
wrap=True, |
|
) |
|
refresh_button = gr.Button("Refresh Leaderboard") |
|
refresh_button.click( |
|
lambda: load_leaderboard(), |
|
inputs=[], |
|
outputs=[leaderboard_table], |
|
) |
|
|
|
gr.Markdown(f"Last updated on **{LAST_UPDATED}**") |
|
|
|
demo.launch() |
|
|