Coro Blog

Automated Industry Classification at Scale

Written by Alexandra Kutanina | Sep 21, 2026, 6:40:59 PM

With contributions from Thierry Depeyrot and Max Malcari 

 

CORO - HELIX

A lightweight, custom multi-tagging transformer model that reads a company description and assigns the correct 6-digit NAICS, 4-digit NACE, and Bain PE (Level-4) taxonomy codes, to be applied to millions of companies, in any language, in a matter of hours.

Executive summary. Coro is Bain's commercial excellence group focused on software, data, and analytics solutions for B2B; Helix, one of its core data assets, is a continuously maintained database of millions of companies worldwide. Every company in Helix - and in the company datasets behind Coro's other offerings - needs a standardized industry classification. This paper describes the Coro Classifier, the foundational model that assigns those codes. Manual coding at this scale is not viable. Existing LLM approaches are prohibitively expensive at this scale and take weeks or longer. We built a lightweight, custom multi-tagging transformer model that reads a company description and assigns the correct 6-digit NAICS, 4-digit NACE, and Bain PE (Level-4) taxonomy codes, to be applied to millions of companies, in any language, in a matter of hours. The model chunks the description into a sequence of embeddings, and can tag multiple potentially applicable codes per description. The model achieves >90% estimated accuracy, with a true hard-error rate of 5-7% tested on real-world held-out data (n=5,000). By comparison, standard and commercial industry codes are far noisier - independent analyses find them disagreeing for more than a third of companies even at coarse levels - so accurate tagging at this granularity is a meaningful improvement over what exists. The model supports any input language, and deploys as a lightweight offline package that can run on both GPU or CPU instances. With this new custom transformer, we can accurately tag companies to multiple industries at the lowest level at high speed and low cost, which allows for other downstream models such as market sizing to be enhanced.

Key terms

Helix. Bain's proprietary company data asset - a continuously maintained database of millions of companies worldwide.

Bain PE taxonomy (Level-4). The proprietary industry classification used by Bain's private equity (PE) practice; "Level-4" is its most granular tier.

NAICS. North American Industry Classification System - the standard U.S./Canada/Mexico government taxonomy; six digits at its most detailed level.

NACE. The European Union's equivalent standard classification; four digits at its most detailed level.

Coro. Bain's commercial excellence group focused on software, data, and analytics solutions for B2B.

The problem

Why classify millions of companies?

Helix is Bain's proprietary company data asset - a continuously maintained database of millions of companies worldwide. Its value comes from what sits on top of it: market sizing, sector scans, opportunity sizing, competitive benchmarking, peer-set construction, target screening and deal sourcing in M&A and private-equity diligence, and white-space and adjacency analysis.

Almost every one of those analyses begins the same way - by grouping companies into comparable segments. You cannot size a market, build a peer set, or scan a sector without first deciding which companies belong to it. Industry classification is the operation that creates those groups, which makes it the foundation the rest of the asset's value rests on. If the tag is wrong, the segment is wrong, and the market size, peer comparison, or opportunity estimate built on top inherits the error. Accurate, granular, multi-industry tagging is therefore critical for any downstream task.

Why it is hard

The NAICS taxonomy alone contains over 1,000 six-digit codes. Assigning the right one requires reading a company's description, understanding what it actually does, and navigating subtle distinctions: "Dairy Product Manufacturing" (311511) vs. "Dairy Cattle and Milk Production" (112120) - one processes milk into yogurt, the other raises cows. The same fine-grained boundaries run throughout the Bain PE and NACE taxonomies. Many real companies also span several industries at once, so a single best-guess label is often wrong by construction.

Existing sources fall short

It would be convenient to simply inherit industry tags from third-party providers. In practice they make mistakes, disagree with one another, and frequently omit valid industries - and the problem gets dramatically worse at the granular levels that actually drive analysis.

A widely cited academic comparison of two major data providers' SIC codes (Kahle & Walkling) found that over 36% of the classifications disagree at the coarse two-digit level, and nearly 80% disagree at the four-digit level.1 Even national statistical agencies, working from official business registers, estimate error rates of roughly 8-12% at the most detailed level.2 And data users relying on commercial business data have reported usable industry accuracy as low as 25% from incumbent providers.3 In short, depending on source and granularity, error and disagreement rates commonly run from roughly a third at the coarse two-digit level to more than 50% at the fine-grained levels Helix needs.

The solution

The solution consists of two parts: 1) acquiring reliable training data, 2) the machine learning model to solve the multi-tagging problem.

The first part of the solution rests on the idea that while LLMs are too costly and slow to perform the full prediction, they can be used to generate synthetic data for training custom lightweight text-based models. Here, we utilized this approach in order to create a custom database of synthetic company descriptions which had between 1 and 3 sectors tagged at random. In total, nearly 3 million synthetic company descriptions were created spanning the whole taxonomy.

For the second part, we built a purpose-built machine-learning system - the Coro Classifier - that reads a free-text company description and predicts codes for three taxonomies (NAICS, NACE, Bain PE). It is a custom transformer architecture trained from scratch on these synthetically generated, labeled examples and optimized specifically for this task.

Description
free text, any language
Sentence split & Chunking
segment into short text chunks
Embedding
vector per chunk
Sector model
NAICS: 24 / NACE: 21 / Bain PE: 10
Lowest-level models
6-digit / 4-digit / Bain PE L4

A description enters as free text. It is split into sentences and subsequently chunked into shorter segments. The sequence of chunks is converted into a sequence of vectors by an embedding model. A two-stage classifier then predicts the broad industry sectors on the highest level, then the specific lowest-level codes within each predicted sector by the next layer of transformers. Each broad sector has a specific transformer to subsequently tag the lowest level codes.

Under the hood, each transformer consists of several encoder layers (multi-head attention followed by MLP), with a final label-wise attention pooling to produce the predictions. The model is implemented using PyTorch on the GPU. The end result: predicted labels for the taxonomy plus a per-label confidence score.

>90%Classification accuracy   MillionsCompanies at scale   MinimalMarginal cost per company   MillionsManual analyst-hours
~3MTraining examples   3Taxonomies supported   1,000+NAICS codes covered   15.5MParameters per transformer

In practice, the model replaces what would take roughly millions of analyst-hours of manual work with a pipeline that runs in hours. Once embeddings are computed, classification of the full population - millions of records - is computationally free - no API calls, no per-query cost, no rate limits. (Embeddings themselves are a one-time API cost, incurred once per unique description.)

Results

The model was evaluated on a held-out benchmark of 5,000 real companies spanning all major sectors. Estimated accuracy is approximately 90% (as there are no ground-truth labels, we used LLMs to judge if the tagged labels were correct). We retrain continuously, folding in new contrastive examples whenever a systematic error is identified.

The following examples show how the model's predictions evolved across six retraining iterations and two inference-level fixes. The "early model" column shows what the baseline version predicted before any improvements; the "current model" column shows what the production classifier now returns for the same description:

Company Description Early model (before) Current model (after)
Shrimp Basket Restaurant chain founded in Alabama. Agriculture - Shellfish Fishing Accommodation & Food Services
Doga Schools "Operates a chain of private schools in Turkey." Agriculture - Turkey Production Educational Services
Junlebao "One of the largest dairy companies in China, offering infant milk powder, yogurt, and liquid milk." Agriculture - Dairy Cattle Farming Food Manufacturing
Surrey Bancorp "Operates as a bank holding company for Surrey Bank, providing commercial and consumer banking services." Management of Companies Finance and Insurance

Each early error followed the same pattern: the baseline model latched onto a surface keyword - "shrimp," "Turkey," "dairy" - instead of reading the full sentence. Through six retraining iterations with targeted contrastive data and a permutation ensembling approach at inference time, the current model now correctly reads full context: "operates a chain of restaurants" overrides "shrimp," and "operates schools in Turkey" is understood as Turkey the country, not turkey the bird.

These improvements are reflected in the metrics across the six iterations:

Metric Value
Estimated true accuracy ~90%
Holding-company over-classification 78% of such errors eliminated
Agriculture / food confusion 56% of such errors eliminated
Government-adjacent false positives 43% of such errors eliminated

Roughly half of the remaining ~10% disagreement is genuine boundary cases - companies with vague or very short descriptions where human analysts would also struggle to perform an accurate classification. The true hard-error rate is estimated at 5-7%.

How the Coro Classifier compares to commercial vendors

We benchmarked the Coro Classifier head-to-head against three major commercial data sources, anonymized here as Vendor Z, Vendor D, and Vendor C. For each, an independent large language model classified every company from its description to serve as a neutral ground truth; the vendor's own industry code and the Classifier's prediction were then scored against it on the identical companies, at the broad-sector level.

Metric vs. Vendor Z vs. Vendor C vs. Vendor D
Coro Classifier accuracy 89% 90% 81%
Vendor accuracy 62% 76% 81%
Disagreements won by the Classifier 91% 84% 51%
Vendor coverage (Classifier: 100%) ~100% 87% 89%

Read either way, the Classifier holds up. It equals or beats every vendor on accuracy, wins the head-to-head against Vendor Z and Vendor C (favored on 91% and 84% of the companies where they disagree), and draws level with Vendor D, the strongest human-coded source, at 51%. Accuracy is measured on each vendor's own descriptions: Vendor D's business listings average around 23 characters, so both the Classifier and Vendor D have little to work with and both land at 81%, while on Vendor Z's and Vendor C's fuller text the Classifier reaches ~90% - in line with its held-out benchmark. Coverage is not the differentiator either: measured among companies that carry a description - the population a description-based classifier runs on - all three code most companies (Vendor Z essentially all, Vendor D ~89%, Vendor C ~87%), and part of the Classifier's head-to-head margin reflects the records Vendor C and Vendor D leave uncoded. The Classifier's real edge is reading the company's own description - across the full population, at near-zero cost.

The net. The Coro Classifier beats Vendor Z and Vendor C head-to-head and matches Vendor D, the strongest human-coded source - while uniquely combining full coverage, lowest-level granularity, multi-industry tagging, and near-zero marginal cost. No commercial vendor offers that combination.

A few real examples from the benchmark, where the vendor's code was wrong and the Coro Classifier was right - several of them cases the model gets right simply by reading what the company actually does:

Company What it does Vendor's label Coro Classifier (correct)
Veriah Designs and builds mobile apps and websites Manufacturing
via Vendor Z
Professional Services (software)
Amp Telecom Cloud telephone and VoIP service Admin / Support
via Vendor Z
Information (telecommunications)
Gert Van De Merwe Couture designer of wedding dresses and evening wear Accommodation & Food
via Vendor Z
Apparel Manufacturing
TC McClure Logging Logging operator Manufacturing
via Vendor D
Agriculture & Forestry
Palemo Holdings Holding company Finance
via Vendor D
Management of Companies (holding co.)

The pattern is consistent: Vendor Z's templated descriptions push companies into the wrong sector (a wedding-dress designer tagged as accommodation & food), while Vendor D's older SIC codes map imperfectly onto modern industries (logging classed as manufacturing rather than forestry). The Coro Classifier reads the company's actual description and lands on the right - and more granular - answer.

What makes it different

Processing a sequence of embeddings

Most classifiers embed an entire description as a single vector, losing internal structure. The Coro Classifier embeds each chunk of each sentence independently, then processes the full sequence through self-attention layers. The model learns which sentences carry classification signal and which are boilerplate.

Why this matters. "Founded in 1962. Headquartered in Irvine, California. Owns, operates, and franchises a chain of Mexican-inspired quick-service restaurants." Only the final part of the description determines the industry. Chunk-level attention focuses on that part of the sentence and down-weights the rest.

Hierarchical two-stage prediction

The model classifies in two stages: first the broad sector (24 heads for NAICS), then the specific code within that sector. This mirrors how a human analyst thinks - "this is a restaurant" before "limited-service or full-service?" - and avoids forcing one head to discriminate among 1,000+ codes simultaneously. The sector stage is multi-label, so a company spanning several sectors is routed to each relevant level-4 head.

Common questions

If a company spans several industries, does it get multiple tags? Yes. The model is multi-tagging by design. When a company genuinely operates across more than one industry, it returns every applicable code - across all three taxonomies - each with its own confidence score, rather than forcing a single best-guess label.

Can it do quick custom runs when none of the existing codes fit precisely enough? Not currently. The classifier predicts into the three fixed, pre-trained taxonomies (NAICS, NACE, Bain PE). It does not support ad-hoc or bespoke one-off runs against a novel coding scheme; supporting a new taxonomy requires generating training data and training a new set of classification heads.

Together, these design choices raise a natural question: why build a custom model at all, rather than using human analysts or an off-the-shelf LLM?

Why this approach

vs. manual classification

Scale. Classifying millions of companies manually at 2-3 minutes each would run to millions of analyst-hours of work. After the embedding stage, the classification model does it in hours.

Consistency. Human analysts often disagree with one another at the 6-digit level. The classifier produces identical results for identical inputs, every time; permutation ensembling can be employed to further stabilize the output.

Debuggability. A human's misclassifications are idiosyncratic and invisible at scale. The model's are systematic - a keyword pattern, a description format - so every error can be diagnosed once and fixed across the entire population by introducing new synthetic samples (this is precisely what the contrastive datasets do).

The practical comparison. A human analyst classifying 500 companies reaches 90-95% accuracy in 15-25 hours. The model matches that accuracy in under a minute - and its errors are systematic and fixable, where the human's are not.

vs. a large language model

Large language models can classify companies with reasonable accuracy when prompted. For this workload, a custom model is the right architecture:

  LLM (e.g. GPT-4) Coro Classifier
Cost at millions scale Prohibitive in API spend Negligible marginal cost (local, post-embedding)
Speed Weeks to months (rate-limited) Hours
Determinism Non-deterministic Fully deterministic
Custom taxonomies Prompt engineering per taxonomy Load a different weight file
Updatability Provider-dependent; limited control Add training data, retrain in hours
Deployment Requires API access and internet Runs offline; megabyte-scale weights

What this costs at scale. The price gap is the clearest argument for a custom model. Classifying a million companies with the Coro Classifier runs on a one-time embedding pass, after which inference is offline and unlimited at no marginal cost. Sending the same million companies through a frontier LLM (GPT-4-class or Claude) would carry a substantial and recurring API bill, orders of magnitude higher, and take weeks under rate limits rather than hours.

Cost comparison is directional, based on typical description lengths and current frontier-model list pricing; larger models are materially more expensive again. The Classifier's only cost is the one-time embedding pass; classification itself adds none.

The custom model trades the generality of an LLM for the specificity, speed, cost, and control that a production workload of millions of records demands. Of course, a custom model is only as good as its training data - which brings us to how we built ours.

How we train it

Because no accurate, complete, large-scale ground-truth dataset exists, the training data is generated synthetically with an LLM and curated specifically for this task.

How descriptions are generated

A dedicated generator per taxonomy prompts a large language model with taxonomy codes and their official definitions, used as grounding only, and asks for realistic, varied company descriptions for that code.

Realistic label structure

Generating descriptions is only half the challenge - the labels need to be realistic too. Rather than one code per company, the generators mix label cardinality (configurable defaults: approximately 75% single-label, 18% two-label, 7% three-label) to reflect real companies that genuinely span industries. When multiple codes are combined, they are sampled toward plausible combinations - mostly taxonomically adjacent (shared prefix), occasionally same-sector, rarely cross-sector - so the model learns realistic co-occurrence rather than random pairs.

Contrastive "vocabulary-mirroring" data

Even with realistic labels, the model can still latch onto surface keywords rather than meaning. To address this, a specialized generator targets known failure modes. Its core principle: reuse a near-identical trap sentence across different codes, forcing the model to rely on operating context (what the company does, for whom, through what channel) rather than surface vocabulary. Targeted failure clusters include keyword traps (dairy / shrimp / turkey / coffee), software vs. manufacturing verb collisions, holding-company over-classification, the "distributes" verb (wholesale vs. trucking vs. warehousing), clinical/research boundaries, and bank-holding vs. commercial banking. These contrastive batches are version-controlled, each round adding scenarios to fix the errors observed in the previous model.

Scope. Generation is currently English-language; multilingual inference is enabled by the multilingual embedding space, not by multilingual training text.

Sources.
1. Kahle, K. M. & Walkling, R. A. (1996), "The Impact of Industry Classifications on Financial Research," Journal of Financial and Quantitative Analysis 31(3): 309-335 - SIC-code disagreement between Compustat and CRSP across ~10,000 large US public firms.
2. UK Office for National Statistics - assessment of Standard Industrial Classification (SIC) coding accuracy on the official business register.
3. Enigma, "Introducing Industry Classification Data" - 25-40% accuracy range reported by financial institutions in interviews (vendor source).

This document describes the Coro Classifier (the industry classification model) as of June 2026.
The information contained herein is proprietary and confidential to Bain & Company.