spam-detection-app / evaluate_models.py
premmm's picture
Upload folder using huggingface_hub
9930208 verified
Raw
History Blame Contribute Delete
3.68 kB
import torch
from transformers import AutoTokenizer, AutoModelForSequenceClassification
import joblib
import pandas as pd
import time
import re
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
# Paths
MINILM_PATH = "/home/office-7/Downloads/minilm_v2/models/minilm"
XLM_ROBERTA_PATH = "/home/office-7/Downloads/xlm_roberta_v2/models/xlm_roberta"
ML_MODEL_PATH = "/home/office-7/support-intelligence-backend/core/services/models/spam_detection_model.pkl"
def preprocess_ml(text):
text = str(text).lower()
text = re.sub(r'[^\w\s]', '', text)
text = re.sub(r'\d+', '', text)
return text.strip()
def evaluate():
logger.info("Loading models...")
minilm_tokenizer = AutoTokenizer.from_pretrained(MINILM_PATH)
minilm_model = AutoModelForSequenceClassification.from_pretrained(MINILM_PATH)
xlm_tokenizer = AutoTokenizer.from_pretrained(XLM_ROBERTA_PATH)
xlm_model = AutoModelForSequenceClassification.from_pretrained(XLM_ROBERTA_PATH)
ml_model = joblib.load(ML_MODEL_PATH)
df = pd.read_csv("eval_dataset.csv")
results = []
models = [
("MiniLM v2", minilm_model, minilm_tokenizer, "transformer"),
("XLM-Roberta v2", xlm_model, xlm_tokenizer, "transformer"),
("ML Model (English)", ml_model, None, "ml")
]
for model_name, model, tokenizer, model_type in models:
logger.info(f"Evaluating {model_name}...")
for category in df['category'].unique():
cat_df = df[df['category'] == category]
texts = cat_df['text'].tolist()
labels = cat_df['label'].tolist()
predictions = []
start_time = time.time()
if model_type == "transformer":
for text in texts:
inputs = tokenizer(text, return_tensors="pt", truncation=True, padding=True, max_length=512)
with torch.no_grad():
outputs = model(**inputs)
pred = torch.argmax(outputs.logits, dim=-1).item()
# Mapping based on typical spam detection labels (1=spam, 0=ham)
# Check id2label if available
if hasattr(model.config, 'id2label'):
label_str = model.config.id2label[pred].lower()
pred = 1 if 'spam' in label_str else 0
predictions.append(pred)
else:
clean_texts = [preprocess_ml(t) for t in texts]
predictions = model.predict(clean_texts).tolist()
end_time = time.time()
total_time = end_time - start_time
avg_speed = total_time / len(texts)
acc = accuracy_score(labels, predictions)
prec = precision_score(labels, predictions, zero_division=0)
rec = recall_score(labels, predictions, zero_division=0)
f1 = f1_score(labels, predictions, zero_division=0)
results.append({
"Model": model_name,
"Category": category,
"Accuracy": f"{acc:.4f}",
"Precision": f"{prec:.4f}",
"Recall": f"{rec:.4f}",
"F1 Score": f"{f1:.4f}",
"Avg Speed (s/req)": f"{avg_speed:.4f}"
})
results_df = pd.DataFrame(results)
results_df.to_csv("model_evaluation.csv", index=False)
print("Evaluation completed: model_evaluation.csv")
if __name__ == "__main__":
evaluate()