Propagation-Graph Classifiers on UPFD GossipCop
Checkpoints for Part B of the ANLP (Monsoon 2026) Assignment 3. The task is binary classification of news propagation trees: does a news story spread as fake or real, given the source post and the retweet graph around it.
Nine model configurations are included, each trained with five seeds:
- the architecture comparison on BERT node features: root-only MLP, GCN, GraphSAGE, GAT, Bi-GCN;
- the feature ablation on GraphSAGE: profile, spaCy, BERT and content features.
Data
GossipCop subset of UPFD, loaded through PyG's UPFD class with the shipped 20 / 10 / 70 split and
never re-split.
| Split | Graphs | Nodes |
|---|---|---|
| Train | 1,092 | 63,482 |
| Validation | 546 | 30,791 |
| Test | 3,826 | 219,989 |
Node 0 of every graph is the source news post; the remaining nodes are users who retweeted it. Edges are stored parent-to-child (verified: every edge points from a shallower to a deeper node, and node 0 has no incoming edge). Labels are binary and almost balanced on test (1,910 / 1,916).
Feature types:
feature |
Dimension | Contents |
|---|---|---|
profile |
10 | user profile attributes |
spacy |
300 | user tweet embeddings, spaCy |
bert |
768 | user tweet embeddings, BERT |
content |
310 | spaCy (300) + profile (10) |
Each feature type is standardised per dimension with training-split statistics. The transform is identical across feature types.
Models
All five architectures share the same readout style: 128 hidden units, two message-passing layers, dropout 0.5, mean pooling over nodes, and a linear classifier.
- Root-Only MLP — uses only node 0's feature vector, discarding every user node and edge. The text-only baseline.
- GCN — the standard first-order graph convolution (Kipf & Welling).
- GraphSAGE — mean-aggregator neighbourhood sampling.
- GAT — four attention heads on the first layer, one on the second.
- Bi-GCN — Bian et al., Rumor Detection on Social Media with Bi-Directional Graph Convolutional Networks (AAAI 2020). One GCN on the parent-to-child graph and one on its transpose, root feature concatenated at every layer, DropEdge 0.2, mean pooling per direction, then concatenation.
Training: Adam, learning rate 1e-3, weight decay 5e-4, batch 32, at most 100 epochs, early stopping on validation macro-F1 with patience 20. The checkpoint evaluated on test is the epoch with the best validation macro-F1, as the assignment requires.
Results
Test-set mean ± standard deviation over five seeds. Precision, recall and F1 are macro-averaged over the two classes.
| Configuration | Accuracy | Precision | Recall | F1 | Parameters |
|---|---|---|---|---|---|
mlp_bert |
73.72 ± 0.42 | 74.11 ± 0.40 | 73.73 ± 0.42 | 73.61 ± 0.44 | 115,202 |
gcn_bert |
84.47 ± 0.44 | 84.58 ± 0.38 | 84.47 ± 0.44 | 84.46 ± 0.45 | 115,202 |
sage_bert |
93.87 ± 0.53 | 93.88 ± 0.53 | 93.87 ± 0.53 | 93.87 ± 0.53 | 229,890 |
gat_bert |
95.49 ± 0.32 | 95.50 ± 0.32 | 95.49 ± 0.32 | 95.49 ± 0.32 | 115,714 |
bigcn_bert |
95.28 ± 0.17 | 95.30 ± 0.15 | 95.29 ± 0.17 | 95.28 ± 0.17 | 427,522 |
sage_profile |
92.93 ± 0.66 | 93.00 ± 0.62 | 92.93 ± 0.66 | 92.93 ± 0.66 | 35,842 |
sage_spacy |
93.59 ± 0.15 | 93.60 ± 0.15 | 93.59 ± 0.15 | 93.59 ± 0.15 | 110,082 |
sage_content |
95.87 ± 0.36 | 95.88 ± 0.36 | 95.87 ± 0.36 | 95.86 ± 0.36 | 112,642 |
sage_bert is the same run as the BERT row of the architecture comparison and is therefore reported
once in the table; the file list still contains both names because the same checkpoint serves both
questions.
Interpretation
Three things stand out.
The graph helps a lot. The root-only MLP reaches 73.7% using only the source post. Every graph model is at least 10 points better, and the best ones reach 95.5%. The retweet structure carries information the article text alone does not.
Attention and bidirectional propagation are the strongest inductive biases. GAT (95.49%) and Bi-GCN (95.28%) are within 0.2 points of each other and clearly ahead of GCN (84.47%) and GraphSAGE (93.87%). GCN's fixed isotropic averaging is the weakest graph model.
contentis the best feature set, notbert. With GraphSAGE fixed, content (spaCy + profile, 310 dimensions) reaches 95.87%, above BERT's 93.87% despite being less than half the width. Profile features alone already reach 92.93%, so user-level attributes are highly informative, and combining them with tweet embeddings is better than either alone. Article/user embeddings alone are not the whole signal.
Standard deviations are at most 0.66 points, so these orderings are stable across seeds.
Checkpoint format
Each file is a torch.save dictionary:
import torch
payload = torch.load("sage_bert_seed0.pt", map_location="cpu", weights_only=False)
payload["model"] # state_dict
payload["config"] # training and architecture configuration
payload["arch"] # mlp | gcn | sage | gat | bigcn
payload["feature"] # bert | profile | spacy | content
payload["seed"] # 0-4
payload["in_dim"] # input feature dimension
payload["num_classes"] # 2
payload["best_epoch"] # epoch selected by validation macro-F1
payload["best_val"] # validation metrics at that epoch
payload["test"] # test metrics of this checkpoint
Reloading requires the model definitions in src/part2/models.py from the accompanying repository.
Load with weights_only=False because the payload contains dictionaries and lists.
Limitations
These weights are an academic artefact for comparing graph architectures on a fixed benchmark. They are not a fake-news detector for deployment: the dataset is a single English-language snapshot, the labels come from one source, and the models are evaluated only on the shipped test split.
Training and evaluation logs are in the Weights & Biases project anlp-a3-part2, one run per
configuration plus a matching -evals run.