Spaces:
Running
on
L4
Running
on
L4
from src.deepeval.base_task import BaseTask | |
from collections import defaultdict | |
from src.deepeval.utils import accuracy, accuracy_standard_error | |
from typing import Any | |
import os | |
import ast | |
import re | |
from datasets import load_dataset,get_dataset_config_names | |
HF_TOKEN=os.getenv("HF_TOKEN") | |
class MMLUTask(BaseTask): | |
def __init__(self, model_name): | |
self.subsets = get_dataset_config_names("metunlp/mmlu_tr") | |
print(self.subsets) | |
super().__init__("metunlp/mmlu_tr", model_name=model_name) | |
def load_dataset_from_hf(self): | |
evaluate_count = 50 | |
dataset_dict = {} | |
for subset in self.subsets: | |
subset_data = load_dataset(self.dataset_repo, subset, token=HF_TOKEN, split="train") | |
dataset_dict[subset] = subset_data.select(range(min(evaluate_count, len(subset_data)))) | |
return dataset_dict | |
def evaluate(self) -> dict[str, Any]: | |
responses = [] | |
difficulty_results = defaultdict(lambda: {'correct': 0, 'total': 0}) | |
total_count = 0 | |
true = 0 | |
for subset in self.subsets: | |
curr_dataset = self.dataset[subset] | |
print(curr_dataset[0]) | |
for row in curr_dataset: | |
total_count += 1 | |
# Get values from row | |
question = row["question"] | |
answer_index = row["answer"] | |
subject = row["subject"] | |
correct_answer_letter = chr(65 + answer_index) | |
choices = ast.literal_eval(row["choices"]) # Convert string to list | |
formatted_choices = "\n".join([f"{chr(65 + i)}: {choice}" for i, choice in enumerate(choices)]) | |
# Construct the prompt/message | |
instruction = f"Aşağıda {subject} konusunda çoktan seçmeli bir soru verilmiştir." | |
prompt = f"{instruction}\n\nSoru: {question}\nSeçenekler:\n{formatted_choices}\n\n" | |
message = prompt | |
# Get/format answer of the model | |
model_answer = self.generate_response_mcqa_multi_token(message, choices=choices, max_new_tokens=2) | |
responses.append(model_answer) | |
model_answer_cleaned = model_answer.strip().replace('\n', '').replace(' ', '').upper().replace(':','') | |
# Check if correct based on metric | |
if correct_answer_letter == model_answer_cleaned: | |
true += 1 | |
difficulty_results[subset]['correct'] += 1 | |
difficulty_results[subset]['total'] += 1 | |
# Print results categorized by subset | |
for category, stats in difficulty_results.items(): | |
correct = stats['correct'] | |
total = stats['total'] | |
calculatedAccuracy = correct / total if total > 0 else 0 | |
print(f"{subset.capitalize()} Accuracy: {calculatedAccuracy:.2%} ({correct}/{total})") | |
print("Results:", responses) | |
print("Overall Accuracy:", true / total_count) | |
acc = accuracy(true, total_count) | |
acc_stderr = accuracy_standard_error(acc, total_count) | |
return {"acc": acc, "acc_stderr": acc_stderr} | |