Methodology & validation

CarrierScore is a documented methodology, not a black-box model: two transparent 0–100 indices built from population percentiles of point-in-time FMCSA indicators, fixed published weights, and explicit flags — each index validated against its own outcome on held-out cohorts. This page shows exactly how they are built, how they were tested, the numbers, and what they are not.

Score version 0.5 · served since 2026-08-17 · validation run 2026-08-17

The two indices

Every carrier receives two first-class indices. They are separate objects because one linear blend cannot rank both future out-of-service rate and future crashes: the two outcomes are pulled in opposite directions by fleet size, so a composite that is good at one is worse at the other. Each index is validated only against its own outcome.

Inspection / compliance risk index

Roadside-inspection outcomes relative to peers: violations and out-of-service (OOS) rates per inspection.

inspection_risk = 100 × (
  0.50 × pctl(violations per inspection, 24m)
 + 0.20 × pctl(OOS rate per inspection, 24m)
 + 0.30 × pctl(OOS rate per inspection, 6m) )
 + surcharges, clipped 0–100

Validated against: the carrier's future 12-month out-of-service rate landing in the population's top decile.

Surcharges reported on this index: active FMCSA out-of-service order; high-confidence reincarnation link.

Crash risk index

Reportable crash history relative to peers, normalized by inspection activity rather than by a fleet-size snapshot.

crash_risk = 100 × (
  0.60 × pctl(crashes per inspection, 24m)
 + 0.20 × pctl(fatal/injury crashes per inspection, 24m)
 + 0.20 × pctl(tow-away crashes per inspection, 24m) )
 + surcharges, clipped 0–100

Validated against: any reportable crash in the following 12 months (fatal/injury crashes reported as a secondary label).

Surcharges reported on this index: high-confidence reincarnation link.

Higher is riskier on both. pctl(·) is the carrier's empirical-CDF percentile over every scoreable carrier in the same daily run. The weights are frozen: they were chosen once, by a documented grid search on the 2024-08-16 origin only, and have not been re-fit on any later data. Every score carries score_version, a methodology note, every component's value, percentile and weight, and the index's historical-validation line, so each point can be traced.

Deliberately not a component: inspection volume (more inspections mean more exposure, not more risk per unit of exposure), carrier age (anti-predictive for crashes and near-zero for OOS in testing), and any current-snapshot fleet-size field such as power units.

Legacy composite

For backward compatibility the API also returns legacy_composite (carrier_score): 0.70 × the higher index + 0.30 × the lower index, plus all surcharges. It is not validated, not gated and not the headline. Read the two indices.

Percentiles and activity bands

Each component is ranked over the whole scored population ("global" percentiles). Every carrier is also assigned a 24-month inspection-activity band — 0, 1–2, 3–5, 6–10, 11–25, 26–60, 61–150, 151+ roadside inspections — which is reported as context with every score.

Ranking within the band instead of population-wide was tested as an ablation and chosen on the fit origin only, by AUC on each index's own label. Population-wide percentiles won for both indices (inspection 0.766 vs 0.760 — a wash; crash 0.690 vs 0.617 — within-band ranking removes exposure by construction), so the band is context, not the ranking basis. Within every band both indices retain their discrimination (see activity-band table).

Carriers with too little inspection history for a component receive a neutral (50th-percentile) weighting for that component, and every score reports a data_sufficiency figure (0–1) so a "50" from missing data is never confused with a "50" from average behaviour.

Flags and surcharges

Hard facts are shown as explicit flags and added as fixed surcharge points rather than hidden inside weights. Surcharge points are policy constants, not fitted parameters.

FlagConditionSurchargeApplied to
Active out-of-service orderAn FMCSA out-of-service order is in force on the scoring date (rescinded orders do not count)+25inspection_risk; legacy composite
No active insurance filingCarrier holds active operating authority but no active insurance filing is on record (MOTUS)+15legacy composite (flag reported on every output)
Reincarnation linkHigh-confidence link (weight ≥ 0.8) to a prior, now-dead carrier identity+10both indices; legacy composite

Only the active-OOS-order surcharge is live in the historical validation below; the insurance and reincarnation surcharges cannot yet be reconstructed point-in-time and are disabled there (see caveats).

Validation design

The question the validation answers is narrow and honest: if you had ranked carriers by this index on a past date, using only what was knowable on that date, how well would that ranking have separated the carriers that went on to have the outcome from those that did not?

  1. Point-in-time features. The population is scored at a past origin date T using only inspections, crashes and OOS orders dated on or before T. Outcomes are read from the 12 months after T. Carriers first registered after T are excluded.
  2. Cohort. Carriers with at least 3 roadside inspections in the 24 months before T (so a rate is measurable). Cohorts are defined by inspection activity only — never by current operating status, which would be survivorship bias.
  3. Temporal holdouts. Weights were chosen on T1 = 2024-08-16 and nowhere else. T2 = 2025-02-16 and T3 = 2025-08-16 are the pre-registered gate holdouts. T4 = 2025-05-16 is a post-selection holdout added after the weights and gate were frozen; it played no part in any choice and is reported, not gated.
  4. Provenance guard. The harness asserts that every evaluation origin is strictly after the fit origin, re-runs the weight search on T1 alone and checks it reproduces the shipped weights exactly (it does), and re-runs it with scrambled holdouts to confirm holdout data cannot influence the choice.
  5. Pre-registered ship gate. On every gate holdout: inspection_risk AUC ≥ 0.75 on future OOS-rate top decile; crash_risk AUC ≥ 0.66 on any crash in 12 months; and each index's tie-aware decile calibration (Spearman) ≥ 0.90 on its own label. The composite is deliberately not gated.
  6. Robustness. ±20 % multiplicative jitter on every weight (10 draws) to check the result is not an artefact of the exact weights.

Why "tie-aware" calibration. Most carriers have no reportable crash in 24 months, so 60–70 % of the cohort sits at one tied crash-index value. Equal-count deciles split that point mass into several arbitrary bins whose observed rates differ only by noise, and a plain decile correlation penalizes the index for being zero-inflated rather than for being non-monotone. The tie-aware metric merges consecutive tied deciles into one bin before taking the rank correlation between bin order and observed outcome rate. Values are compared with a 10⁻⁹ tolerance so an exact rational Spearman cannot flip through floating-point rounding.

OriginRoleCohort (carriers)OOS-label nCrash base rateOOS base rate
2024-08-16T1 fit (weights chosen here only)158,125103,49023.3 %10.3 %
2025-02-16T2 gate holdout216,354122,68419.1 %10.5 %
2025-05-16T4 post-selection holdout246,095128,82217.5 %10.0 %
2025-08-16T3 gate holdout273,749133,15415.4 %10.1 %

"OOS-label n" is the subset for which a future 12-month OOS rate is defined (a rate needs inspections in the outcome window). Crash base rates fall at later origins partly because FMCSA crash uploads lag by weeks to months — the T3 and T4 crash labels are lower bounds.

Results (validation run 2026-08-17)

Ship gate — passed

OriginRoleCheckThresholdv0.5Result
2025-02-16gate holdoutinspection_risk AUC, future OOS-rate top decile≥ 0.750.771pass
2025-02-16gate holdoutcrash_risk AUC, any crash in 12 m≥ 0.660.685pass
2025-02-16gate holdoutinspection_risk tie-aware decile Spearman≥ 0.900.976pass
2025-02-16gate holdoutcrash_risk tie-aware decile Spearman≥ 0.900.900pass (at the bar)
2025-08-16gate holdoutinspection_risk AUC, future OOS-rate top decile≥ 0.750.778pass
2025-08-16gate holdoutcrash_risk AUC, any crash in 12 m≥ 0.660.683pass
2025-08-16gate holdoutinspection_risk tie-aware decile Spearman≥ 0.900.988pass
2025-08-16gate holdoutcrash_risk tie-aware decile Spearman≥ 0.901.000pass
2025-05-16post-selection (not gated)inspection_risk AUC, future OOS-rate top decile≥ 0.750.779pass
2025-05-16post-selection (not gated)crash_risk AUC, any crash in 12 m≥ 0.660.682pass
2025-05-16post-selection (not gated)inspection_risk tie-aware decile Spearman≥ 0.900.988pass
2025-05-16post-selection (not gated)crash_risk tie-aware decile Spearman≥ 0.901.000pass

"At the bar": on 2025-02-16 the crash index has 5 merged bins with one adjacent swap between the top two, which is exactly 0.90; T3 and T4 are fully monotone. AUC-ROC 0.5 = no signal, 1.0 = perfect ranking.

Discrimination per index, own label

OriginIndexOwn labelnBase rateAUC-ROCAUC-PRTop-decile liftTie-aware Spearman
2024-08-16 (fit)inspection_riskOOS-rate top decile103,4900.1030.7660.3413.71×0.99
2025-02-16inspection_riskOOS-rate top decile122,6840.1050.7710.3393.58×0.98
2025-05-16inspection_riskOOS-rate top decile128,8220.1000.7790.3413.71×0.99
2025-08-16inspection_riskOOS-rate top decile133,1540.1010.7780.3463.74×0.99
2024-08-16 (fit)crash_riskany crash 12 m158,1250.2330.6900.3691.85×0.80
2025-02-16crash_riskany crash 12 m216,3540.1910.6850.3102.03×0.90
2025-05-16crash_riskany crash 12 m246,0950.1750.6820.2852.13×1.00
2025-08-16crash_riskany crash 12 m273,7490.1540.6830.2582.28×1.00

Secondary crash label (fatal or injury crash in 12 m): crash_risk AUC 0.708 / 0.705 / 0.702 / 0.705 across the four origins, top-decile lift 2.1–2.7×. AUC-PR is read against the base rate. "Top-decile lift" = outcome rate in the riskiest 10 % ÷ population rate.

Calibration: observed outcome rate by index decile (holdouts)

Inspection risk index — share of carriers whose 12-month OOS rate landed in the population's top decile:

Decile2025-02-16 index range2025-02-162025-05-162025-08-16
1 (lowest)17.0–24.62.2 %2.0 %2.2 %
224.6–30.93.1 %2.5 %2.7 %
330.9–38.13.8 %3.6 %3.7 %
438.1–42.63.5 %3.4 %3.2 %
542.6–47.76.4 %5.6 %5.5 %
647.7–53.66.3 %5.8 %5.7 %
753.6–59.28.8 %8.8 %8.6 %
859.2–66.613.2 %12.4 %12.6 %
966.6–76.119.9 %19.0 %18.9 %
10 (highest)76.1–10037.4 %37.1 %37.7 %

Crash risk index — share of carriers with any reportable crash in the next 12 months, tie-aware bins (consecutive deciles at one tied value merged):

OriginBinDeciles mergednIndex value(s)Observed rate
2025-02-1601–6129,81341.7 (tied)11.0 %
2025-02-161721,635from 41.712.5 %
2025-02-162821,636from 74.632.7 %
2025-02-163921,635from 81.540.8 %
2025-02-1641021,635from 87.538.8 %
2025-05-1601–7172,26742.0 (tied)10.1 %
2025-05-161824,609from 42.031.1 %
2025-05-162924,610from 81.535.5 %
2025-05-1631024,609from 87.437.2 %
2025-08-1601–7191,62542.2 (tied)8.9 %
2025-08-161827,375from 42.226.4 %
2025-08-162927,375from 81.330.7 %
2025-08-1631027,374from 87.435.2 %

The tied bin is the zero-crash point mass: carriers with no reportable crash in the prior 24 months all receive the same crash-index base value. Their forward crash rate is roughly a third of the population's top bins.

Discrimination within activity bands (own label)

Band (24 m inspections)n (2025-08-16)inspection_risk AUC 2025-02-162025-08-16crash_risk AUC 2025-02-162025-08-16
3–5129,1500.7390.7360.5810.569
6–1068,3240.7650.7640.6070.593
11–2546,2150.8120.8100.6360.623
26–6018,5500.9080.8810.6910.673
61–1507,6500.9210.9200.7930.745
151+3,8600.9900.9790.9050.844

Both indices improve with more inspection history, as expected of a rate; the small-band crash figures are the weakest numbers in this validation and should be read as such.

Robustness to the exact weights (±20 % jitter, 10 draws)

OriginIndexShipped AUCMinMaxRangeMax |Δ| vs shipped
2025-02-16inspection_risk0.7710.7610.7780.0170.010
2025-02-16crash_risk0.6850.6830.6860.0030.002
2025-05-16inspection_risk0.7790.7700.7860.0160.009
2025-05-16crash_risk0.6820.6800.6830.0030.002
2025-08-16inspection_risk0.7780.7700.7840.0140.008
2025-08-16crash_risk0.6830.6810.6840.0030.002

Free parameters vs cohort size

The transparent score has 5 free parameters: three inspection weights and three crash weights, each set summing to one (4 free), plus one legacy-composite blend weight. Surcharge points are policy constants. Percentile ranks add no parameters. Against a smallest cohort of 158,125 carriers that is more than 31,000 carriers per free parameter — overfitting of the transparent index is structurally negligible; the residual risk is the choice of objective and thresholds, which is why the post-selection holdout exists.

For contrast, a gradient-boosted comparison model (LightGBM, 400 trees, 22 point-in-time features) reaches AUC 0.77 on any-crash and 0.82 on OOS-rate on the same holdouts with tens of thousands of split parameters. It is research-only and is not served: an evidence report has to be traceable point by point.

Leakage and caveats

Read these before quoting any number above. Every figure is an upper bound on live performance until a run on true archived daily snapshots reproduces it.

What the score is not

CarrierScore is a summary of public FMCSA data and computed statistical indicators. It is not a safety fitness determination, is not endorsed by FMCSA, and does not substitute for the carrier's official safety rating or a user's own judgment.

Data: FMCSA/US DOT open-data census, inspection, crash, out-of-service, operating-authority and insurance datasets, archived daily. The full validation report (about 1,200 lines including every decile table, the v0/v0.3/v0.4 history and the learned-model comparison) is generated by the backtest harness; the tables above are rendered from it verbatim. Questions about the methodology: [email protected].