How We Built the Steel Property Predictor

Predicting four mechanical properties of martensitic tool and cutlery steels from chemical composition — with only 48 labeled training samples. Here is how the model works, and why it is mostly feature engineering.

Knife steel is a small-data problem with a lot of domain structure. There are only a few dozen steels with standardized, published mechanical measurements, but there are more than a century of metallurgy telling you why composition drives performance. That combination — few labels, strong priors — dictates almost every modeling decision in this project.

This post walks through the whole pipeline: how raw composition becomes features, why edge retention is machine-learned while corrosion is computed straight from the chemistry, and how we validate a model trained on 48 examples without fooling ourselves.

The prediction target

For each steel we predict four base properties on a 1–10 scale:

Those four are then combined into use-case scores (EDC, hard use, kitchen, bushcraft) using fixed weighting profiles. The interesting engineering is entirely in the four base properties, so that is where this post lives.

Why one model per property, not one model for all four

The four properties do not share a data regime, so they do not share a modeling approach:

PropertyApproachLabelsWhy
Edge retentionML ensemble48 CATRA testsEnough data for trees; non-linear element interactions
ToughnessPhysics-informed Ridge12 Charpy testsToo few samples for pure ML; physics features carry the load
CorrosionDeterministic calculationNone (validated vs 61 ratings)Well-understood passivation chemistry
Ease of sharpeningDeterministic calculationNoneDirect function of carbide volume and hardness

This is the central design idea: use ML only where you have labels and non-linearity, and use physics everywhere else. Forcing a single multi-output model would mean inventing pseudo-labels for corrosion and sharpening, or starving them of the composition chemistry that actually governs them.

Feature engineering: where the domain knowledge lives

Raw composition — the weight percent of C, Cr, V, Mo, W, Co, N, Mn, Si, Nb, Ni plus a powder-metallurgy flag — is only 12 numbers. Trees can learn from those directly, but with 48 samples they will happily overfit. So we add 12 derived features that encode metallurgy the model would otherwise have to rediscover from almost no data:

Composition (11):  C, Cr, V, Mo, W, Co, N, Mn, Si, Nb, Ni
Process (1):       powder_metallurgy (binary)
Derived (12):      total_carbide_formers, cr_to_c_ratio, is_stainless,
                   total_alloy_content, pren, cvf, c_above_eutectoid,
                   vc_fraction, matrix_cr, ms_temp, pm_x_cvf, pm_x_excess_c

The two that matter most for edge retention:

Crucially, vc_fraction is not something a tree can derive from raw V% alone — it depends on how much carbon is available to bind with vanadium after the other carbide formers take their share. Computing it up front is doing the model's hardest reasoning for it.

We also add interaction terms like pm_x_cvf (powder metallurgy × CVF). Powder metallurgy produces finer, more evenly distributed carbides, so a high-CVF PM steel behaves very differently from a high-CVF conventionally-cast steel. Encoding that interaction explicitly means the model does not need extra samples to learn it.

The edge-retention model

Data: CATRA TCC

The edge-retention model is trained on 48 steels measured on a CATRA TCC (Total Card Cut) machine — a standardized rig that reports how many millimeters of silica-impregnated cardstock a blade slices before dulling, under fixed edge angle, finish, and load. This is an objective machine measurement, not a subjective rating, which is exactly what you want as a training label. Measured values span 271 mm (simple carbon steels) to 1009 mm (Rex 121, a high-V/W tool steel).

Architecture: a three-model ensemble

Rather than bet everything on one estimator, we blend three with fixed weights:

prediction = 0.45 x XGBoost + 0.30 x RandomForest + 0.25 x Ridge

The intuition: XGBoost captures sharp non-linear interactions, RandomForest is a lower-variance bagged counterweight, and Ridge anchors the blend with a smooth linear trend that degrades gracefully when a steel sits outside the training distribution. On a 48-row dataset, that linear anchor matters — it stops the trees from extrapolating wildly on an unusual composition.

Every hyperparameter is chosen to fight overfitting on a tiny dataset: shallow trees (max_depth=3), strong regularization (reg_alpha=0.5, reg_lambda=2.0), subsampling, and a low learning rate over 200 estimators.

Validation: leave-one-out

With 48 samples, a held-out test set would be both too small to trust and too costly to give up. So we use leave-one-out cross-validation: train on 47 steels, predict the one left out, repeat 48 times.

MetricValue
LOOCV MAE (mm)34.8 mm
LOOCV MAE (1–10 scale)0.391
LOOCV RMSE (mm)~45 mm

An average error of 0.39 on a 10-point scale means the ranking is trustworthy even if an individual steel is occasionally off by half a point.

What the model learned

The XGBoost feature importances line up cleanly with metallurgy:

FeatureImportance
vc_fraction0.406
cvf0.265
V0.112
C0.097
total_carbide_formers0.028
total_alloy_content0.023

Vanadium carbide fraction alone explains ~40% of the model's edge-retention decisions. That is not a coincidence we engineered in — it is the model independently confirming the materials-science consensus that VC content drives wear resistance. When a model's learned structure matches known physics, you gain confidence it is generalizing rather than memorizing.

Toughness: physics features, tiny regression

Only 12 steels in the set have published Charpy impact data, all powder-metallurgy steels. Twelve samples is far too few for tree ensembles, so toughness uses Ridge regression over physics-derived features rather than raw composition. The key features encode carbide type, not just amount:

The fitted coefficients are readable, which is the point of using a linear model here:

FeatureCoefficientReading
stainless_x_cvf-0.85stainless + high carbide = worst for toughness
vc_vol-0.84VC hurts, but less than raw volume would suggest
pm_tool+0.58PM processing greatly helps tool steels
crc_vol-0.30chromium carbides hurt toughness
intercept6.11baseline score

Calibration correlation against Charpy is 0.96 (n=12). Because all calibration steels are PM, conventional steels receive an explicit processing penalty (−1.0 to −2.0 points depending on type) rather than a fabricated ML estimate. We would rather apply an honest, documented heuristic than pretend we measured something we did not.

Corrosion and sharpening: no ML at all

Corrosion resistance is computed, not learned, from effective matrix chromium — the Cr actually dissolved in the matrix and available to passivate, after subtracting the Cr locked up in carbides. The subtlety is carbide partition order: carbon binds vanadium, then niobium, then tungsten, then molybdenum, and only the leftover carbon consumes chromium. For a high-vanadium steel like S90V, vanadium scavenges most of the carbon, so far less chromium is depleted than a naive "carbon eats chromium" estimate would predict — which is why S90V is still stainless despite 2.3% carbon. This deterministic model correlates 0.888 with an independent set of 61 reference ratings.

Ease of sharpening is likewise a closed-form penalty driven by carbide volume and the hardness of those carbides relative to a typical alumina stone (2100 HV). A steel whose carbides are harder than the stone (high VC) is inherently hard to sharpen; the formula just encodes that.

Lessons for small-data ML

If you take one thing from this project, take this: on a 48-sample problem, the model is mostly your features and your priors, not your estimator. Concretely: