Inductive Inference of Gradient-Boosted Decision Trees on Graphs for Insurance Fraud Detection
Félix Arthur Vandervorst, Bruno Deprez, Wouter Verbeke, Tim Verdonck [2026]
This paper combines the performance of gradient boosting on tabular data with heterogeneous network learning in insurance fraud detection. It illustrates how metapaths can be used to aggregate the network data, and how the principle of gradient boosting can be applied on this data. The performance is tested on synthetic, open-source and proprietary network data, building a strong case for the method's usefulness.
The main contributions of this paper are:
- We present a novel method, graph-gradient boosted machine (G-GBM), based on probability-weighted metapaths adapted to gradient-boosted trees.
- We compare its performance with that of GraphSage on simulated random graphs for independent cross-validation and that of HinSage on a real insurance heterogeneous graph.
- We present an adapted interpretability adaptation of the popular SHAP-based explanation in classic supervised learning problems.
The paper is available here as part of the the Data Mining and Knowledge Discovery (DMKD) special issue on Knowledge Discovery from Graphs.
The experiments are done on two datasets, one proprietary dataset that is published alongside our paper, and one open-source dataset. Both can be found online using the following links:
The datasets are not included in this repository. Download them from the links above and place them under data/HCP/ and data/Insurance/. The notebook notebooks/data_preprocessing.ipynb turns the raw insurance files into the pickled graph objects the scripts expect, and notebooks/hcp_data_anaylis.ipynb does the same for the healthcare provider data, including the community-based train/test split.
This repository is organised as follows:
|- config/
|- data/
|- config.yaml # active dataset, data paths, node-type bookkeeping
|- methods/
|- config.yaml # models to train and their hyperparameters
|- data/ # not tracked, see Dataset above
|- HCP/
|- Insurance/
|- RandomNetworks/ # generated by scripts/RandomNetworks.py
|- notebooks/
|- data_preprocessing.ipynb # raw files -> pickled graph objects
|- hcp_data_anaylis.ipynb # HCP feature engineering and train/test split
|- ComparisonNetworks.ipynb # degree distributions of both networks
|- dgl_network.ipynb # HAN/HGT sandbox, mirrors model_training_dgl.py
|- res/ # results: summary tables and figures
|- scripts/
|- experiment.py # original all-in-one run (train + evaluate)
|- model_training.py # G-GBM, LGB, metapath2vec, HINSage
|- model_training_dgl.py # HAN, HGT
|- evaluation.py # curves + summary.csv from stored predictions
|- plot_SHAP.py # grouped SHAP importance plot
|- RandomNetworks.py # generates the synthetic graphs
|- random_networks_ggbm.py # G-GBM on the synthetic graphs
|- random_networks_pyg.py # GraphSAGE and GAT baselines
|- random_networks_node2vec.py # node2vec baseline (transductive)
|- src/
|- data/
|- graph_data.py
|- utils/
|- _utils.py
|- methods/
|- G_GBM.py # the proposed method
|- network.py # HINSage and metapath2vec (stellargraph)
|- dgl_graph.py # graph_data -> DGL heterograph
|- dgl_network.py # HAN/HGT training and evaluation loops
|- han.py
|- hgt.py
|- utils/
|- classifiers.py
|- paths.py
|- utils/
|- evaluation.py
|- param_dict.py
|- setup.pyThe code needs three separate environments. This is not by choice: stellargraph pins TensorFlow 2.13 and numpy 1.x on Python 3.8, while DGL and PyTorch Geometric need the numpy 2.x stack on Python 3.10. They cannot be installed side by side. Please create each one as a fresh virtual environment to avoid clashing dependencies.
| Environment | Python | Requirements file | Used for |
|---|---|---|---|
| main | 3.8 | requirements.txt |
G-GBM, LGB, metapath2vec, HINSage, evaluation, SHAP, random-network generation, random_networks_ggbm.py |
| DGL | 3.10 | requirements-dgl.txt |
HAN and HGT |
| PyG | 3.10 | requirements-pyg.txt |
GraphSAGE, GAT and node2vec on the random networks |
pip install -r requirements.txtMost of the work runs in the main environment; the other two are only needed for the corresponding baselines. psutil is optional throughout: without it the training scripts still run, but the memory columns in the summary table are reported as NaN.
DGL is not on PyPI for every platform and is best installed from its own wheel index:
pip install -r requirements-dgl.txt -f https://data.dgl.ai/wheels/repo.htmlDGL 1.1.3 is pinned deliberately. DGL 2.x ships its graphbolt C++ extension per torch version and fails to import when no matching library is present.
We have also provided a environment.txt file that contains set-by-step instructions on how to set up the viruals environment. These steps might be necessary, since the deepwalk/node2vec implementation from pytorch-geometric might have some issues if dependencies are installed incorrectly. The optional pyg-lib and torch-sparse extensions are not required: PyG falls back to its pure-PyTorch implementations and only emits a warning.
Pick the dataset by setting the dataset key in config/data/config.yaml to one of insurance_a, insurance_c, hcp, insurance_gb or hcp_gb, then choose which models to train under that dataset's models_to_train in config/methods/config.yaml. The _gb variants use metapaths of length 0, so G-GBM reduces to classic gradient boosting; they are useful as an implementation check.
python scripts/model_training.py # main env | G-GBM, LGB, metapath2vec, HINSage
python scripts/model_training_dgl.py # DGL env | HAN, HGT
python scripts/evaluation.py # main env | ROC/PR curves and res/<dataset>/summary.csv
python scripts/plot_SHAP.py # main env | res/plot_shap_importance_<dataset>.pdfTraining and evaluation are split so that models can be trained separately and compared without retraining. Each training script writes its predictions, fitted model and timing/memory metrics to res/<dataset>/<model>/; evaluation.py and plot_SHAP.py read those files back. G-GBM must have been trained before running evaluation.py, as its output supplies the test labels. scripts/experiment.py is the original script that trains and evaluates in a single pass, without storing intermediate results.
These four scripts use paths relative to the working directory, so run them from the repository root:
python scripts/RandomNetworks.py # main env | 4 label methods x 6 generators x 20 seeds
python scripts/random_networks_ggbm.py # main env | -> res/RandomNetworks/results_ggbm.csv
python scripts/random_networks_pyg.py # PyG env | -> res/RandomNetworks/results_pyg.csv
python scripts/random_networks_node2vec.py # PyG env | -> res/RandomNetworks/results_node2vec.csvRandomNetworks.py generates a separate train and test graph per seed, so the comparison on synthetic data is inductive: the models are evaluated on a structurally independent graph. The node2vec baseline is the exception, as it merges both graphs before learning embeddings and is therefore transductive.
Please cite our paper and/or code as follows: Use the BibTeX citation
@article{vandervorst2025inductive,
author = {Vandervorst, F{\'e}lix and Deprez, Bruno and Verbeke, Wouter and Verdonck, Tim},
title = {Inductive inference of gradient-boosted decision trees on graphs for insurance fraud detection},
journal = {Data Mining and Knowledge Discovery},
number = {5},
pages = {78},
volume = {40},
year = {2026},
doi = {10.1007/s10618-026-01249-0},
url = {https://doi.org/10.1007/s10618-026-01249-0}
}