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
wordnetcorpus 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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file better_nma-2.0.1.tar.gz.
File metadata
- Download URL: better_nma-2.0.1.tar.gz
- Upload date:
- Size: 38.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
201bba63f9280c4437d3c73cd6732d565b57f8292be30b18e9cace7db5040b9e
|
|
| MD5 |
93c10a7911d31cc95d2341c707ba4bd6
|
|
| BLAKE2b-256 |
1b91c906cd0d9e57d21bebb8915516f70bde7f2911d1c3fa2789c38d6553cfe2
|
File details
Details for the file better_nma-2.0.1-py3-none-any.whl.
File metadata
- Download URL: better_nma-2.0.1-py3-none-any.whl
- Upload date:
- Size: 44.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3d5d279c4f6ab4ad8ec9b5be3999a147def085f9d6f933208c413781a37ea21e
|
|
| MD5 |
7312a8e363747187f0bab80a69e74d3a
|
|
| BLAKE2b-256 |
d17e2214c9439ff164423c684adbbe0b9a7a51645d9701d13c268bc7e5ff8e33
|