YAML Metadata Warning:empty or missing yaml metadata in repo card

Check out the documentation for more information.

MentalBERT V5 Cleanlab — Cooperative Source-Aware (Label-Noise Cleaned)

Overview

8-class mental health text classifier trained on the V5 dataset after Confident Learning (cleanlab) label-noise removal on the Depression/Suicidal boundary.

Architecture: Cooperative source-aware MentalBERT
Base model: mental/mental-bert-base-uncased
Classes: ['Anxiety', 'Bipolar', 'Depression', 'Directed Aggression', 'Normal', 'Personality Disorder', 'Stress', 'Suicidal']

Cleaning Methodology

  • Tool: cleanlab 2.6.x with filter_by='prune_by_noise_rate'
  • OOF probabilities: 3-fold stratified cross-validation (2 epochs/fold)
  • Surgical scope: Depression and Suicidal rows only, non-CSSRS sources only
  • CSSRS excluded: CSSRS is the clinician-annotated trust anchor (κ=0.79) — never cleaned
  • Total drops: 4,745 samples removed from train+val pool

Performance

Metric Value
Test Accuracy 83.14%
F1 Macro 0.8384
F1 Weighted 0.8313
Dep→Sui bleed 692
Sui→Dep bleed 575
Total bleed 1,267

Inference Usage

import torch, torch.nn as nn
from transformers import BertModel, BertTokenizerFast
from huggingface_hub import hf_hub_download
import joblib, json

REPO = 'itsLu/mentalbert-v5-cleanlab'

bert      = BertModel.from_pretrained(REPO)
tokenizer = BertTokenizerFast.from_pretrained(REPO)
config    = json.load(open(hf_hub_download(REPO, 'inference_config.json')))

cls_head = nn.Sequential(nn.Dropout(0.1), nn.Linear(768, config['n_classes']))
cls_head.load_state_dict(torch.load(hf_hub_download(REPO, 'cls_head.pt'), map_location='cpu'))

le_path  = hf_hub_download(REPO, 'label_encoder.joblib')
le       = joblib.load(le_path)

def predict(text, device='cpu'):
    bert.to(device).eval(); cls_head.to(device).eval()
    enc = tokenizer(text, max_length=128, padding='max_length',
                    truncation=True, return_tensors='pt')
    with torch.no_grad():
        pooled = bert(enc['input_ids'].to(device),
                      enc['attention_mask'].to(device)).pooler_output
        logits = cls_head(pooled)
    probs = torch.softmax(logits, dim=-1).squeeze()
    pred_id = probs.argmax().item()
    return le.classes_[pred_id], probs[pred_id].item()

Leaderboard Context

Run Acc F1 Macro Bleed
V3 Two-Branch v1 86.82% 0.8469 726
V5 Flat baseline 82.41% 0.8308 1,265
V5 Cooperative source-aware 83.23% 0.8381 1,259
V5 DANN (ablation) 81.50% 0.8245 1,373
V5 Cleanlab (this) 83.14% 0.8384 1,267

Project

Helwan University — Faculty of Engineering, 2025–2026

Downloads last month
14
Safetensors
Model size
0.1B params
Tensor type
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support