Meet Nori. The open-source model for structured data.
AI & Machine LearningResearch6 min read

Introducing Nori-Causal: Which Features Drive the Target, and Which Follow It

By

Nori-Causal reads a table and, in a single forward pass, gives every feature a probability of being a cause or an effect of the target. Case studies on credit default and diabetes.

#Causal Discovery#Interpretability#Tabular Data#Foundation Models#Nori
A table with feature columns x1 to x7 and a target column y flows into Nori-Causal, which builds a causal graph around y: solid arrows from its causes, a gray arrow to an effect and dashed arrows for weak relations.

The Problem

Feature importance tells you what a model relies on. It does not tell you which way the dependence runs. A feature can be important because it drives the target, or because the target drives it. For prediction, the difference does not matter. For decisions, it is everything: changing a cause changes the outcome, while changing an effect changes nothing.

To a predictive model, the two look the same. Only the direction tells you which one to act on:

Animation: missed payments, high credit utilization, collection calls and a credit score drop all predict default; arrows then show the first two as causes and the last two as effects; reducing missed payments lowers the risk of default, while stopping the collection calls leaves it unchanged
Figure 1 — Predictive is not causal. All four features predict default, but acting on a cause changes the risk of default, while acting on an effect does not. An illustrative example.

Fundamental Issues

  • No real datasets to learn from. Real tables never come with their true causal graph. The experiments that would reveal it are slow, expensive, or unethical, so there is no real data to train or check a causal model on.
  • Proxies look like drivers. A feature recorded after the outcome can top the importance ranking, and acting on it does nothing.
  • Causal discovery is slow and fragile. Classic methods search or fit a new model for every dataset, rely on strong assumptions, and slow down quickly as tables get wider.

Our Solution: Nori-Causal

How does Nori-Causal work?

Nori-Causal takes a table, with the target as one of its columns, and returns, for every feature, the probability that it is a direct cause of the target and the probability that it is a direct effect. It also scores every pair of features, giving a full map of the table's likely causal structure. There is no per-dataset search or fitting: the answer comes back in a single forward pass.

Animation: a table enters Nori-Causal and a graph grows around the target, one labeled arrow at a time
Figure 2 — One table in, causes and effects out. Each arrow shows a feature's more probable direction, labeled with its probability. Solid arrows are at or above 0.5; dashed ones are weaker, so their direction is unreliable.

How do we train it?

We use the same synthetic data engine that trains Nori. Every synthetic table is generated from a causal graph that we chose, so for every table we know exactly which columns cause which. Nori-Causal sees millions of these tables, each with its own graph, mechanisms, noise and size, and learns to read the graph back from the data. It never sees the real datasets it is evaluated on.

Animation: a random causal graph generates a synthetic table; with the graph hidden, Nori-Causal predicts each feature's probability of being a cause or an effect of y, the predictions are checked against the true graph, and the training loss falls over successive tables
Figure 3 — Learning from tables whose answers we know. Each synthetic table comes from a new random graph. Nori-Causal sees only the table, predicts P(cause) and P(effect) for every feature, and is checked against the true causes and effects. Over many tables, its mistakes and its loss go down.

Case Studies

Credit Default

The UCI Credit Default table covers 30,000 card holders: their credit limit, demographics, and six months of repayment status, bills and payments. The target is whether they defaulted the next month, coded as 1 for default and 0 otherwise.

Graph with default in the center: solid arrows from repayment status now (1.00), two months ago (0.88), three months ago (0.83), one month ago (0.79) and four months ago (0.74); dashed arrows below 0.5 from sex, five months ago, age, the amount paid two months ago, and marriage
Figure 4 — The ten strongest relations to default. "now", "−1m" … "−5m": repayment status this month and one to five months earlier; "paid": the amount paid two months earlier. Repayment history drives default: the latest status at 1.00, and the months before it between 0.74 and 0.88. Demographics stay below 0.5.

In the glass-box post, the latest repayment status carried most of Nori's predictive signal. Nori-Causal now adds the direction: repayment history is a cause of default, not a consequence of it, which is what a lender needs to know before acting on it. Sex, age and marriage stay below 0.5 in both directions, so Nori-Causal does not treat them as drivers.

Healthcare

The diabetes table follows 442 patients. Ten measurements are taken at baseline: age, sex, BMI, blood pressure and six blood tests. The target is how far the disease has progressed one year later.

Graph with progression in the center: solid arrows from triglycerides (0.78) and BMI (0.60); dashed arrows below 0.5 for the other eight measurements
Figure 5 — Causes and effects of disease progression. "BP": blood pressure; "TC": total cholesterol. Triglycerides (0.78) and BMI (0.60) are the likely drivers; every other measurement is below 0.5 in both directions.

Triglycerides and BMI are also the two strongest known predictors in this dataset, and both are plausible drivers of diabetes progression. Nori-Causal names them as causes and does not commit to anything else. The dashed arrows carry a lesson too. Age, sex and blood pressure lean slightly toward being effects of progression, which cannot be right: they were measured a year before the outcome. Nori-Causal sees only the numbers, not what the columns mean or when they were recorded, which is why weak relations are drawn dashed and why the scores are evidence to check, not conclusions.

Try Nori-Causal

Nori-Causal runs inside NoriInterpreter, next to the glass-box workflow:

Python
1from synthefy_nori.interpretability import NoriInterpreter
2
3interp = NoriInterpreter(causal=True).fit(X, y)
4interp.causal_ranking_       # per feature: p_cause, p_effect, importance
5interp.plot_causal_graph()   # the target-centered graph shown above

For a yes/no target such as default, pass it as 0/1 with task="regression". The weights download from the Hugging Face Hub on first use.

Grab the code, weights, and docs:

Point Nori-Causal at the dataset you're working on right now and see what drives your target. If you build something interesting, tell us on Discord or at insights@synthefy.com.

What It Can't Do Yet

  • It gives probabilities, not a final graph. Turning scores into a decided set of causes is the next step.
  • It reads numbers, not meaning. Column names such as "age" or "sex" already rule out some directions. Bringing that knowledge in with a language model is next on our list.
  • It works with continuous and 0/1 targets. Targets with several unordered classes are not supported yet.

Want to try Nori on your own data? Contact us or email insights@synthefy.com, and we'll help you get set up.