shap-rs 0.1.0

Native Rust implementations of model-agnostic, linear, and TreeSHAP explainers
Documentation
use crate::{Explanation, Result, ShapError};
#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)]
pub struct ForceData {
    pub base_value: f64,
    pub output_value: f64,
    pub contributions: Vec<f64>,
}
pub fn data(e: &Explanation, sample: usize, output: usize) -> Result<ForceData> {
    if sample >= e.n_samples() {
        return Err(ShapError::InvalidSampleIndex {
            index: sample,
            n_samples: e.n_samples(),
        });
    }
    if output >= e.n_outputs() {
        return Err(ShapError::InvalidOutputIndex {
            index: output,
            n_outputs: e.n_outputs(),
        });
    }
    let contributions = (0..e.n_features())
        .map(|j| e.values()[[sample, j, output]])
        .collect::<Vec<_>>();
    Ok(ForceData {
        base_value: e.base_values()[[sample, output]],
        output_value: e.base_values()[[sample, output]] + contributions.iter().sum::<f64>(),
        contributions,
    })
}