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-17Every 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.
Roadside-inspection outcomes relative to peers: violations and out-of-service (OOS) rates per inspection.
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.
Reportable crash history relative to peers, normalized by inspection activity rather than by a fleet-size snapshot.
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.
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.
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.
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.
| Flag | Condition | Surcharge | Applied to |
|---|---|---|---|
| Active out-of-service order | An FMCSA out-of-service order is in force on the scoring date (rescinded orders do not count) | +25 | inspection_risk; legacy composite |
| No active insurance filing | Carrier holds active operating authority but no active insurance filing is on record (MOTUS) | +15 | legacy composite (flag reported on every output) |
| Reincarnation link | High-confidence link (weight ≥ 0.8) to a prior, now-dead carrier identity | +10 | both 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).
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?
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.
| Origin | Role | Cohort (carriers) | OOS-label n | Crash base rate | OOS base rate |
|---|---|---|---|---|---|
| 2024-08-16 | T1 fit (weights chosen here only) | 158,125 | 103,490 | 23.3 % | 10.3 % |
| 2025-02-16 | T2 gate holdout | 216,354 | 122,684 | 19.1 % | 10.5 % |
| 2025-05-16 | T4 post-selection holdout | 246,095 | 128,822 | 17.5 % | 10.0 % |
| 2025-08-16 | T3 gate holdout | 273,749 | 133,154 | 15.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.
| Origin | Role | Check | Threshold | v0.5 | Result |
|---|---|---|---|---|---|
| 2025-02-16 | gate holdout | inspection_risk AUC, future OOS-rate top decile | ≥ 0.75 | 0.771 | pass |
| 2025-02-16 | gate holdout | crash_risk AUC, any crash in 12 m | ≥ 0.66 | 0.685 | pass |
| 2025-02-16 | gate holdout | inspection_risk tie-aware decile Spearman | ≥ 0.90 | 0.976 | pass |
| 2025-02-16 | gate holdout | crash_risk tie-aware decile Spearman | ≥ 0.90 | 0.900 | pass (at the bar) |
| 2025-08-16 | gate holdout | inspection_risk AUC, future OOS-rate top decile | ≥ 0.75 | 0.778 | pass |
| 2025-08-16 | gate holdout | crash_risk AUC, any crash in 12 m | ≥ 0.66 | 0.683 | pass |
| 2025-08-16 | gate holdout | inspection_risk tie-aware decile Spearman | ≥ 0.90 | 0.988 | pass |
| 2025-08-16 | gate holdout | crash_risk tie-aware decile Spearman | ≥ 0.90 | 1.000 | pass |
| 2025-05-16 | post-selection (not gated) | inspection_risk AUC, future OOS-rate top decile | ≥ 0.75 | 0.779 | pass |
| 2025-05-16 | post-selection (not gated) | crash_risk AUC, any crash in 12 m | ≥ 0.66 | 0.682 | pass |
| 2025-05-16 | post-selection (not gated) | inspection_risk tie-aware decile Spearman | ≥ 0.90 | 0.988 | pass |
| 2025-05-16 | post-selection (not gated) | crash_risk tie-aware decile Spearman | ≥ 0.90 | 1.000 | pass |
"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.
| Origin | Index | Own label | n | Base rate | AUC-ROC | AUC-PR | Top-decile lift | Tie-aware Spearman |
|---|---|---|---|---|---|---|---|---|
| 2024-08-16 (fit) | inspection_risk | OOS-rate top decile | 103,490 | 0.103 | 0.766 | 0.341 | 3.71× | 0.99 |
| 2025-02-16 | inspection_risk | OOS-rate top decile | 122,684 | 0.105 | 0.771 | 0.339 | 3.58× | 0.98 |
| 2025-05-16 | inspection_risk | OOS-rate top decile | 128,822 | 0.100 | 0.779 | 0.341 | 3.71× | 0.99 |
| 2025-08-16 | inspection_risk | OOS-rate top decile | 133,154 | 0.101 | 0.778 | 0.346 | 3.74× | 0.99 |
| 2024-08-16 (fit) | crash_risk | any crash 12 m | 158,125 | 0.233 | 0.690 | 0.369 | 1.85× | 0.80 |
| 2025-02-16 | crash_risk | any crash 12 m | 216,354 | 0.191 | 0.685 | 0.310 | 2.03× | 0.90 |
| 2025-05-16 | crash_risk | any crash 12 m | 246,095 | 0.175 | 0.682 | 0.285 | 2.13× | 1.00 |
| 2025-08-16 | crash_risk | any crash 12 m | 273,749 | 0.154 | 0.683 | 0.258 | 2.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.
Inspection risk index — share of carriers whose 12-month OOS rate landed in the population's top decile:
| Decile | 2025-02-16 index range | 2025-02-16 | 2025-05-16 | 2025-08-16 |
|---|---|---|---|---|
| 1 (lowest) | 17.0–24.6 | 2.2 % | 2.0 % | 2.2 % |
| 2 | 24.6–30.9 | 3.1 % | 2.5 % | 2.7 % |
| 3 | 30.9–38.1 | 3.8 % | 3.6 % | 3.7 % |
| 4 | 38.1–42.6 | 3.5 % | 3.4 % | 3.2 % |
| 5 | 42.6–47.7 | 6.4 % | 5.6 % | 5.5 % |
| 6 | 47.7–53.6 | 6.3 % | 5.8 % | 5.7 % |
| 7 | 53.6–59.2 | 8.8 % | 8.8 % | 8.6 % |
| 8 | 59.2–66.6 | 13.2 % | 12.4 % | 12.6 % |
| 9 | 66.6–76.1 | 19.9 % | 19.0 % | 18.9 % |
| 10 (highest) | 76.1–100 | 37.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):
| Origin | Bin | Deciles merged | n | Index value(s) | Observed rate |
|---|---|---|---|---|---|
| 2025-02-16 | 0 | 1–6 | 129,813 | 41.7 (tied) | 11.0 % |
| 2025-02-16 | 1 | 7 | 21,635 | from 41.7 | 12.5 % |
| 2025-02-16 | 2 | 8 | 21,636 | from 74.6 | 32.7 % |
| 2025-02-16 | 3 | 9 | 21,635 | from 81.5 | 40.8 % |
| 2025-02-16 | 4 | 10 | 21,635 | from 87.5 | 38.8 % |
| 2025-05-16 | 0 | 1–7 | 172,267 | 42.0 (tied) | 10.1 % |
| 2025-05-16 | 1 | 8 | 24,609 | from 42.0 | 31.1 % |
| 2025-05-16 | 2 | 9 | 24,610 | from 81.5 | 35.5 % |
| 2025-05-16 | 3 | 10 | 24,609 | from 87.4 | 37.2 % |
| 2025-08-16 | 0 | 1–7 | 191,625 | 42.2 (tied) | 8.9 % |
| 2025-08-16 | 1 | 8 | 27,375 | from 42.2 | 26.4 % |
| 2025-08-16 | 2 | 9 | 27,375 | from 81.3 | 30.7 % |
| 2025-08-16 | 3 | 10 | 27,374 | from 87.4 | 35.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.
| Band (24 m inspections) | n (2025-08-16) | inspection_risk AUC 2025-02-16 | 2025-08-16 | crash_risk AUC 2025-02-16 | 2025-08-16 |
|---|---|---|---|---|---|
| 3–5 | 129,150 | 0.739 | 0.736 | 0.581 | 0.569 |
| 6–10 | 68,324 | 0.765 | 0.764 | 0.607 | 0.593 |
| 11–25 | 46,215 | 0.812 | 0.810 | 0.636 | 0.623 |
| 26–60 | 18,550 | 0.908 | 0.881 | 0.691 | 0.673 |
| 61–150 | 7,650 | 0.921 | 0.920 | 0.793 | 0.745 |
| 151+ | 3,860 | 0.990 | 0.979 | 0.905 | 0.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.
| Origin | Index | Shipped AUC | Min | Max | Range | Max |Δ| vs shipped |
|---|---|---|---|---|---|---|
| 2025-02-16 | inspection_risk | 0.771 | 0.761 | 0.778 | 0.017 | 0.010 |
| 2025-02-16 | crash_risk | 0.685 | 0.683 | 0.686 | 0.003 | 0.002 |
| 2025-05-16 | inspection_risk | 0.779 | 0.770 | 0.786 | 0.016 | 0.009 |
| 2025-05-16 | crash_risk | 0.682 | 0.680 | 0.683 | 0.003 | 0.002 |
| 2025-08-16 | inspection_risk | 0.778 | 0.770 | 0.784 | 0.014 | 0.008 |
| 2025-08-16 | crash_risk | 0.683 | 0.681 | 0.684 | 0.003 | 0.002 |
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.
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.
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].