Skip to main content

NMA: Dendrogram-based model analysis, white-box testing, and adversarial detection

Project description


NMA – Near Misses Analysis

NMA (Near Misses Analysis) is a Python package for analyzing machine learning models through dendrogram-based hierarchical clustering, white-box testing, and adversarial attack detection.

It provides visualization, explanation, and diagnostic tools to help developers and researchers understand their models’ decision boundaries, identify vulnerabilities, and detect adversarial inputs.


✨ Features

  • 📊 Dendrogram construction & visualization

    • Build hierarchical trees from model predictions.
    • Plot full dendrograms or sub-dendrograms for specific labels.
  • 🌳 Concept Tree Generation & Plotting

    • Extract semantic WordNet concept hierarchies from dendrograms.
    • Generic fallback support: custom dictionaries or auto WordNet search.
    • Publication-ready colored concept tree visualization.
  • 🧪 White-box testing

    • Identify problematic training samples likely to cause misclassification.
    • Run structured analysis across source/target label pairs.
  • 🛡 Adversarial attack detection

    • Train a logistic regression adversarial detector.
    • Detect adversarial images and compute adversarial scores.
  • 🔎 Model querying & explanations

    • Query images for predictions with hierarchical context.
    • Generate verbal explanations of model predictions.
  • 🧩 Cluster analysis tools

    • Find lowest common ancestors (LCA) in the dendrogram.
    • Rename clusters for more meaningful interpretation.

📦 Installation

pip install BETTER_NMA

🚀 Quickstart

from BETTER_NMA import NMA
import numpy as np

# Example data (replace with your dataset/model)
x_train = np.random.rand(100, 32, 32, 3)
y_train = np.random.randint(0, 2, size=100)
labels = ["cat", "dog"]

# Your pre-trained model (e.g., Keras, PyTorch wrapper with predict)
model = my_model  

# Initialize NMA
nma = NMA(
    x_train=x_train,
    y_train=y_train,
    labels=labels,
    model=model,
    explanation_method="similarity", 
    save_connections=True
)

# Plot dendrogram
nma.plot(title="Model Decision Hierarchy")

# Run white-box testing
issues = nma.white_box_testing(["cat"], ["dog"], analyze_results=True)

# Train adversarial detector
nma.train_adversarial_detector(authentic_images, adversarial_images)

# Detect if a new image is adversarial
result = nma.detect_attack(test_image)

# Get verbal explanation of an image
explanation = nma.verbal_explanation(test_image)
print(explanation)

# Build a semantic Concept Tree using WordNet
# Defaults to built-in ImageNet mapping, or fallback text-search if no mapping match
concept_tree = nma.build_concept_tree()

# Plot the resolved Concept Tree
nma.plot_concept_tree(concept_tree, title="Decision Concept Tree")

📚 API Overview

Dendrogram & Visualization

  • plot(sub_labels=None, ...) – plot full or partial dendrogram.
  • plot_sub_dendrogram(sub_labels, ...) – zoom into specific classes.
  • build_concept_tree(custom_mapping=None, allowed_labels=None) – build resolved Concept Tree.
  • plot_concept_tree(concept_tree, title=...) – plot colored multi-branch concept hierarchy.

White-box Testing

  • white_box_testing(source_labels, target_labels, ...) – find problematic images.
  • get_white_box_analysis(source_labels, target_labels, ...) – detailed analysis.

Adversarial Detection

  • train_adversarial_detector(authentic_images, attacked_images) – train detector.
  • detect_attack(image, plot_result=False) – detect adversarial samples using logistic regression detector.
  • detect_attack_by_threshold(image, threshold=0.35, ...) – detect adversarial samples using a specific LCA score threshold.
  • adversarial_score(image, top_k=5) – compute adversarial score.

Query & Explanation

  • query_image(image, top_k=5) – get predictions & explanation.
  • verbal_explanation(image) – generate natural language explanation.

Cluster Analysis

  • find_lca(label1, label2) – lowest common ancestor.
  • change_cluster_name(cluster_id, new_name) – rename clusters.

🌳 Concept Tree Guide

The Concept Tree feature maps your model's classification hierarchy into a human-understandable WordNet semantic tree by resolving intermediate clusters.

Custom database / label-to-synset mappings

If you are working with a custom dataset or custom labels, you can pass a custom dictionary mapping class labels to WordNet synset IDs:

# Custom mapping: key is label, value is ImageNet/WordNet synset ID (n + 8 digits)
custom_map = {
    "cat": "n02121808",
    "dog": "n02084071",
    "apple": "n07739125",
}

# Build the tree using your custom mapping
concept_tree = nma.build_concept_tree(custom_mapping=custom_map)
nma.plot_concept_tree(concept_tree)

If no mapping is provided, NMA will use the default 41-class ImageNet mapping. If a class label doesn't match any mapping, NMA automatically falls back to searching WordNet directly using the label name or sub-words.


🛠 Requirements

  • Python ≥ 3.8
  • NumPy, Pandas, Matplotlib, Scikit-learn, SciPy
  • NLTK (requires wordnet corpus downloaded: nltk.download('wordnet'))
  • (Optional) PyTorch / TensorFlow for model support

📖 Use Cases

  • Research – interpret model predictions via hierarchical clustering.
  • Robustness testing – identify adversarial vulnerabilities.
  • Explainability – provide visual + verbal explanations.
  • Debugging – detect mislabeled or problematic training samples.

📜 License

MIT License – free to use and modify.


Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

better_nma-2.0.2.tar.gz (58.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

better_nma-2.0.2-py3-none-any.whl (70.1 kB view details)

Uploaded Python 3

File details

Details for the file better_nma-2.0.2.tar.gz.

File metadata

  • Download URL: better_nma-2.0.2.tar.gz
  • Upload date:
  • Size: 58.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.12

File hashes

Hashes for better_nma-2.0.2.tar.gz
Algorithm Hash digest
SHA256 c6ba05eab5397e72d6233080fa3607c65ed2626a42977ef8778f8e17accf3ec2
MD5 deb5f030882df42ddd6642b752bea1f7
BLAKE2b-256 ad7b316f159870777eb1e124c02c91fdf38fe99cb472770bedb51682db959343

See more details on using hashes here.

File details

Details for the file better_nma-2.0.2-py3-none-any.whl.

File metadata

  • Download URL: better_nma-2.0.2-py3-none-any.whl
  • Upload date:
  • Size: 70.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.12

File hashes

Hashes for better_nma-2.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 1c6d68b610fc25bad67948a9c85fca5c4064aa5be122947c5653204f381ddc06
MD5 5c0fa1d7fa13129a6c4be12ea8d70a8e
BLAKE2b-256 ff92f59907912078cf87e0424a91c1464f92879884ba8b0dd73258c86e228e29

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page