Skip to content

v0.1.0

Release Date: 2025-03-09

Initial release of SHAP-Go, a Go-native implementation of SHAP (SHapley Additive exPlanations) for machine learning model explainability.

Features

Core Framework

  • Explanation Types (explanation/): Core types for representing SHAP explanations with feature attributions, base values, and predictions
  • Model Interface (model/): Generic model interface with FuncModel wrapper for easy integration of any prediction function
  • Masker Package (masker/): Feature masking strategies for SHAP computation
  • IndependentMasker: Assumes feature independence, samples from background distribution
  • Background Dataset (background/): Background dataset management for reference distributions

Explainers

  • PermutationSHAP (explainer/permutation/): Black-box explainer using permutation-based Shapley computation
  • Antithetic sampling for variance reduction
  • Guarantees local accuracy (SHAP values sum to prediction - base value)
  • SamplingSHAP (explainer/sampling/): Monte Carlo approximation for faster estimates
  • Configurable sample count for speed/accuracy tradeoff

Model Integration

  • ONNX Runtime (model/onnx/): Integration with ONNX Runtime for inference
  • Support for ONNX models exported from scikit-learn, XGBoost, LightGBM, PyTorch, etc.

Visualization

  • Render Package (render/): SHAP visualization output formats
  • ChartIR JSON output for integration with visualization tools
  • Support for waterfall, bar, and beeswarm chart types

Utilities

  • Permutation Utilities (internal/rand/): Efficient permutation generation for SHAP computation

Examples

  • examples/linear/: Linear model example demonstrating basic SHAP usage

Installation

go get github.com/plexusone/shap-go@v0.1.0

Quick Start

package main

import (
    "context"
    "fmt"

    "github.com/plexusone/shap-go/background"
    "github.com/plexusone/shap-go/explainer/permutation"
    "github.com/plexusone/shap-go/masker"
    "github.com/plexusone/shap-go/model"
)

func main() {
    // Define a simple model
    predict := func(X [][]float64) []float64 {
        results := make([]float64, len(X))
        for i, x := range X {
            results[i] = 0.5*x[0] + 0.3*x[1] + 0.2*x[2]
        }
        return results
    }

    // Wrap the prediction function
    m := model.NewFuncModel(predict, 3)

    // Create background dataset and masker
    bg := background.New(trainingData)
    msk, _ := masker.NewIndependentMasker(bg.Data())

    // Create explainer
    exp, _ := permutation.New(m, msk)

    // Explain a prediction
    instance := []float64{1.0, 2.0, 3.0}
    explanation, _ := exp.Explain(context.Background(), instance)

    fmt.Printf("SHAP values: %v\n", explanation.Values)
}