Skip to content

Commit fc83cf5

Browse files
authored
Fix cross-validation class counts (#32)
1 parent bbfab3b commit fc83cf5

2 files changed

Lines changed: 35 additions & 2 deletions

File tree

llm_fingerprinter/classifier.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -610,8 +610,8 @@ def cross_validate(self, X: np.ndarray, y: np.ndarray, n_folds: int = 5):
610610
from sklearn.model_selection import StratifiedKFold
611611
from sklearn.metrics import precision_recall_fscore_support, confusion_matrix
612612

613-
unique_classes = np.unique(y)
614-
actual_folds = min(n_folds, min(np.bincount(y.astype(int))))
613+
_, class_counts = np.unique(y, return_counts=True)
614+
actual_folds = min(n_folds, int(class_counts.min()))
615615
if actual_folds < 2:
616616
logger.warning("Not enough samples per class for cross-validation")
617617
return None
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import numpy as np
2+
3+
from llm_fingerprinter.classifier import EnsembleClassifier
4+
5+
6+
def test_cross_validate_ignores_configured_classes_without_samples(monkeypatch):
7+
classifier = EnsembleClassifier(
8+
model_families={"alpha": 0, "missing": 1, "beta": 2},
9+
augment_data=False,
10+
)
11+
X = np.array(
12+
[[0.0], [0.1], [0.2], [1.0], [1.1], [1.2]],
13+
dtype=np.float32,
14+
)
15+
y = np.array([0, 0, 0, 2, 2, 2])
16+
17+
monkeypatch.setattr(EnsembleClassifier, "train", lambda self, X, y: True)
18+
monkeypatch.setattr(
19+
EnsembleClassifier,
20+
"predict_with_confidence",
21+
lambda self, fingerprint: (
22+
"alpha" if fingerprint[0] < 0.5 else "beta",
23+
1.0,
24+
{},
25+
{},
26+
),
27+
)
28+
29+
results = classifier.cross_validate(X, y, n_folds=5)
30+
31+
assert results is not None
32+
assert results["n_folds"] == 3
33+
assert results["mean_accuracy"] == 1.0

0 commit comments

Comments
 (0)