Text Classification
Transformers
Safetensors
English
longformer
fake-news-detection
news
isot-fake-news
Instructions to use PushkarKumar/veritas_ai_new with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use PushkarKumar/veritas_ai_new with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-classification", model="PushkarKumar/veritas_ai_new")# Load model directly from transformers import AutoTokenizer, AutoModelForSequenceClassification tokenizer = AutoTokenizer.from_pretrained("PushkarKumar/veritas_ai_new") model = AutoModelForSequenceClassification.from_pretrained("PushkarKumar/veritas_ai_new") - Notebooks
- Google Colab
- Kaggle
| language: | |
| - en | |
| library_name: transformers | |
| pipeline_tag: text-classification | |
| tags: | |
| - fake-news-detection | |
| - longformer | |
| - news | |
| - isot-fake-news | |
| license: apache-2.0 | |
| datasets: | |
| - isot-fake-news | |
| base_model: | |
| - allenai/longformer-base-4096 | |
| # Long-Context Fake News Classifier (Longformer, ISOT) | |
| A binary text-classification model that fine-tunes `allenai/longformer-base-4096` to classify long-form news articles as REAL or FAKE, trained on a subsampled ISOT Fake News Dataset. | |
| ## Model | |
| - **Base model:** `allenai/longformer-base-4096` | |
| - **Task:** Binary text classification | |
| - **Labels:** `0` = REAL, `1` = FAKE | |
| - **Max sequence length used:** 1024 tokens | |
| - **Parameters:** same as `longformer-base-4096` with a newly initialized 2-class classifier head | |
| - **Framework:** Hugging Face `transformers` (Trainer API) | |
| ## Data | |
| - **Dataset:** ISOT Fake News Dataset | |
| - **Files:** `True.csv` (REAL), `Fake.csv` (FAKE) | |
| - **Language:** English | |
| - **Preprocessing:** | |
| - Added `label` column: 0 for REAL (`True.csv`), 1 for FAKE (`Fake.csv`) | |
| - Concatenated `title` and `text` into `full_text` | |
| - Shuffled combined data with `random_state=42` | |
| - Subsampled to 10,024 examples (`df_small`) | |
| - Train/test split: 80% / 20% (8,019 train, 2,005 test), stratified by `label` | |
| - Label distribution in subsample: | |
| - Overall: 5,241 FAKE, 4,783 REAL | |
| - Train: 4,193 FAKE, 3,826 REAL | |
| - Test: 1,048 FAKE, 957 REAL | |
| ## Tokenization | |
| - **Tokenizer:** `AutoTokenizer.from_pretrained("allenai/longformer-base-4096")` | |
| - **Settings:** | |
| - `padding="max_length"` | |
| - `truncation=True` | |
| - `max_length=1024` | |
| - **Global attention (training code):** | |
| - Created `global_attention_mask` as a Python list of length `len(inputs["input_ids"])` with the first element set to 1 and the rest 0, then attached as `inputs["global_attention_mask"]` | |
| - Note: this differs from the standard `(batch_size, seq_len)` tensor mask used at inference time | |
| ## Training setup | |
| **Model init** | |
| ```python | |
| model = AutoModelForSequenceClassification.from_pretrained( | |
| "allenai/longformer-base-4096", | |
| num_labels=2, | |
| ) | |
| ``` | |
| **TrainingArguments** | |
| - `evaluation_strategy` = `"epoch"` | |
| - `save_strategy` = `"epoch"` | |
| - `learning_rate` = `2e-5` | |
| - `per_device_train_batch_size` = `1` | |
| - `per_device_eval_batch_size` = `1` | |
| - `gradient_accumulation_steps` = `4` | |
| - `num_train_epochs` = `1` | |
| - `weight_decay` = `0.01` | |
| - `fp16` = `True` | |
| - `gradient_checkpointing` = `True` | |
| - `load_best_model_at_end` = `True` | |
| - `push_to_hub` = `False` | |
| - `report_to` = `"none"` | |
| **Trainer** | |
| ```python | |
| trainer = Trainer( | |
| model=model, | |
| args=training_args, | |
| train_dataset=tokenized_datasets["train"], | |
| eval_dataset=tokenized_datasets["test"], | |
| tokenizer=tokenizer, | |
| ) | |
| ``` | |
| ## Training and evaluation | |
| - **Epochs:** 1 | |
| - **Global steps:** 2004 | |
| - **Training runtime:** 2065.12 seconds | |
| - **Train samples per second:** 3.883 | |
| - **Train steps per second:** 0.97 | |
| - **Total FLOPs (reported):** 5,265,322,518,970,368.0 | |
| - **Losses:** | |
| - Epoch 0 training loss: 0.005100 | |
| - Epoch 0 validation loss: 0.00013 | |
| - Final `TrainOutput.training_loss`: 0.017658273408750813 | |
| No accuracy, precision, recall, or F1 metrics were computed in the training script; evaluation is currently reported only via loss on the held-out test split. | |
| ## Inference | |
| Minimal example for using the model from the Hub: | |
| ```python | |
| from transformers import AutoTokenizer, AutoModelForSequenceClassification | |
| import torch | |
| model_name = "[PushkarKumar/veritas_ai_new](https://huggingface.co/PushkarKumar/veritas_ai_new/)" | |
| tokenizer = AutoTokenizer.from_pretrained(model_name) | |
| model = AutoModelForSequenceClassification.from_pretrained(model_name) | |
| model.eval() | |
| def classify(text: str): | |
| inputs = tokenizer( | |
| text, | |
| padding="max_length", | |
| truncation=True, | |
| max_length=1024, | |
| return_tensors="pt", | |
| ) | |
| global_attention_mask = torch.zeros( | |
| inputs["input_ids"].shape, | |
| dtype=torch.long, | |
| ) | |
| global_attention_mask[:, 0] = 1 | |
| inputs["global_attention_mask"] = global_attention_mask | |
| with torch.no_grad(): | |
| outputs = model(**inputs) | |
| probs = torch.softmax(outputs.logits, dim=1) | |
| label_id = int(torch.argmax(probs)) | |
| labels = {0: "REAL", 1: "FAKE"} | |
| return labels[label_id], float(probs[label_id]) | |
| ``` | |
| ## Limitations and bias | |
| - Trained on a single English fake-news dataset (ISOT), with domain focus on politics and world news; performance outside this distribution is uncertain. | |
| - Labels are based on data source heuristics (e.g., Reuters vs. unreliable sites), not article-level fact checking, and may encode source or political bias. | |
| - The model should not be used as an automated fact-checker or for high-stakes decisions. | |
| ## Author | |
| - **Author:** Pushkar Kumar |