Statistical Lithology Classifier (Phase 2) -- XGBoost
Lithology classifier based on an XGBoost model -- an ensemble of 200 stacked decision trees, where each new tree is trained specifically to correct errors from the trees before it ("gradient boosting"). It learns its patterns from real examples, rather than applying fixed rules, and is comparable to Phase 1's rule-based approach, not combined with it. It predicts 10 rock types: Shale, Sandstone, Limestone, Halite, Chalk, Anhydrite, Marl, Dolomite, Tuff, and Coal.
How gradient-boosted trees learn: a worked example with real numbers ->
What "accuracy" means here: Every "real rock type" used here comes from the WellStrat dataset -- records that trace back to the well operator's own original reports, not a computer-derived product. Importantly, unlike Phase 1, which is only checked against these records, this model is trained directly on them. So a good score partly means it learned WellStrat's own patterns well -- it isn't independent proof the geology is correct. A few rock types have very little data behind them in the whole database -- Coal, for example, comes from only 36 wells -- so their individual scores should be treated cautiously.
This version's training details
Trained on every well passing the GR-identity-verified, >=10% GR coverage gate with at least one labeled WellStrat interval (10-class scheme). No well-count cap is applied in the production Recalculate path. Classes with fewer than 15 training rows after the well-level split are dropped entirely. Row count is thinned dynamically to a 9M-row budget.
- row_budget
- 9000000
- random_seed
- 42
- test_fraction
- 0.2
- min_train_n_per_class
- 15
- gr_coverage_pct_threshold
- 10
Last run: 2026-08-02 15:43:01 UTC
Confusion Matrix
Each row is a real, known rock type. Each column is what the classifier guessed. Reading across the "Sandstone" row shows: of all the samples that really are Sandstone, what did the classifier call them?
Darker cells = higher count within that row (row-normalised shading). "Unclassified" is a declined answer, not a wrong guess -- shaded separately.
How this result was generated
+ other logs if available"] rolling["Look at the trend nearby,
not just one number"] context["Which rock formation,
plus roughly where the well is"] split["Split wells: most for learning,
some held back for testing"] tree1["Tree 1: a chain of yes/no
questions about the curve values"] err1["Check which depths
Tree 1 still gets wrong"] tree2["Tree 2: built specifically
to fix Tree 1's mistakes"] repeat["...continue for 200 trees,
each one fixing what's left over"] ensemble["Add up all 200 trees'
small votes into one answer"] predict["Guess the rock type
for the held-back wells"] score["Compare guesses
to the real answer"] curves --> rolling --> context --> split --> tree1 --> err1 --> tree2 --> repeat --> ensemble --> predict --> score
Hover a step for a plain-language explanation.
References
Learning Curve -- Accuracy vs. Training Wells
From the most recent learning-curve sweep: accuracy against a single FIXED held-out test set, at each training-well-count step. The highlighted point is where adding more wells stopped meaningfully helping -- that step's model is the one currently used for predictions.
What do these terms mean?
- Fixed test set
- A group of wells set aside once, at the very start, and never used for training. Every model at every size is checked against this exact same group, so the comparison between sizes is fair -- like giving everyone the same exam.
- Sizes / nested growth
- Each size builds on the last: "100 wells" is the same 50 wells from the "50" size plus 50 new ones, never a completely different random batch. This means any change in accuracy between sizes reflects what the extra wells actually added.
- Repeats
- Each size is trained several times with a different random selection of wells, then averaged. A single attempt can get lucky or unlucky depending on which wells happen to be picked -- averaging smooths that out.
- Peak / promoted
- The smallest well count where accuracy stopped meaningfully improving with more data. The model trained at that point is automatically saved as the one used for real predictions elsewhere on the site, replacing "always train on every well."