pub struct Explanation {
pub id: u64,
pub style: usize,
pub style_name: String,
pub utility: f64,
pub utility_std: f64,
pub mix_utility: f64,
pub responsibility: f64,
pub contributions: Vec<Contribution>,
}Expand description
Why the model scores one candidate the way it does.
Utility is exactly linear within a style lens, so this decomposition
is exact rather than a local surrogate: Σ contribution = utility. No
SHAP, no LIME, no approximation error to caveat.
Fields§
§id: u64Candidate id.
style: usizeAligned index of the lens that claims this candidate.
style_name: StringThat lens’s user-given name ("" if unnamed).
utility: f64Posterior-mean utility under that lens — exactly the sum of the contributions. This is the quantity the decomposition explains.
utility_std: f64Posterior std of that same lens utility — how sure the model is about this score.
mix_utility: f64Posterior-mean mixture utility E[max_k u_k] — the number the
bank is ranked by, and the one to show as the score.
It is not the same number as utility, and it is never smaller: the
ranking takes the max over lenses inside the expectation, while the
decomposition necessarily fixes one lens first. Jensen’s inequality
does the rest. Showing utility next to a bank ordered by
mix_utility would render a systematically lower number beside the
row it is supposed to explain.
responsibility: f64Posterior probability that style really is this candidate’s best
lens. Near 1, utility ≈ mix_utility and the explanation is the whole
story; well below 1, the candidate sits between islands and the gap is
worth surfacing rather than hiding.
contributions: Vec<Contribution>Every feature’s contribution, sorted by descending magnitude.
Trait Implementations§
Source§impl Clone for Explanation
impl Clone for Explanation
Source§fn clone(&self) -> Explanation
fn clone(&self) -> Explanation
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more