wikillm

Paper · 2023-09-30 · cs.LG, cs.AI

Unveiling the Unborn: Advancing Fetal Health Classification through Machine Learning

Classifies fetal health from 22 cardiotocography-derived features with scikit-learn's LGBMClassifier, default-style settings, SMOTE oversampling and an 80/20 split. Author-reported test accuracy 98.32% (abstract says 98.31%), AUC 0.9985, F1 0.9863. The validation split behind the headline numbers, the class labels and the dataset size are not stated.

Gradient-boosted decision treesSynthetic minority oversampling (SMOTE)tabularclinicalcardiotocographygradient-boostingclass-imbalance

arXivPDFMarkdown8 min read

AI-compiled by claude-haiku-5-5 on 2026-11-03, not yet reviewed by a human. Every claim cites its source; check it when a detail matters.

In plain words

Fetal monitoring records how the baby's heart rate responds to the mother's contractions, along with other measurements. Doctors read these recordings by eye, and readings can differ between people. This paper asks whether a standard machine-learning model can sort the recordings into health categories automatically.

The model used is LightGBM, a method that builds many small decision trees one after another, each one correcting the errors of the previous ones. It is trained on a published collection of recordings, from which 22 numeric features are selected. Before training, the rare categories are made more common with synthetic examples, so the model does not simply learn the majority case.

On the author's test data the model is right about 98% of the time. The paper presents this as a promising first step. It does not show that the model works on other hospitals' data or in clinical use, and the authors name that as future work.

TL;DR

  • A LightGBM classifier with the scikit-learn wrapper and mostly default settings is trained on 22 features from a cardiotocography dataset §3.1 §3.2 §3.4.
  • SMOTE balances the classes §3.4. An 80/20 train/test split and a 20-fold cross-validation are both described §3.4 §4.4.
  • Author-reported test accuracy is 98.32% (abstract 98.31%), AUC 0.9985, F1 0.9863 §5 fig. 2.
  • The text leaves the validation split behind the headline numbers, the class labels and the dataset size unstated. Treat the scores as unverified until those are known.
  • The paper links no official code. Its only linked code is a Kaggle notebook, which we could not read.

Problem

Fetal health is judged from cardiotocography (CTG) recordings and related measurements, and the authors say manual interpretation is subjective and can be inconsistent §1. The paper argues that data complexity and few labelled samples make the task hard [abstract]. It proposes an ML classifier that uses several inputs at once, such as fetal heart rate, uterine contractions and maternal blood pressure §1 §3.2. No prior-art comparison is made beyond the related-work summary §2.

Method

The pipeline has four parts: a public dataset §3.1, a selection of 22 features §3.2, a LightGBM model §3.3, and a training procedure with SMOTE and an 80/20 split §3.4.

  1. Data. The authors use the Ayres-de-Campos CTG dataset ("Sisporto 2.0", J. Matern. Fetal Med., 2000) §3.1 §4.1, cited as [4]. The text does not give the number of records, the class labels or the class counts.
  2. Preprocessing. The text says the authors handled missing values, removed irrelevant features and normalised the data, and ran exploratory analysis that guided feature selection §4.2. Which methods were used is not stated.
  3. Features. 22 features are kept and stored as float64 §3.2. The names of the 22 features are not listed in the text §4.3.
  4. Model. The authors use scikit-learn's LGBMClassifier with the settings in the Hyperparameters table §3.3 §3.4 §4.4.
  5. Class balance. SMOTE is applied to balance the class distributions §3.4 §4.4. Its parameters (for example the number of neighbours) are not stated.
  6. Evaluation. The text describes two schemes. One is a 20-fold cross-validation, which trains on 19 subsets and tests on the remaining one, repeated 20 times and aggregated §3.4 §4.4. The other is an 80/20 split, where the test part is not used in training §3.4 §4.4. The paper does not say which scheme produced each reported number.

The pseudocode below follows this order. It keeps the paper's uncertain steps as comments.

Pseudocode
# Fetal health pipeline  [§3.1] [§3.2] [§3.4] [§4.2]
# Input:  CTG records, one label each (labels not listed in the text)
# Output: class prediction per record, and the metrics in Results

def run_pipeline(raw_records, labels):
    # 1. Clean: missing values, irrelevant features, normalisation
    #    Methods not stated  [§4.2]
    records = preprocess(raw_records)

    # 2. Keep the 22 features used in the paper  [§3.2] [§4.3]
    #    Feature names not stated, so the selection cannot be repeated
    features = select_22_features(records)           # (N, 22) float64

    # 3. Hold out 20% as the test set, not used in training  [§3.4] [§4.4]
    #    Shuffling and stratification not stated
    train_x, train_y, test_x, test_y = split(features, labels, test_size=0.2)

    # 4. Balance the classes with SMOTE  [§3.4] [§4.4]
    #    Applied to the training data here; placement vs. CV not stated
    train_x, train_y = smote(train_x, train_y)

    # 5. Fit LightGBM with the settings in Hyperparameters  [§3.3] [§3.4]
    model = LGBMClassifier(boosting_type="gbdt", learning_rate=0.1,
                           n_estimators=100, num_leaves=31, max_depth=-1,
                           min_child_samples=20, min_child_weight=0.001,
                           min_split_gain=0.0, reg_alpha=0.0, reg_lambda=0.0,
                           random_state=123, n_jobs=-1)
    model.fit(train_x, train_y)

    # 6. Predict on the held-out 20% and compute metrics  [§4.5] [§5]
    predictions = model.predict(test_x)
    return metrics(test_y, predictions)

The paper also describes a 20-fold cross-validation §3.4 §4.4. It does not say whether SMOTE and the 80/20 split run inside each fold, so the pseudocode above is one reading, not the only one.

Hyperparameters

Values the paper states. The text calls the LightGBM settings "default hyperparameters" §3.3 §4.4, but also lists a random state of 123, which is set explicitly. The parameter names are the paper's.

NameValueWhereNotes
implementationscikit-learn LGBMClassifier§3.3 §4.4version not stated
boosting typegbdt§3.4
learning rate0.1§3.4 §4.4no schedule stated
boosting iterations100§3.4 §4.4early stopping not stated
number of leaves per tree31§3.4 §4.4
maximum tree depth-1 (unlimited)§3.4
minimum samples per leaf20§3.4 §4.4
minimum weight fraction of total weights0.001§3.4the text's wording
minimum loss reduction for a split0.0§3.4
reg_alpha, reg_lambdanot applied (0)§3.4
random state123§3.4
threads-1 (all available)§3.4 §4.4
silent modeon (warnings only)§3.4
number of input features22§3.2 §4.3names not stated
train / test split80% / 20%§3.4 §4.4shuffling not stated
cross-validation20 folds§3.4 §4.4which scheme gives the headline numbers not stated
SMOTEapplied§3.4 §4.4k neighbours and sampling strategy not stated
missing-value handling, normalisationnot stated§4.2
class labels, class counts, dataset sizenot stated§3.1 §4.1
seeds beyond random state 123not stated—no repeat runs reported

Results

Author-reported. Setup: a LightGBM classifier on the Ayres-de-Campos CTG data §4.1, with SMOTE and the splits described in Method §4.4. The text does not say which split produced each figure. The abstract cites a test set [abstract]. No baseline appears in the text. The comparison of models is shown only as an image, transcribed below fig. 1.

MetricThis paper (LightGBM)Source
Accuracy98.32% (abstract: 98.31%)§5 fig. 2
AUC0.9985§5 fig. 2
Recall0.9937§5 fig. 2
Precision0.9790§5 fig. 2
F10.9863§5 fig. 2
Kappa0.9748§5 fig. 2
MCC0.9749§5 fig. 2

Model comparison, transcribed from fig. 1. Values are the authors' own. The figure does not state the evaluation split or the run. The LightGBM row here (0.9791 accuracy) differs from the headline row (0.9832) in fig. 2.

ModelAccuracyAUCRecallPrec.F1KappaMCCTime (s)
lightgbm0.97910.99880.97910.97930.97910.96860.96882.8470
catboost0.97660.99840.97660.97700.97660.96490.96518.4650
et0.97620.99870.97620.97690.97620.96430.96470.9380
xgboost0.97480.99840.97480.97520.97470.96220.96242.0540
rf0.97080.99820.97080.97130.97080.95620.95651.2220
gbc0.96470.99690.96470.96560.96480.94700.94744.1070
dt0.95100.96330.95100.95160.95100.92650.92680.2000
knn0.94160.98930.94160.94550.94160.91250.91430.4690
ada0.91210.96730.91210.91400.91230.86820.86890.7400
lr0.88970.97350.88970.89350.89040.83460.83580.3100
ridge0.87790.00000.87790.88620.87890.81680.82000.1320
svm (linear)0.87680.00000.87680.88150.87750.81520.81670.1710
lda0.87680.96250.87680.88910.87820.81520.81990.2990
qda0.79400.94820.79400.85160.79730.69100.71690.2990
nb0.76770.89250.76770.82230.77080.65150.67570.1700
dummy0.33360.50000.33360.11130.16690.00000.00000.1710

Other figures, described by their captions only: fig. 3 is a ROC curve, fig. 4 a class prediction error plot and fig. 5 a validation curve. The text gives no numbers from them.

The text's broader claims are that the model is accurate on small data, across gestational ages and sensitive to abnormal cases §5. The text gives no data or table for any of these claims.

Paper vs code

No official code.

The paper says "the code and dataset ... are available at [4] and [5]" §8. Reference [4] is the Ayres-de-Campos dataset paper, not code. Reference [5] is a Kaggle notebook titled "Fetal Health Classification | LightGBM 98.31% Acc" under the account sujithmandala. Its owner name resembles the author's, but we could not verify that. WebFetch returned only the title, so we could not read its code, its dataset or its licence. We did not use it.

We searched GitHub for "fetal health classification lightgbm". The four results were owned by other accounts, and none is linked from the paper, so none was used.

Further mismatches with the paper's own text are listed under Pitfalls.

Pitfalls

  • Two accuracy values. The abstract gives 98.31%. §5 and fig. 2 give 98.32%. fig. 1 gives 97.91% for LightGBM. The three differ, and the text does not explain why.
  • Validation split is not stated. The paper describes both a 20-fold cross-validation and an 80/20 split §3.4 §4.4, and the abstract refers to a test set. The headline numbers may come from either. Metrics for the 20-fold results are "aggregated" §4.4, but the text gives no fold spread, so no variance is reported.
  • SMOTE placement is not stated. If SMOTE runs before the split or before the cross-validation folds, synthetic copies of test-side records can enter training and inflate scores. The text does not say. Apply oversampling to training folds only.
  • Labels and class counts are missing. The paper calls the task "healthy or abnormal" §5, which reads as binary. The dataset's label scheme and class counts are not given, so precision, recall and F1 cannot be checked. The text does not say how a positive class is defined or whether these metrics are averaged over classes.
  • Dataset size contradicts itself. §5 says the model worked "even when trained on a relatively small dataset". §8 calls the dataset "large and diverse". The record count is not given anywhere.
  • Feature names and preprocessing are missing. 22 features are chosen §3.2, but the names are not listed, and the normalisation and missing-value methods are not stated §4.2. An implementer cannot reproduce the feature set from the card.
  • "Default" cannot be confirmed. The paper calls its LightGBM settings default §3.3 but also lists a random state of 123 §3.4. It gives no library version, so the defaults cannot be checked from the text. Pin the version when reproducing.
  • Citations point to the wrong items. §8 cites [4] for code and [5] for the dataset, but [4] is the dataset paper and [5] is a Kaggle notebook. Treat the reference numbers in §8 as errors.
  • Related-work figures are unverified. §2 gives accuracies of 92%, 95% and 98% for prior work [1]–[3]. We did not check those references, and the bibliography entries for [1]–[3] were not checked for content.
  • Keywords mention neural networks and deep learning [keywords], but the method uses no neural network. Only the related-work discussion §2 refers to deep learning.
  • Generalisation is not tested. The paper calls the model generalisable across gestational ages and clinical settings §5, but it reports one dataset and one split. The authors list validation on a larger dataset and clinical use as future work [abstract] §6.3.
  • Clinical claims are not supported by the paper's data. The paper talks about patient outcomes and clinical decisions §5 §7, but it reports only classification metrics on one dataset.

Lineage

  • Builds on: LightGBM and scikit-learn's LGBMClassifier §3.3. The text cites neither the LightGBM paper nor the scikit-learn paper. SMOTE is named but not cited §3.4.
  • Compared against: the model comparison in fig. 1, which contains 15 alternative models, and the prior-work accuracies cited in §2 [1]–[3].
  • Superseded by: not stated.

Source and license

Adapted from “Unveiling the Unborn: Advancing Fetal Health Classification through Machine Learning” by Sujith K Mandala (arXiv:2310.00505), used under CC BY 4.0. Changes: condensed and restructured for implementation, with tables, equations and algorithms taken from the paper and its code, each cited to its source. Not affiliated with or endorsed by the authors.