Examples · Plots

decision_drivers

Population view: which features drive decisions across many rows.

Code#

decision_drivers.py
import matplotlib.pyplot as plt
 
from _setup import X_test, artifact, y_test
 
from compileml.runtime import decide
from compileml.viz import decision_drivers
 
# Explain everything. A few milliseconds each is real-time for credit
# decisioning, and a fully explained book turns portfolio questions into
# census facts instead of sample estimates.
sample = X_test[:1500]
decisions = [decide(artifact, r.tolist(), include_contributions=True) for r in sample]
 
fig, ax = decision_drivers(decisions, y=y_test[:1500], top_codes=10)
fig.savefig("../../public/examples/decision_drivers.png", dpi=120, bbox_inches="tight")
plt.close(fig)
 
print(f"explained {len(decisions)} decisions")
print()
counts = {}
for decision in decisions:
for reason in decision["reasons_negative"]:
counts[reason["code"]] = counts.get(reason["code"], 0) + 1
 
print("most frequent adverse codes:")
for code, count in sorted(counts.items(), key=lambda kv: -kv[1])[:5]:
print(f" {count:>4} {code}")

Output#

Captured from an actual run against compileml 0.9.0 and the UCI credit panel. If this script stops working, the build fails.

captured in CIdecision_drivers.py
explained 1500 decisions
 
most frequent adverse codes:
565 AMOUNT_PAID_M3
528 AMOUNT_PAID_M4
527 AMOUNT_PAID_M2
495 AMOUNT_PAID_M1
485 STATEMENT_BALANCE_M1

Figure#

Output of the decision_drivers example

Rendered by the run above, from the decision payload rather than a recomputation.

API reference: decision_drivers →